diff --git a/.backportrc.json b/.backportrc.json index c5644d6899654..4ce48c3b28765 100644 --- a/.backportrc.json +++ b/.backportrc.json @@ -2,6 +2,7 @@ "upstream": "elastic/kibana", "targetBranchChoices": [ { "name": "master", "checked": true }, + "8.0", "7.16", "7.15", "7.14", @@ -32,7 +33,7 @@ ], "targetPRLabels": ["backport"], "branchLabelMapping": { - "^v8.0.0$": "master", + "^v8.1.0$": "master", "^v(\\d+).(\\d+).\\d+$": "$1.$2" } } \ No newline at end of file diff --git a/.bazelrc b/.bazelrc index 91c4870ebd126..9278352e686ef 100644 --- a/.bazelrc +++ b/.bazelrc @@ -3,12 +3,12 @@ import %workspace%/.bazelrc.common # Remote cache settings for local env -build --remote_cache=grpcs://cloud.buildbuddy.io -build --incompatible_remote_results_ignore_disk=true -build --noremote_upload_local_results -build --remote_timeout=30 -build --remote_header=x-buildbuddy-api-key=3EYk49W2NefOx2n3yMze -build --remote_accept_cached=true +# build --remote_cache=grpcs://cloud.buildbuddy.io +# build --incompatible_remote_results_ignore_disk=true +# build --noremote_upload_local_results +# build --remote_timeout=30 +# build --remote_header=x-buildbuddy-api-key=3EYk49W2NefOx2n3yMze +# build --remote_accept_cached=true # Enable this in case you want to share your build info # build --build_metadata=VISIBILITY=PUBLIC diff --git a/.buildkite/pipelines/flaky_tests/pipeline.js b/.buildkite/pipelines/flaky_tests/pipeline.js index 1d390ed0d1b63..5f3633860dfe3 100644 --- a/.buildkite/pipelines/flaky_tests/pipeline.js +++ b/.buildkite/pipelines/flaky_tests/pipeline.js @@ -17,12 +17,6 @@ const inputs = [ default: 0, required: true, }, - { - key: 'ftsr-concurrency', - text: 'Max concurrency per step', - default: 20, - required: true, - }, ]; for (let i = 1; i <= OSS_CI_GROUPS; i++) { @@ -36,7 +30,7 @@ for (let i = 1; i <= XPACK_CI_GROUPS; i++) { const pipeline = { steps: [ { - input: 'Number of Runs', + input: 'Number of Runs - Click Me', fields: inputs, }, { diff --git a/.buildkite/pipelines/flaky_tests/runner.js b/.buildkite/pipelines/flaky_tests/runner.js index 46c390ce455ca..bdb163504f46c 100644 --- a/.buildkite/pipelines/flaky_tests/runner.js +++ b/.buildkite/pipelines/flaky_tests/runner.js @@ -9,8 +9,10 @@ const overrideCount = parseInt( execSync(`buildkite-agent meta-data get 'ftsr-override-count'`).toString().trim() ); -const concurrency = - parseInt(execSync(`buildkite-agent meta-data get 'ftsr-concurrency'`).toString().trim()) || 20; +const concurrency = 25; +const initialJobs = 3; + +let totalJobs = initialJobs; const testSuites = []; for (const key of keys) { @@ -21,12 +23,25 @@ for (const key of keys) { const value = overrideCount || execSync(`buildkite-agent meta-data get '${key}'`).toString().trim(); + const count = value === '' ? defaultCount : parseInt(value); + totalJobs += count; + testSuites.push({ key: key.replace('ftsr-suite/', ''), - count: value === '' ? defaultCount : parseInt(value), + count: count, }); } +if (totalJobs > 500) { + console.error('+++ Too many tests'); + console.error( + `Buildkite builds can only contain 500 steps in total. Found ${totalJobs} in total. Make sure your test runs are less than ${ + 500 - initialJobs + }` + ); + process.exit(1); +} + const steps = []; const pipeline = { env: { @@ -46,7 +61,7 @@ steps.push({ for (const testSuite of testSuites) { const TEST_SUITE = testSuite.key; const RUN_COUNT = testSuite.count; - const UUID = TEST_SUITE + process.env.UUID; + const UUID = process.env.UUID; const JOB_PARTS = TEST_SUITE.split('/'); const IS_XPACK = JOB_PARTS[0] === 'xpack'; @@ -65,6 +80,7 @@ for (const testSuite of testSuites) { parallelism: RUN_COUNT, concurrency: concurrency, concurrency_group: UUID, + concurrency_method: 'eager', }); } else { steps.push({ @@ -75,6 +91,7 @@ for (const testSuite of testSuites) { parallelism: RUN_COUNT, concurrency: concurrency, concurrency_group: UUID, + concurrency_method: 'eager', }); } } diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index 2aba49bfa6460..efe522f592ecd 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -10,8 +10,6 @@ steps: - command: .buildkite/scripts/steps/on_merge_build_and_metrics.sh label: Default Build and Metrics - env: - BAZEL_CACHE_MODE: read-write agents: queue: c2-8 timeout_in_minutes: 60 diff --git a/.buildkite/pipelines/performance/nightly.yml b/.buildkite/pipelines/performance/nightly.yml index aa52fb7a9335c..dfee1061815c3 100644 --- a/.buildkite/pipelines/performance/nightly.yml +++ b/.buildkite/pipelines/performance/nightly.yml @@ -24,8 +24,6 @@ steps: agents: queue: ci-group-6 depends_on: build - concurrency: 50 - concurrency_group: 'performance-test-group' - wait: ~ continue_on_failure: true diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.js b/.buildkite/scripts/pipelines/pull_request/pipeline.js index 7b5c944d31c1c..c5ed216042b68 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.js +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.js @@ -57,6 +57,9 @@ const uploadPipeline = (pipelineContent) => { if ( (await doAnyChangesMatch([ /^x-pack\/plugins\/security_solution/, + /^x-pack\/plugins\/cases/, + /^x-pack\/plugins\/lists/, + /^x-pack\/plugins\/timelines/, /^x-pack\/test\/security_solution_cypress/, /^x-pack\/plugins\/triggers_actions_ui\/public\/application\/sections\/action_connector_form/, /^x-pack\/plugins\/triggers_actions_ui\/public\/application\/context\/actions_connectors_context\.tsx/, @@ -66,12 +69,12 @@ const uploadPipeline = (pipelineContent) => { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/security_solution.yml')); } - // if ( - // (await doAnyChangesMatch([/^x-pack\/plugins\/apm/])) || - // process.env.GITHUB_PR_LABELS.includes('ci:all-cypress-suites') - // ) { - // pipeline.push(getPipeline('.buildkite/pipelines/pull_request/apm_cypress.yml')); - // } + if ( + (await doAnyChangesMatch([/^x-pack\/plugins\/apm/])) || + process.env.GITHUB_PR_LABELS.includes('ci:all-cypress-suites') + ) { + pipeline.push(getPipeline('.buildkite/pipelines/pull_request/apm_cypress.yml')); + } if (await doAnyChangesMatch([/^x-pack\/plugins\/uptime/])) { pipeline.push(getPipeline('.buildkite/pipelines/pull_request/uptime.yml')); diff --git a/.buildkite/scripts/steps/functional/apm_cypress.sh b/.buildkite/scripts/steps/functional/apm_cypress.sh index 800f22c78d14c..77b26fafee920 100755 --- a/.buildkite/scripts/steps/functional/apm_cypress.sh +++ b/.buildkite/scripts/steps/functional/apm_cypress.sh @@ -2,7 +2,10 @@ set -euo pipefail -source .buildkite/scripts/steps/functional/common.sh +source .buildkite/scripts/common/util.sh + +.buildkite/scripts/bootstrap.sh +.buildkite/scripts/download_build_artifacts.sh export JOB=kibana-apm-cypress @@ -11,4 +14,5 @@ echo "--- APM Cypress Tests" cd "$XPACK_DIR" checks-reporter-with-killswitch "APM Cypress Tests" \ - node plugins/apm/scripts/test/e2e.js + node plugins/apm/scripts/test/e2e.js \ + --kibana-install-dir "$KIBANA_BUILD_LOCATION" diff --git a/.buildkite/scripts/steps/functional/performance.sh b/.buildkite/scripts/steps/functional/performance.sh index 2f1a77690d153..8e3793733a6e8 100644 --- a/.buildkite/scripts/steps/functional/performance.sh +++ b/.buildkite/scripts/steps/functional/performance.sh @@ -14,6 +14,8 @@ cat << EOF | buildkite-agent pipeline upload steps: - command: .buildkite/scripts/steps/functional/performance_sub.sh parallelism: "$ITERATION_COUNT" + concurrency: 20 + concurrency_group: 'performance-test-group' EOF diff --git a/STYLEGUIDE.mdx b/STYLEGUIDE.mdx index 01d2734744e81..09a87aff13d33 100644 --- a/STYLEGUIDE.mdx +++ b/STYLEGUIDE.mdx @@ -210,7 +210,7 @@ less likely to introduce bugs in the future due to insufficient types. If you’re not having `any` in your plugin or are starting a new plugin, you should enable the [`@typescript-eslint/no-explicit-any`](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-explicit-any.md) -linting rule for your plugin via the [`.eslintrc.js`](https://github.com/elastic/kibana/blob/master/.eslintrc.js) config. +linting rule for your plugin via the [`.eslintrc.js`](https://github.com/elastic/kibana/blob/main/.eslintrc.js) config. ### Avoid non-null assertions @@ -229,7 +229,7 @@ assertion would now wrongly disable proper type checking for us. If you’re not using non-null assertions in your plugin or are starting a new plugin, consider enabling the [`@typescript-eslint/no-non-null-assertion`](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-non-null-assertion.md) -linting rule for you plugin in the [`.eslintrc.js`](https://github.com/elastic/kibana/blob/master/.eslintrc.js) config. +linting rule for you plugin in the [`.eslintrc.js`](https://github.com/elastic/kibana/blob/main/.eslintrc.js) config. ### Return/throw early from functions diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 5e18a7184d0a3..ea30e1f590a1b 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -13,12 +13,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/plugin.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/lib/license_state.test.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/lib/license_state.test.ts#:~:text=license%24) | - | -| | [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/plugin.ts#:~:text=authc) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/plugin.ts#:~:text=authz) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/plugin.ts#:~:text=index), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions/server/plugin.ts#:~:text=index) | - | +| | [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder), [find_and_cleanup_tasks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.ts#:~:text=nodeBuilder) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/lib/license_state.test.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/lib/license_state.test.ts#:~:text=license%24) | - | +| | [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=authc) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=authz) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=index), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=index) | - | @@ -26,8 +26,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [to_editable_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=metric) | - | -| | [to_editable_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=metric) | - | +| | [to_editable_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=metric) | - | +| | [to_editable_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/advanced_settings/public/management_app/lib/to_editable_config.ts#:~:text=metric) | - | @@ -35,12 +35,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode) | 8.1 | -| | [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=nodeBuilder), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=nodeBuilder), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=nodeBuilder) | 8.1 | -| | [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode) | 8.1 | -| | [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/plugin.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/lib/license_state.test.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/lib/license_state.test.ts#:~:text=license%24) | - | -| | [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [rules_client_factory.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client_factory.test.ts#:~:text=LegacyAuditLogger), [rules_client_factory.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting/server/rules_client_factory.test.ts#:~:text=LegacyAuditLogger) | - | +| | [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode) | 8.1 | +| | [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=nodeBuilder), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=nodeBuilder), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=nodeBuilder) | 8.1 | +| | [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode) | 8.1 | +| | [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode), [rules_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/rules_client.ts#:~:text=KueryNode) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/license_state.test.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/license_state.test.ts#:~:text=license%24) | - | +| | [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/authorization/audit_logger.ts#:~:text=LegacyAuditLogger), [rules_client_factory.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.test.ts#:~:text=LegacyAuditLogger), [rules_client_factory.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.test.ts#:~:text=LegacyAuditLogger) | - | @@ -48,19 +48,19 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern)+ 8 more | - | -| | [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec) | - | -| | [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=indexPatterns) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=esKuery) | 8.1 | -| | [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec) | - | -| | [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern)+ 8 more | - | -| | [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/plugin.ts#:~:text=environment) | - | -| | [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode)+ 2 more | - | -| | [license_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/public/context/license/license_context.tsx#:~:text=license%24) | - | -| | [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode)+ 2 more | - | -| | [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/server/routes/index_pattern.ts#:~:text=spacesService) | 7.16 | -| | [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/apm/server/routes/index_pattern.ts#:~:text=getSpaceId) | 7.16 | +| | [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern)+ 8 more | - | +| | [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec) | - | +| | [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=indexPatterns) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=esKuery) | 8.1 | +| | [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPatternSpec) | - | +| | [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern)+ 8 more | - | +| | [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [SelectedFilters.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/SelectedFilters.tsx#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [use_index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/use_index_pattern.ts#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [selected_wildcards.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/app/RumDashboard/LocalUIFilters/selected_wildcards.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx#:~:text=IndexPattern) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/plugin.ts#:~:text=environment) | - | +| | [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode)+ 2 more | - | +| | [license_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/public/context/license/license_context.tsx#:~:text=license%24) | - | +| | [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/common/license_check.test.ts#:~:text=mode)+ 2 more | - | +| | [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/server/routes/index_pattern.ts#:~:text=spacesService) | 7.16 | +| | [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/apm/server/routes/index_pattern.ts#:~:text=getSpaceId) | 7.16 | @@ -68,19 +68,19 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes) | - | -| | [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes) | - | -| | [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes) | - | -| | [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [essql.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/essql.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context) | - | -| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | -| | [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | -| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getTypes), [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getTypes), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getTypes) | - | -| | [state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/types/state.ts#:~:text=Render), [state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/types/state.ts#:~:text=Render), [state.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/target/types/types/state.d.ts#:~:text=Render), [state.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/target/types/types/state.d.ts#:~:text=Render), [markdown.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts#:~:text=Render), [markdown.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts#:~:text=Render), [timefilterControl.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilterControl.ts#:~:text=Render), [timefilterControl.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilterControl.ts#:~:text=Render), [pie.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/pie.ts#:~:text=Render), [pie.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/pie.ts#:~:text=Render)+ 6 more | - | -| | [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [essql.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/essql.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context) | - | -| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | -| | [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | -| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getTypes), [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getTypes), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getTypes) | - | -| | [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [essql.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/essql.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context) | - | +| | [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes) | - | +| | [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes) | - | +| | [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes), [es_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/lib/es_service.ts#:~:text=IndexPatternAttributes) | - | +| | [filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [essql.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/essql.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context) | - | +| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | +| | [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | +| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getTypes), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/application.tsx#:~:text=getTypes), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getTypes) | - | +| | [state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/types/state.ts#:~:text=Render), [state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/types/state.ts#:~:text=Render), [state.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/target/types/types/state.d.ts#:~:text=Render), [state.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/target/types/types/state.d.ts#:~:text=Render), [markdown.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts#:~:text=Render), [markdown.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts#:~:text=Render), [timefilterControl.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilterControl.ts#:~:text=Render), [timefilterControl.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilterControl.ts#:~:text=Render), [pie.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/functions/pie.ts#:~:text=Render), [pie.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/functions/pie.ts#:~:text=Render)+ 6 more | - | +| | [filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [essql.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/essql.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context) | - | +| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | +| | [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | +| | [setup_expressions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getTypes), [application.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/application.tsx#:~:text=getTypes), [functions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getTypes) | - | +| | [filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/public/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [essql.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/essql.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context) | - | @@ -88,10 +88,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=KueryNode)+ 25 more | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder)+ 36 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=KueryNode)+ 25 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cases/server/client/utils.ts#:~:text=KueryNode)+ 25 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=KueryNode)+ 25 more | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=nodeBuilder)+ 36 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=KueryNode)+ 25 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/common/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/types.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/authorization/utils.ts#:~:text=KueryNode), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/utils.ts#:~:text=KueryNode)+ 25 more | 8.1 | @@ -99,7 +99,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cloud/public/plugin.ts#:~:text=environment) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud/public/plugin.ts#:~:text=environment) | - | @@ -107,7 +107,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/console/server/plugin.ts#:~:text=legacy) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/console/server/plugin.ts#:~:text=legacy) | - | @@ -115,7 +115,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/cross_cluster_replication/public/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cross_cluster_replication/public/plugin.ts#:~:text=license%24) | - | @@ -123,27 +123,27 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract)+ 2 more | - | -| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern)+ 6 more | - | -| | [dashboard_router.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/dashboard_router.tsx#:~:text=indexPatterns), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/dashboard_router.tsx#:~:text=indexPatterns) | - | -| | [export_csv_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/export_csv_action.tsx#:~:text=fieldFormats) | - | -| | [save_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/save_dashboard.ts#:~:text=esFilters), [save_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/save_dashboard.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [sync_dashboard_container_input.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts#:~:text=esFilters), [sync_dashboard_container_input.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts#:~:text=esFilters), [sync_dashboard_container_input.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts#:~:text=esFilters), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=esFilters)+ 15 more | 8.1 | -| | [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 25 more | 8.1 | -| | [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE) | - | -| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract)+ 2 more | - | -| | [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView), [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView) | - | -| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern)+ 6 more | - | -| | [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 25 more | 8.1 | -| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern) | - | -| | [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 25 more | 8.1 | -| | [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView) | - | -| | [saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/top_nav/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/top_nav/save_modal.tsx#:~:text=SavedObjectSaveModal) | - | -| | [saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObjectLoader), [saved_dashboards.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboards.ts#:~:text=SavedObjectLoader), [saved_dashboards.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboards.ts#:~:text=SavedObjectLoader), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=SavedObjectLoader), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=SavedObjectLoader), [make_default_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=SavedObjectLoader), [make_default_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=SavedObjectLoader), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/url_generator.ts#:~:text=SavedObjectLoader)+ 3 more | - | -| | [saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObject), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObject), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObject), [dashboard_tagging.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/dashboard_tagging.ts#:~:text=SavedObject), [dashboard_tagging.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/lib/dashboard_tagging.ts#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject) | - | -| | [saved_dashboard.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObjectClass) | - | -| | [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx#:~:text=settings), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx#:~:text=settings) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#:~:text=onAppLeave), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/dashboard_router.tsx#:~:text=onAppLeave), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#:~:text=onAppLeave), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/target/types/public/types.d.ts#:~:text=onAppLeave) | - | -| | [migrations_730.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/migrations_730.ts#:~:text=warning), [migrations_730.ts](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/server/saved_objects/migrations_730.ts#:~:text=warning) | - | +| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract)+ 2 more | - | +| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern)+ 6 more | - | +| | [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/dashboard_router.tsx#:~:text=indexPatterns), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/dashboard_router.tsx#:~:text=indexPatterns) | - | +| | [export_csv_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/actions/export_csv_action.tsx#:~:text=fieldFormats) | - | +| | [save_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/save_dashboard.ts#:~:text=esFilters), [save_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/save_dashboard.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [diff_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts#:~:text=esFilters), [sync_dashboard_container_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts#:~:text=esFilters), [sync_dashboard_container_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts#:~:text=esFilters), [sync_dashboard_container_input.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts#:~:text=esFilters), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/plugin.tsx#:~:text=esFilters)+ 15 more | 8.1 | +| | [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 25 more | 8.1 | +| | [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [replace_index_pattern_reference.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [dashboard_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE) | - | +| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [make_default_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPatternsContract)+ 2 more | - | +| | [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView), [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView) | - | +| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern)+ 6 more | - | +| | [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 25 more | 8.1 | +| | [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [sync_dashboard_index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/sync_dashboard_index_patterns.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=IndexPattern) | - | +| | [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [filter_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/filter_utils.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter), [dashboard_state_slice.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/state/dashboard_state_slice.ts#:~:text=Filter)+ 25 more | 8.1 | +| | [load_saved_dashboard_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/load_saved_dashboard_state.ts#:~:text=ensureDefaultDataView) | - | +| | [saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/top_nav/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/top_nav/save_modal.tsx#:~:text=SavedObjectSaveModal) | - | +| | [saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObjectLoader), [saved_dashboards.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboards.ts#:~:text=SavedObjectLoader), [saved_dashboards.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboards.ts#:~:text=SavedObjectLoader), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=SavedObjectLoader), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/plugin.tsx#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/plugin.tsx#:~:text=SavedObjectLoader), [make_default_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=SavedObjectLoader), [make_default_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts#:~:text=SavedObjectLoader), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/url_generator.ts#:~:text=SavedObjectLoader)+ 3 more | - | +| | [saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/saved_objects.ts#:~:text=SavedObject), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObject), [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObject), [dashboard_tagging.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/dashboard_tagging.ts#:~:text=SavedObject), [dashboard_tagging.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/lib/dashboard_tagging.ts#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject), [clone_panel_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#:~:text=SavedObject) | - | +| | [saved_dashboard.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#:~:text=SavedObjectClass) | - | +| | [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx#:~:text=settings), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx#:~:text=settings) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/types.ts#:~:text=onAppLeave), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/application/dashboard_router.tsx#:~:text=onAppLeave), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/plugin.tsx#:~:text=onAppLeave), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/target/types/public/types.d.ts#:~:text=onAppLeave) | - | +| | [migrations_730.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/migrations_730.ts#:~:text=warning), [migrations_730.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/server/saved_objects/migrations_730.ts#:~:text=warning) | - | @@ -151,12 +151,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | -| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | +| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=esFilters) | 8.1 | +| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | +| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | +| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=isFilters) | 8.1 | +| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | +| | [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter), [embeddable_to_dashboard_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx#:~:text=Filter) | 8.1 | @@ -164,7 +164,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [dashboard_mode_request_interceptor.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/dashboard_mode/server/interceptors/dashboard_mode_request_interceptor.ts#:~:text=authc) | - | +| | [dashboard_mode_request_interceptor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/dashboard_mode/server/interceptors/dashboard_mode_request_interceptor.ts#:~:text=authc) | - | @@ -172,25 +172,25 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=IndexPatternField)+ 11 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/index.ts#:~:text=IndexPatternsService) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [create_search_source.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/create_search_source.test.ts#:~:text=IndexPatternsContract)+ 29 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern)+ 88 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IFieldType), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IFieldType), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IFieldType), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [query_suggestion_provider.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts#:~:text=IFieldType), [query_suggestion_provider.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts#:~:text=IFieldType)+ 36 more | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=IndexPatternField)+ 11 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [generate_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IIndexPattern)+ 64 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternAttributes), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/index.ts#:~:text=IndexPatternAttributes), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternAttributes) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IIndexPatternsApiClient) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternFieldMap) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternSpec), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/index.ts#:~:text=IndexPatternSpec) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternType), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/index.ts#:~:text=IndexPatternType) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/index.ts#:~:text=IndexPatternsService) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [create_search_source.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/create_search_source.test.ts#:~:text=IndexPatternsContract)+ 29 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern)+ 88 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/common/index.ts#:~:text=IndexPatternListItem), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/index.ts#:~:text=IndexPatternListItem) | - | -| | [aggs_service.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/search/aggs/aggs_service.ts#:~:text=indexPatternsServiceFactory), [esaggs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/search/expressions/esaggs.ts#:~:text=indexPatternsServiceFactory), [search_service.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data/server/search/search_service.ts#:~:text=indexPatternsServiceFactory) | - | -| | [data_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions), [data_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=IndexPatternField)+ 11 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/index.ts#:~:text=IndexPatternsService) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [create_search_source.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/create_search_source.test.ts#:~:text=IndexPatternsContract)+ 29 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern)+ 88 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IFieldType), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IFieldType), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IFieldType), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [generate_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IFieldType), [query_suggestion_provider.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts#:~:text=IFieldType), [query_suggestion_provider.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/autocomplete/providers/query_suggestion_provider.ts#:~:text=IFieldType)+ 36 more | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [kibana_context_type.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/kibana_context_type.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [agg_config.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/agg_config.test.ts#:~:text=IndexPatternField), [_terms_other_bucket_helper.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts#:~:text=IndexPatternField)+ 11 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [get_time.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/timefilter/get_time.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [filter_editor_utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.ts#:~:text=IIndexPattern), [generate_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts#:~:text=IIndexPattern)+ 64 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternAttributes), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/index.ts#:~:text=IndexPatternAttributes), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternAttributes) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IIndexPatternsApiClient) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternFieldMap) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternSpec), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/index.ts#:~:text=IndexPatternSpec) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternType), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/index.ts#:~:text=IndexPatternType) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/index.ts#:~:text=IndexPatternsService) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/create_search_source.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [search_source_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source_service.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [esaggs_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/expressions/esaggs/esaggs_fn.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/types.ts#:~:text=IndexPatternsContract), [create_search_source.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/create_search_source.test.ts#:~:text=IndexPatternsContract)+ 29 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/types.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/search_source/search_source.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern), [tabify_docs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/search/tabify/tabify_docs.ts#:~:text=IndexPattern)+ 88 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/index.ts#:~:text=IndexPatternListItem), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/index.ts#:~:text=IndexPatternListItem) | - | +| | [aggs_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/search/aggs/aggs_service.ts#:~:text=indexPatternsServiceFactory), [esaggs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/search/expressions/esaggs.ts#:~:text=indexPatternsServiceFactory), [search_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/search/search_service.ts#:~:text=indexPatternsServiceFactory) | - | +| | [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions), [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions) | - | @@ -198,11 +198,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | -| | [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=nodeBuilder), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder)+ 2 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | -| | [session_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_enhanced/server/search/session/session_service.ts#:~:text=authc) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | +| | [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=nodeBuilder), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=nodeBuilder), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=nodeBuilder)+ 2 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/types.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [get_search_session_page.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/get_search_session_page.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [check_non_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/check_non_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode), [expire_persisted_sessions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/expire_persisted_sessions.ts#:~:text=KueryNode)+ 2 more | 8.1 | +| | [session_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_enhanced/server/search/session/session_service.ts#:~:text=authc) | - | @@ -210,48 +210,48 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsContract) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern) | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternType) | - | -| | [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=IndexPatternListItem), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternListItem) | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IIndexPatternsApiClient), [index_patterns_api_client.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/index_patterns_api_client.ts#:~:text=IIndexPatternsApiClient), [index_patterns_api_client.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/index_patterns_api_client.ts#:~:text=IIndexPatternsApiClient) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternFieldMap) | - | -| | [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=intervalName) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternType) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsContract) | - | -| | [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=ensureDefaultDataView) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern) | - | -| | [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=IndexPatternListItem), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternListItem) | - | -| | [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName) | 8.1 | -| | [format_hit.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [format_hit.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit) | - | -| | [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField) | 8.1 | -| | [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=removeScriptedField) | 8.1 | -| | [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=getScriptedFields), [register_index_pattern_usage_collection.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/register_index_pattern_usage_collection.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields)+ 1 more | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService) | - | -| | [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName) | 8.1 | -| | [format_hit.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [format_hit.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit) | - | -| | [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField) | 8.1 | -| | [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=removeScriptedField) | 8.1 | -| | [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_views.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_views.ts#:~:text=getScriptedFields), [register_index_pattern_usage_collection.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/server/register_index_pattern_usage_collection.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields)+ 1 more | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsContract) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternType) | - | +| | [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=IndexPatternListItem), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternListItem) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=IIndexPattern) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IIndexPatternsApiClient), [index_patterns_api_client.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/index_patterns_api_client.ts#:~:text=IIndexPatternsApiClient), [index_patterns_api_client.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/index_patterns_api_client.ts#:~:text=IIndexPatternsApiClient) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternFieldMap) | - | +| | [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=intervalName) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec), [create_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/create_index_pattern.ts#:~:text=IndexPatternSpec) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternType) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsContract) | - | +| | [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=ensureDefaultDataView) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern) | - | +| | [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=IndexPatternListItem), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternListItem) | - | +| | [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName) | 8.1 | +| | [format_hit.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [format_hit.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit) | - | +| | [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField) | 8.1 | +| | [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=removeScriptedField) | 8.1 | +| | [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=getScriptedFields), [register_index_pattern_usage_collection.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/register_index_pattern_usage_collection.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields)+ 1 more | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternField), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/utils.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [data_view_field.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/field_list.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/types.ts#:~:text=IFieldType), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/types.ts#:~:text=IFieldType)+ 13 more | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/utils.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes), [scripted_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/deprecations/scripted_fields.ts#:~:text=IndexPatternAttributes) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [data_view_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/fields/data_view_field.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=IndexPattern) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/index.ts#:~:text=IndexPatternsService), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/index.ts#:~:text=IndexPatternsService) | - | +| | [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=intervalName), [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName), [update_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/routes/update_index_pattern.ts#:~:text=intervalName) | 8.1 | +| | [format_hit.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [format_hit.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/format_hit.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=flattenHit) | - | +| | [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=addScriptedField) | 8.1 | +| | [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=removeScriptedField) | 8.1 | +| | [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=getScriptedFields), [register_index_pattern_usage_collection.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/register_index_pattern_usage_collection.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields)+ 1 more | 8.1 | @@ -259,13 +259,13 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern)+ 60 more | - | -| | [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField)+ 16 more | - | -| | [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=indexPatterns), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=indexPatterns) | - | -| | [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField)+ 16 more | - | -| | [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern)+ 60 more | - | -| | [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField)+ 3 more | - | -| | [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern)+ 25 more | - | +| | [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern)+ 60 more | - | +| | [field_data_row.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField)+ 16 more | - | +| | [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=indexPatterns), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=indexPatterns) | - | +| | [field_data_row.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField)+ 16 more | - | +| | [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern)+ 60 more | - | +| | [field_data_row.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_data_row.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/types/field_data_row.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [field_types_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/util/field_types_utils.ts#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [search_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_panel.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField), [index_data_visualizer_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx#:~:text=IndexPatternField)+ 3 more | - | +| | [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [lens_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/lens_utils.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/field_data_row/action_menu/actions.ts#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [geo_point_content_with_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/geo_point_content_with_map/geo_point_content_with_map.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern), [index_based_expanded_row.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/expanded_row/index_based_expanded_row.tsx#:~:text=IndexPattern)+ 25 more | - | @@ -273,39 +273,39 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService)+ 6 more | - | -| | [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract)+ 50 more | - | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern)+ 346 more | - | -| | [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField)+ 192 more | - | -| | [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 3 more | - | -| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create) | - | -| | [anchor.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | -| | [build_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/build_services.ts#:~:text=indexPatterns), [source_viewer.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/source_viewer/source_viewer.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#:~:text=indexPatterns) | - | -| | [histogram.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/chart/histogram.tsx#:~:text=fieldFormats) | - | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=esFilters), [get_context_url.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/get_context_url.tsx#:~:text=esFilters), [get_context_url.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/get_context_url.tsx#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=esFilters)+ 17 more | 8.1 | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter)+ 21 more | 8.1 | -| | [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 16 more | - | -| | [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField)+ 192 more | - | -| | [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService)+ 6 more | - | -| | [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract)+ 50 more | - | -| | [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=ensureDefaultDataView), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=ensureDefaultDataView) | - | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern)+ 346 more | - | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter)+ 21 more | 8.1 | -| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create) | - | -| | [anchor.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | -| | [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField)+ 91 more | - | -| | [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 3 more | - | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern)+ 168 more | - | -| | [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService)+ 6 more | - | -| | [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/locator.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter)+ 21 more | 8.1 | -| | [discover_main_route.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=ensureDefaultDataView) | - | -| | [on_save_search.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal), [on_save_search.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal) | - | -| | [saved_searches.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/legacy/saved_searches.ts#:~:text=SavedObjectLoader), [saved_searches.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/legacy/saved_searches.ts#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#:~:text=SavedObjectLoader) | - | -| | [_saved_search.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/legacy/_saved_search.ts#:~:text=SavedObject), [_saved_search.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/legacy/_saved_search.ts#:~:text=SavedObject) | - | -| | [_saved_search.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/legacy/_saved_search.ts#:~:text=SavedObjectClass) | - | -| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts#:~:text=executeTriggerActions), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/target/types/public/application/embeddable/search_embeddable_factory.d.ts#:~:text=executeTriggerActions) | - | -| | [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric) | - | -| | [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/master/src/plugins/discover/server/ui_settings.ts#:~:text=metric) | - | +| | [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService)+ 6 more | - | +| | [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract)+ 50 more | - | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern)+ 346 more | - | +| | [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField)+ 192 more | - | +| | [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 3 more | - | +| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create) | - | +| | [anchor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | +| | [build_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/build_services.ts#:~:text=indexPatterns), [source_viewer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/source_viewer/source_viewer.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=indexPatterns), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/plugin.tsx#:~:text=indexPatterns) | - | +| | [histogram.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/chart/histogram.tsx#:~:text=fieldFormats) | - | +| | [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=esFilters), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=esFilters), [get_context_url.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/get_context_url.tsx#:~:text=esFilters), [get_context_url.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/get_context_url.tsx#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=esFilters), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=esFilters)+ 17 more | 8.1 | +| | [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter)+ 21 more | 8.1 | +| | [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 16 more | - | +| | [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField)+ 192 more | - | +| | [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService)+ 6 more | - | +| | [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_data_grid_columns.ts#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [use_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/use_index_pattern.tsx#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [use_data_grid_columns.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/helpers/use_data_grid_columns.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract), [resolve_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/utils/resolve_index_pattern.d.ts#:~:text=IndexPatternsContract)+ 50 more | - | +| | [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=ensureDefaultDataView), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=ensureDefaultDataView) | - | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern)+ 346 more | - | +| | [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter)+ 21 more | 8.1 | +| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=create) | - | +| | [anchor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/services/anchor.ts#:~:text=fetch), [fetch_hits_in_interval.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts#:~:text=fetch) | 8.1 | +| | [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [discover_grid_cell_actions.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_cell_actions.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [doc_table_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_wrapper.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [context_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/context/context_app.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField), [discover_field_visualize.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_field_visualize.tsx#:~:text=IndexPatternField)+ 91 more | - | +| | [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.tsx#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_index_pattern.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/apps/main/components/sidebar/discover_index_pattern.d.ts#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [discover_sidebar_responsive.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/layout/types.ts#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes), [discover_main_app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_app.tsx#:~:text=IndexPatternAttributes)+ 3 more | - | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/helpers.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [discover_grid_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [get_render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern), [discover_grid_columns.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/components/discover_grid/discover_grid_columns.tsx#:~:text=IndexPattern)+ 168 more | - | +| | [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [popularize_field.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/helpers/popularize_field.test.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/__mocks__/index_patterns.ts#:~:text=IndexPatternsService)+ 6 more | - | +| | [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [url_generator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/url_generator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/locator.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/types.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter), [discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/services/discover_state.ts#:~:text=Filter)+ 21 more | 8.1 | +| | [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/discover_main_route.tsx#:~:text=ensureDefaultDataView) | - | +| | [on_save_search.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal), [on_save_search.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal) | - | +| | [saved_searches.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/saved_searches/legacy/saved_searches.ts#:~:text=SavedObjectLoader), [saved_searches.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/saved_searches/legacy/saved_searches.ts#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/plugin.tsx#:~:text=SavedObjectLoader), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/plugin.tsx#:~:text=SavedObjectLoader) | - | +| | [_saved_search.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/saved_searches/legacy/_saved_search.ts#:~:text=SavedObject), [_saved_search.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/saved_searches/legacy/_saved_search.ts#:~:text=SavedObject) | - | +| | [_saved_search.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/saved_searches/legacy/_saved_search.ts#:~:text=SavedObjectClass) | - | +| | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts#:~:text=executeTriggerActions), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/plugin.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/target/types/public/application/embeddable/search_embeddable_factory.d.ts#:~:text=executeTriggerActions) | - | +| | [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric) | - | +| | [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric) | - | @@ -313,12 +313,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [explore_data_chart_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts#:~:text=esFilters), [explore_data_chart_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts#:~:text=esFilters) | 8.1 | -| | [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter) | 8.1 | -| | [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter) | 8.1 | -| | [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter) | 8.1 | -| | [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter) | 8.1 | -| | [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter) | 8.1 | +| | [explore_data_chart_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts#:~:text=esFilters), [explore_data_chart_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts#:~:text=esFilters) | 8.1 | +| | [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter) | 8.1 | +| | [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter) | 8.1 | +| | [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter) | 8.1 | +| | [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=RangeFilter) | 8.1 | +| | [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_context_menu_action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter), [explore_data_chart_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts#:~:text=Filter) | 8.1 | @@ -326,8 +326,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [attribute_service.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal), [attribute_service.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal) | - | -| | [container.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [explicit_input.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/tests/explicit_input.test.ts#:~:text=executeTriggerActions) | - | +| | [attribute_service.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal), [attribute_service.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#:~:text=SavedObjectSaveModal) | - | +| | [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/container.test.ts#:~:text=executeTriggerActions), [explicit_input.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/embeddable/public/tests/explicit_input.test.ts#:~:text=executeTriggerActions) | - | @@ -335,8 +335,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/encrypted_saved_objects/server/audit/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/encrypted_saved_objects/server/audit/audit_logger.ts#:~:text=LegacyAuditLogger) | - | -| | [encryption_key_rotation_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/encrypted_saved_objects/server/crypto/encryption_key_rotation_service.ts#:~:text=authc), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.ts#:~:text=authc) | - | +| | [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/encrypted_saved_objects/server/audit/audit_logger.ts#:~:text=LegacyAuditLogger), [audit_logger.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/encrypted_saved_objects/server/audit/audit_logger.ts#:~:text=LegacyAuditLogger) | - | +| | [encryption_key_rotation_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/encrypted_saved_objects/server/crypto/encryption_key_rotation_service.ts#:~:text=authc), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/encrypted_saved_objects/server/saved_objects/index.ts#:~:text=authc) | - | @@ -344,7 +344,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [check_access.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz) | - | +| | [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz) | - | @@ -352,7 +352,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [kibana_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/file_upload/public/kibana_services.ts#:~:text=indexPatterns) | - | +| | [kibana_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/file_upload/public/kibana_services.ts#:~:text=indexPatterns) | - | @@ -360,15 +360,15 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType) | 8.1 | -| | [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=indexPatterns), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=indexPatterns), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=indexPatterns), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=indexPatterns) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/data_stream/list_page/index.tsx#:~:text=fieldFormats) | - | -| | [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType)+ 2 more | 8.1 | -| | [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/plugin.ts#:~:text=license%24) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=license%24) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/integrations/index.tsx#:~:text=appBasePath), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/index.tsx#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/public/applications/fleet/index.d.ts#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/public/applications/integrations/index.d.ts#:~:text=appBasePath) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=AsyncPlugin), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin) | - | +| | [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType) | 8.1 | +| | [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=indexPatterns), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=indexPatterns), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=indexPatterns), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=indexPatterns) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/data_stream/list_page/index.tsx#:~:text=fieldFormats) | - | +| | [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType)+ 2 more | 8.1 | +| | [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/components/search_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType), [query_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#:~:text=IFieldType) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/plugin.ts#:~:text=license%24) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/integrations/index.tsx#:~:text=appBasePath), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/index.tsx#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/target/types/public/applications/fleet/index.d.ts#:~:text=appBasePath), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/target/types/public/applications/integrations/index.d.ts#:~:text=appBasePath) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/plugin.ts#:~:text=AsyncPlugin), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/plugin.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin), [plugin.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/target/types/server/plugin.d.ts#:~:text=AsyncPlugin) | - | @@ -376,19 +376,19 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract) | - | -| | [app_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [app_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern)+ 44 more | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/plugin.ts#:~:text=indexPatterns) | - | -| | [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery) | 8.1 | -| | [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract) | - | -| | [app_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [app_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern)+ 44 more | - | -| | [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [app_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [app_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern)+ 17 more | - | -| | [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [deserialize.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [save_modal.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/components/save_modal.tsx#:~:text=SavedObjectSaveModal) | - | -| | [listing_route.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/apps/listing_route.tsx#:~:text=settings), [listing_route.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/public/apps/listing_route.tsx#:~:text=settings) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/graph/server/plugin.ts#:~:text=license%24) | - | +| | [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract) | - | +| | [app_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [app_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern)+ 44 more | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/plugin.ts#:~:text=indexPatterns) | - | +| | [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=esKuery) | 8.1 | +| | [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract), [application.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/application.ts#:~:text=IndexPatternsContract) | - | +| | [app_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [app_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern)+ 44 more | - | +| | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [app_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [app_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/types/app_state.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [datasource.sagas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.sagas.ts#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern), [search_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/search_bar.tsx#:~:text=IndexPattern)+ 17 more | - | +| | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [deserialize.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.ts#:~:text=getNonScriptedFields), [datasource.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/state_management/datasource.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields), [deserialize.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/services/persistence/deserialize.test.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [save_modal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/components/save_modal.tsx#:~:text=SavedObjectSaveModal) | - | +| | [listing_route.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/apps/listing_route.tsx#:~:text=settings), [listing_route.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/public/apps/listing_route.tsx#:~:text=settings) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/graph/server/plugin.ts#:~:text=license%24) | - | @@ -396,7 +396,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/plugin.ts#:~:text=indexPatterns) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/home/public/plugin.ts#:~:text=indexPatterns) | - | @@ -404,7 +404,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [license.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_lifecycle_management/server/services/license.ts#:~:text=license%24) | - | +| | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/index_lifecycle_management/server/services/license.ts#:~:text=license%24) | - | @@ -412,15 +412,15 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern)+ 4 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec) | - | -| | [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/plugin.tsx#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/plugin.tsx#:~:text=indexPatterns) | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec)+ 2 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern)+ 4 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField) | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern) | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern)+ 4 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/plugin.tsx#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/plugin.tsx#:~:text=indexPatterns) | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec), [index_pattern_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_flyout_content_container.tsx#:~:text=IndexPatternSpec), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec), [index_pattern_editor_flyout_content.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx#:~:text=IndexPatternSpec)+ 2 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern)+ 4 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField), [extract_time_fields.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/lib/extract_time_fields.test.ts#:~:text=IndexPatternField) | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/shared_imports.ts#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/open_editor.tsx#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/public/types.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_editor/target/types/public/types.d.ts#:~:text=IndexPattern) | - | @@ -428,17 +428,17 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [delete_field_provider.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/delete_field_provider.tsx#:~:text=IndexPattern)+ 28 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField)+ 8 more | - | -| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/plugin.ts#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/plugin.ts#:~:text=indexPatterns) | - | -| | [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=fieldFormats), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=fieldFormats), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=fieldFormats), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=fieldFormats), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=fieldFormats), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/plugin.ts#:~:text=fieldFormats), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=fieldFormats), [setup_environment.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/__jest__/client_integration/helpers/setup_environment.tsx#:~:text=fieldFormats) | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField)+ 8 more | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [delete_field_provider.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/delete_field_provider.tsx#:~:text=IndexPattern)+ 28 more | - | -| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName) | 8.1 | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField) | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [delete_field_provider.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/delete_field_provider.tsx#:~:text=IndexPattern)+ 9 more | - | -| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName) | 8.1 | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [delete_field_provider.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/delete_field_provider.tsx#:~:text=IndexPattern)+ 28 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField)+ 8 more | - | +| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/plugin.ts#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/plugin.ts#:~:text=indexPatterns) | - | +| | [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=fieldFormats), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=fieldFormats), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=fieldFormats), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=fieldFormats), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=fieldFormats), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/plugin.ts#:~:text=fieldFormats), [field_format_editor.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/target/types/public/components/field_format_editor/field_format_editor.d.ts#:~:text=fieldFormats), [setup_environment.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/__jest__/client_integration/helpers/setup_environment.tsx#:~:text=fieldFormats) | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField)+ 8 more | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [delete_field_provider.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/delete_field_provider.tsx#:~:text=IndexPattern)+ 28 more | - | +| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName) | 8.1 | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [field_editor_flyout_content_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField), [open_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_editor.tsx#:~:text=IndexPatternField) | - | +| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/shared_imports.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [serialization.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/serialization.ts#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [field_editor_context.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_editor_context.tsx#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [remove_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/lib/remove_fields.ts#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [open_delete_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx#:~:text=IndexPattern), [delete_field_provider.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/delete_field_provider.tsx#:~:text=IndexPattern)+ 9 more | - | +| | [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName), [field_format_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_field_editor/public/components/field_format_editor/field_format_editor.tsx#:~:text=castEsToKbnFieldTypeName) | 8.1 | @@ -446,35 +446,35 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract)+ 2 more | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern)+ 82 more | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField)+ 42 more | - | -| | [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern) | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType) | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames) | 8.1 | -| | [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=indexPatterns), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=indexPatterns), [edit_index_pattern_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern_container.tsx#:~:text=indexPatterns), [edit_index_pattern_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern_container.tsx#:~:text=indexPatterns), [create_edit_field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx#:~:text=indexPatterns), [create_edit_field_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field_container.tsx#:~:text=indexPatterns), [create_edit_field_container.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field_container.tsx#:~:text=indexPatterns) | - | -| | [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats) | - | -| | [test_script.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=esQuery), [test_script.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=esQuery), [test_script.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=esQuery) | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType) | 8.1 | -| | [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern)+ 6 more | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField)+ 42 more | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract)+ 2 more | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern)+ 82 more | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem)+ 6 more | - | -| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField), [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | 8.1 | -| | [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | 8.1 | -| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields), [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField)+ 16 more | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType) | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern)+ 36 more | - | -| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | 8.1 | -| | [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | 8.1 | -| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | 8.1 | -| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | 8.1 | -| | [table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | 8.1 | -| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract)+ 2 more | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern)+ 82 more | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField)+ 42 more | - | +| | [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames) | 8.1 | +| | [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=indexPatterns), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=indexPatterns), [edit_index_pattern_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern_container.tsx#:~:text=indexPatterns), [edit_index_pattern_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern_container.tsx#:~:text=indexPatterns), [create_edit_field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx#:~:text=indexPatterns), [create_edit_field_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field_container.tsx#:~:text=indexPatterns), [create_edit_field_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field_container.tsx#:~:text=indexPatterns) | - | +| | [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=fieldFormats) | - | +| | [test_script.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=esQuery), [test_script.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=esQuery), [test_script.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx#:~:text=esQuery) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType) | 8.1 | +| | [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern), [index_header.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/edit_index_pattern/index_header/index_header.d.ts#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#:~:text=IIndexPattern)+ 6 more | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField)+ 42 more | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract), [utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.test.ts#:~:text=IndexPatternsContract)+ 2 more | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern)+ 82 more | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPatternListItem)+ 6 more | - | +| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField), [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | 8.1 | +| | [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | 8.1 | +| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields), [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/constants/index.ts#:~:text=getKbnTypeNames) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [indexed_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts#:~:text=IndexPatternField)+ 16 more | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType), [utils.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/target/types/public/components/utils.d.ts#:~:text=IFieldType) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/utils.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [breadcrumbs.ts](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/breadcrumbs.ts#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern), [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=IndexPattern)+ 36 more | - | +| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | 8.1 | +| | [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | 8.1 | +| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | 8.1 | +| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=removeScriptedField), [field_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#:~:text=removeScriptedField) | 8.1 | +| | [table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields), [edit_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx#:~:text=getNonScriptedFields) | 8.1 | +| | [scripted_fields_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx#:~:text=getScriptedFields) | 8.1 | @@ -482,20 +482,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType)+ 46 more | 8.1 | -| | [editor.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx#:~:text=indexPatterns), [log_stream.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx#:~:text=indexPatterns), [log_stream.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx#:~:text=indexPatterns), [logs_overview_fetchers.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/utils/logs_overview_fetchers.ts#:~:text=indexPatterns), [redirect_to_node_logs.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx#:~:text=indexPatterns), [use_kibana_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.ts#:~:text=indexPatterns), [page_providers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/page_providers.tsx#:~:text=indexPatterns), [logs_overview_fetches.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts#:~:text=indexPatterns) | - | -| | [kuery_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx#:~:text=esKuery), [kuery_bar.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/utils/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/utils/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/utils/kuery.ts#:~:text=esKuery), [use_waffle_filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts#:~:text=esKuery), [use_waffle_filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts#:~:text=esKuery) | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts#:~:text=esQuery), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts#:~:text=esQuery), [log_filter_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts#:~:text=esQuery), [log_filter_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts#:~:text=esQuery), [log_filter_state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts#:~:text=esQuery) | 8.1 | -| | [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter) | 8.1 | -| | [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType)+ 102 more | 8.1 | -| | [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter) | 8.1 | -| | [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType)+ 46 more | 8.1 | -| | [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter) | 8.1 | -| | [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=indexPatternsServiceFactory), [log_entries_search_strategy.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts#:~:text=indexPatternsServiceFactory), [log_entry_search_strategy.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts#:~:text=indexPatternsServiceFactory) | - | -| | [module_list_card.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list_card.tsx#:~:text=getUrl) | - | -| | [module_list_card.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list_card.tsx#:~:text=getUrl) | - | -| | [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=spacesService), [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=spacesService), [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/plugin.ts#:~:text=spacesService) | 7.16 | -| | [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=getSpaceId), [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=getSpaceId), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/plugin.ts#:~:text=getSpaceId) | 7.16 | +| | [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType)+ 46 more | 8.1 | +| | [editor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx#:~:text=indexPatterns), [log_stream.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx#:~:text=indexPatterns), [log_stream.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx#:~:text=indexPatterns), [logs_overview_fetchers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/utils/logs_overview_fetchers.ts#:~:text=indexPatterns), [redirect_to_node_logs.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx#:~:text=indexPatterns), [use_kibana_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/hooks/use_kibana_index_patterns.ts#:~:text=indexPatterns), [page_providers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/page_providers.tsx#:~:text=indexPatterns), [logs_overview_fetches.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts#:~:text=indexPatterns) | - | +| | [kuery_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx#:~:text=esKuery), [kuery_bar.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/utils/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/utils/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/utils/kuery.ts#:~:text=esKuery), [use_waffle_filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts#:~:text=esKuery), [use_waffle_filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts#:~:text=esKuery) | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts#:~:text=esQuery), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts#:~:text=esQuery), [log_filter_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts#:~:text=esQuery), [log_filter_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts#:~:text=esQuery), [log_filter_state.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts#:~:text=esQuery) | 8.1 | +| | [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter) | 8.1 | +| | [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType)+ 102 more | 8.1 | +| | [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter) | 8.1 | +| | [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [custom_metric_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/metric_control/index.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [custom_field_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/custom_field_panel.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [waffle_group_by_controls.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType), [metric.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/alerting/inventory/components/metric.tsx#:~:text=IFieldType)+ 46 more | 8.1 | +| | [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [log_stream_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable.tsx#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter), [use_dataset_filtering.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_dataset_filtering.ts#:~:text=Filter) | 8.1 | +| | [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=indexPatternsServiceFactory), [log_entries_search_strategy.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts#:~:text=indexPatternsServiceFactory), [log_entry_search_strategy.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts#:~:text=indexPatternsServiceFactory) | - | +| | [module_list_card.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list_card.tsx#:~:text=getUrl) | - | +| | [module_list_card.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list_card.tsx#:~:text=getUrl) | - | +| | [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=spacesService), [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=spacesService), [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/plugin.ts#:~:text=spacesService) | 7.16 | +| | [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=getSpaceId), [kibana_framework_adapter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts#:~:text=getSpaceId), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/infra/server/plugin.ts#:~:text=getSpaceId) | 7.16 | @@ -503,8 +503,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [locator.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ingest_pipelines/public/locator.test.ts#:~:text=getUrl) | - | -| | [locator.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ingest_pipelines/public/locator.test.ts#:~:text=getUrl) | - | +| | [locator.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ingest_pipelines/public/locator.test.ts#:~:text=getUrl) | - | +| | [locator.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ingest_pipelines/public/locator.test.ts#:~:text=getUrl) | - | @@ -512,20 +512,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract)+ 18 more | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern)+ 54 more | - | -| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [list_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx#:~:text=IndexPatternField)+ 14 more | - | -| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=fetch), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=fetch) | 8.1 | -| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=indexPatterns), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=indexPatterns), [controls_tab.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx#:~:text=indexPatterns) | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter)+ 4 more | 8.1 | -| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [list_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx#:~:text=IndexPatternField)+ 14 more | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract)+ 18 more | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern)+ 54 more | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter)+ 4 more | 8.1 | -| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=fetch), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=fetch) | 8.1 | -| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [list_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [list_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx#:~:text=IndexPatternField)+ 2 more | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern)+ 22 more | - | -| | [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter)+ 4 more | 8.1 | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract)+ 18 more | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern)+ 54 more | - | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [list_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx#:~:text=IndexPatternField)+ 14 more | - | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=fetch), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=fetch) | 8.1 | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=indexPatterns), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=indexPatterns), [controls_tab.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/controls_tab.tsx#:~:text=indexPatterns) | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter)+ 4 more | 8.1 | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [list_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx#:~:text=IndexPatternField)+ 14 more | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract), [phrase_filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts#:~:text=IndexPatternsContract)+ 18 more | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern)+ 54 more | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter)+ 4 more | 8.1 | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=fetch), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=fetch) | 8.1 | +| | [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [list_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/list_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [range_control_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/range_control_factory.ts#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPatternField), [list_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/list_control_editor.tsx#:~:text=IndexPatternField)+ 2 more | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [create_search_source.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/create_search_source.ts#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [field_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/field_select.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern), [range_control_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/components/editor/range_control_editor.tsx#:~:text=IndexPattern)+ 22 more | - | +| | [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [filter_manager.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [control.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/control.ts#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [vis_controller.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/vis_controller.tsx#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter), [filter_manager.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/input_control_vis/public/control/filter_manager/filter_manager.test.ts#:~:text=Filter)+ 4 more | 8.1 | @@ -533,8 +533,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [overview.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/kibana_overview/public/components/overview/overview.tsx#:~:text=indexPatterns) | - | -| | [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/kibana_overview/public/application.tsx#:~:text=appBasePath) | - | +| | [overview.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/kibana_overview/public/components/overview/overview.tsx#:~:text=indexPatterns) | - | +| | [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/kibana_overview/public/application.tsx#:~:text=appBasePath) | - | @@ -542,7 +542,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [ops_stats_collector.ts](https://github.com/elastic/kibana/tree/master/src/plugins/kibana_usage_collection/server/collectors/ops_stats/ops_stats_collector.ts#:~:text=process) | - | +| | [ops_stats_collector.ts](https://github.com/elastic/kibana/tree/main/src/plugins/kibana_usage_collection/server/collectors/ops_stats/ops_stats_collector.ts#:~:text=process) | - | @@ -550,30 +550,30 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService) | - | -| | [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract)+ 20 more | - | -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPattern), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPattern)+ 36 more | - | -| | [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField)+ 8 more | - | -| | [datapanel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [datapanel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [datapanel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [datapanel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [indexpattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx#:~:text=indexPatterns), [lens_top_nav.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx#:~:text=indexPatterns), [lens_top_nav.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/plugin.ts#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/plugin.ts#:~:text=indexPatterns) | - | -| | [ranges.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx#:~:text=fieldFormats), [droppable.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/droppable.test.ts#:~:text=fieldFormats) | - | -| | [save_modal_container.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx#:~:text=esFilters), [save_modal_container.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx#:~:text=esFilters), [mocks.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/mocks.tsx#:~:text=esFilters), [mocks.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/mocks.tsx#:~:text=esFilters) | 8.1 | -| | [validation.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esKuery), [validation.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esKuery), [validation.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esKuery) | 8.1 | -| | [validation.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esQuery), [validation.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#:~:text=esQuery), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=esQuery), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=esQuery), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=esQuery), [datapanel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=esQuery), [datapanel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=esQuery)+ 1 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter)+ 16 more | 8.1 | -| | [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField)+ 8 more | - | -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService) | - | -| | [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract)+ 20 more | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/plugin.ts#:~:text=ensureDefaultDataView), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/plugin.ts#:~:text=ensureDefaultDataView) | - | -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPattern), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPattern)+ 36 more | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter)+ 16 more | 8.1 | -| | [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField) | - | -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [loader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPattern), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPattern)+ 13 more | - | -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter)+ 16 more | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/plugin.ts#:~:text=ensureDefaultDataView) | - | -| | [existing_fields.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=indexPatternsServiceFactory), [field_stats.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=indexPatternsServiceFactory) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/types.ts#:~:text=onAppLeave), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/types.ts#:~:text=onAppLeave), [mounter.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/app_plugin/mounter.tsx#:~:text=onAppLeave) | - | -| | [saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts#:~:text=warning), [saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts#:~:text=warning) | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService) | - | +| | [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract)+ 20 more | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPattern), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPattern)+ 36 more | - | +| | [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField)+ 8 more | - | +| | [datapanel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [datapanel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [datapanel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [datapanel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=indexPatterns), [indexpattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx#:~:text=indexPatterns), [lens_top_nav.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx#:~:text=indexPatterns), [lens_top_nav.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=indexPatterns) | - | +| | [ranges.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx#:~:text=fieldFormats), [droppable.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/droppable.test.ts#:~:text=fieldFormats) | - | +| | [save_modal_container.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx#:~:text=esFilters), [save_modal_container.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx#:~:text=esFilters), [mocks.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/mocks.tsx#:~:text=esFilters), [mocks.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/mocks.tsx#:~:text=esFilters) | 8.1 | +| | [validation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esKuery), [validation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esKuery), [validation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esKuery) | 8.1 | +| | [validation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esQuery), [validation.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#:~:text=esQuery), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=esQuery), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=esQuery), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=esQuery), [datapanel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=esQuery), [datapanel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#:~:text=esQuery)+ 1 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter)+ 16 more | 8.1 | +| | [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField)+ 8 more | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService) | - | +| | [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/utils.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract), [loader.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts#:~:text=IndexPatternsContract)+ 20 more | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=ensureDefaultDataView), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=ensureDefaultDataView) | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPattern), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPattern)+ 36 more | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter)+ 16 more | 8.1 | +| | [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField), [field_stats.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#:~:text=IndexPatternField) | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.test.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [existing_fields.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/target/types/server/routes/existing_fields.d.ts#:~:text=IndexPattern), [loader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts#:~:text=IndexPattern), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=IndexPattern)+ 13 more | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService), [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=IndexPatternsService) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/types.ts#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/embeddable/embeddable.tsx#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/state_management/types.ts#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter), [field_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#:~:text=Filter)+ 16 more | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/plugin.ts#:~:text=ensureDefaultDataView) | - | +| | [existing_fields.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/existing_fields.ts#:~:text=indexPatternsServiceFactory), [field_stats.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/routes/field_stats.ts#:~:text=indexPatternsServiceFactory) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/types.ts#:~:text=onAppLeave), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/types.ts#:~:text=onAppLeave), [mounter.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/public/app_plugin/mounter.tsx#:~:text=onAppLeave) | - | +| | [saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts#:~:text=warning), [saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts#:~:text=warning) | - | @@ -581,7 +581,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/license_management/public/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/license_management/public/plugin.ts#:~:text=license%24) | - | @@ -589,8 +589,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/logstash/public/plugin.ts#:~:text=license%24) | - | -| | [save.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/logstash/server/routes/pipeline/save.ts#:~:text=authc) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/logstash/public/plugin.ts#:~:text=license%24) | - | +| | [save.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/logstash/server/routes/pipeline/save.ts#:~:text=authc) | - | @@ -598,7 +598,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/management/public/application.tsx#:~:text=appBasePath), [application.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/management/target/types/public/application.d.ts#:~:text=appBasePath) | - | +| | [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/management/public/application.tsx#:~:text=appBasePath), [application.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/management/target/types/public/application.d.ts#:~:text=appBasePath) | - | @@ -606,31 +606,31 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern)+ 206 more | - | -| | [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField)+ 268 more | - | -| | [es_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | -| | [kibana_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/kibana_services.ts#:~:text=indexPatterns) | - | -| | [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=esFilters), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=esFilters), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=esFilters), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=esFilters), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=esFilters), [es_geo_line_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx#:~:text=esFilters), [es_geo_line_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx#:~:text=esFilters), [es_geo_line_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx#:~:text=esFilters), [app_sync.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/map_page/url_state/app_sync.ts#:~:text=esFilters), [app_sync.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/map_page/url_state/app_sync.ts#:~:text=esFilters)+ 9 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter)+ 105 more | 8.1 | -| | [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField)+ 268 more | - | -| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern)+ 206 more | - | -| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter)+ 105 more | 8.1 | -| | [es_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | -| | [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField)+ 129 more | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern)+ 98 more | - | -| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | -| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter)+ 105 more | 8.1 | -| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | -| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=indexPatternsServiceFactory), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/plugin.ts#:~:text=indexPatternsServiceFactory), [indexing_routes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts#:~:text=indexPatternsServiceFactory) | - | -| | [maps_list_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings), [maps_list_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings), [maps_list_view.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/server/plugin.ts#:~:text=license%24) | - | -| | [render_app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/render_app.tsx#:~:text=onAppLeave), [map_app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx#:~:text=onAppLeave), [map_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/routes/map_page/map_page.tsx#:~:text=onAppLeave), [render_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/render_app.d.ts#:~:text=onAppLeave), [map_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_page.d.ts#:~:text=onAppLeave), [map_app.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=onAppLeave) | - | +| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern)+ 206 more | - | +| | [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField)+ 268 more | - | +| | [es_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | +| | [kibana_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/kibana_services.ts#:~:text=indexPatterns) | - | +| | [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=esFilters), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=esFilters), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=esFilters), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=esFilters), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=esFilters), [es_geo_line_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx#:~:text=esFilters), [es_geo_line_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx#:~:text=esFilters), [es_geo_line_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx#:~:text=esFilters), [app_sync.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/map_page/url_state/app_sync.ts#:~:text=esFilters), [app_sync.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/map_page/url_state/app_sync.ts#:~:text=esFilters)+ 9 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter)+ 105 more | 8.1 | +| | [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField)+ 268 more | - | +| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/lazy_load_bundle/index.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract), [index.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/lazy_load_bundle/index.d.ts#:~:text=IndexPatternsContract) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern)+ 206 more | - | +| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter)+ 105 more | 8.1 | +| | [es_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=fetch) | 8.1 | +| | [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_agg_utils.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/common/elasticsearch_util/es_agg_utils.d.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField), [es_doc_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#:~:text=IndexPatternField)+ 129 more | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/embeddable/types.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [es_agg_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/elasticsearch_util/es_agg_utils.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [agg_field_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/agg_field_types.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [percentile_agg_field.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/fields/agg/percentile_agg_field.ts#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern), [es_geo_grid_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx#:~:text=IndexPattern)+ 98 more | - | +| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService), [create_doc_source.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/create_doc_source.ts#:~:text=IndexPatternsService) | - | +| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/reducers/map/types.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [vector_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter), [es_tooltip_property.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts#:~:text=Filter)+ 105 more | 8.1 | +| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit), [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=flattenHit) | - | +| | [kibana_server_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/kibana_server_services.ts#:~:text=indexPatternsServiceFactory), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/plugin.ts#:~:text=indexPatternsServiceFactory), [indexing_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/data_indexing/indexing_routes.ts#:~:text=indexPatternsServiceFactory) | - | +| | [maps_list_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings), [maps_list_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings), [maps_list_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/list_page/maps_list_view.tsx#:~:text=settings) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/plugin.ts#:~:text=license%24) | - | +| | [render_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/render_app.tsx#:~:text=onAppLeave), [map_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/map_page/map_app/map_app.tsx#:~:text=onAppLeave), [map_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/routes/map_page/map_page.tsx#:~:text=onAppLeave), [render_app.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/render_app.d.ts#:~:text=onAppLeave), [map_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/routes/map_page/map_page.d.ts#:~:text=onAppLeave), [map_app.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/target/types/public/routes/map_page/map_app/map_app.d.ts#:~:text=onAppLeave) | - | @@ -638,19 +638,19 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx#:~:text=indexPatterns), [file_datavisualizer.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx#:~:text=indexPatterns), [app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/app.tsx#:~:text=indexPatterns), [app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/app.tsx#:~:text=indexPatterns), [import_jobs_flyout.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx#:~:text=indexPatterns), [anomaly_charts_embeddable.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable.tsx#:~:text=indexPatterns) | - | -| | [dependency_cache.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/util/dependency_cache.ts#:~:text=fieldFormats), [app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/app.tsx#:~:text=fieldFormats), [dependency_cache.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/target/types/public/application/util/dependency_cache.d.ts#:~:text=fieldFormats) | - | -| | [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter) | 8.1 | -| | [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter) | 8.1 | -| | [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter) | 8.1 | -| | [use_create_url.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [use_create_url.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [main_tabs.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/components/navigation_menu/main_tabs.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [use_view_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx#:~:text=getUrl), [use_map_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx#:~:text=getUrl), [analytics_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx#:~:text=getUrl)+ 14 more | - | -| | [use_create_url.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [use_create_url.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [main_tabs.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/components/navigation_menu/main_tabs.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [use_view_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx#:~:text=getUrl), [use_map_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx#:~:text=getUrl), [analytics_panel.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx#:~:text=getUrl)+ 14 more | - | -| | [check_license.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/license/check_license.tsx#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/plugin.ts#:~:text=license%24) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/server/plugin.ts#:~:text=license%24) | - | -| | [annotations.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/server/routes/annotations.ts#:~:text=authc) | - | -| | [initialization.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/server/saved_objects/initialization/initialization.ts#:~:text=authz), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/server/plugin.ts#:~:text=authz), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/server/plugin.ts#:~:text=authz) | - | -| | [app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/public/application/app.tsx#:~:text=onAppLeave) | - | -| | [errors.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/common/util/errors/errors.test.ts#:~:text=req), [errors.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/ml/common/util/errors/errors.test.ts#:~:text=req) | - | +| | [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx#:~:text=indexPatterns), [file_datavisualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx#:~:text=indexPatterns), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/app.tsx#:~:text=indexPatterns), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/app.tsx#:~:text=indexPatterns), [import_jobs_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx#:~:text=indexPatterns), [anomaly_charts_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable.tsx#:~:text=indexPatterns) | - | +| | [dependency_cache.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/util/dependency_cache.ts#:~:text=fieldFormats), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/app.tsx#:~:text=fieldFormats), [dependency_cache.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/target/types/public/application/util/dependency_cache.d.ts#:~:text=fieldFormats) | - | +| | [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter) | 8.1 | +| | [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter) | 8.1 | +| | [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_influencer_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter), [apply_entity_filters_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/ui_actions/apply_entity_filters_action.tsx#:~:text=Filter) | 8.1 | +| | [use_create_url.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [use_create_url.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [main_tabs.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/components/navigation_menu/main_tabs.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [use_view_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx#:~:text=getUrl), [use_map_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx#:~:text=getUrl), [analytics_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx#:~:text=getUrl)+ 14 more | - | +| | [use_create_url.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [use_create_url.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts#:~:text=getUrl), [main_tabs.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/components/navigation_menu/main_tabs.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [anomaly_detection_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx#:~:text=getUrl), [use_view_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx#:~:text=getUrl), [use_map_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx#:~:text=getUrl), [analytics_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx#:~:text=getUrl), [page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx#:~:text=getUrl)+ 14 more | - | +| | [check_license.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/license/check_license.tsx#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/plugin.ts#:~:text=license%24) | - | +| | [annotations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/routes/annotations.ts#:~:text=authc) | - | +| | [initialization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/saved_objects/initialization/initialization.ts#:~:text=authz), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/plugin.ts#:~:text=authz), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/server/plugin.ts#:~:text=authz) | - | +| | [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/public/application/app.tsx#:~:text=onAppLeave) | - | +| | [errors.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/common/util/errors/errors.test.ts#:~:text=req), [errors.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ml/common/util/errors/errors.test.ts#:~:text=req) | - | @@ -658,15 +658,15 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern)+ 2 more | - | -| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType) | 8.1 | -| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=indexPatterns), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=indexPatterns) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=esKuery) | 8.1 | -| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType) | 8.1 | -| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern)+ 14 more | - | -| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType) | 8.1 | -| | [legacy_shims.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/public/legacy_shims.ts#:~:text=injectedMetadata) | - | -| | [bulk_uploader.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/server/kibana_monitoring/bulk_uploader.ts#:~:text=process) | - | +| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern)+ 2 more | - | +| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType) | 8.1 | +| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=indexPatterns), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=indexPatterns) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=esKuery), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=esKuery) | 8.1 | +| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType) | 8.1 | +| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [with_kuery_autocompletion.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/with_kuery_autocompletion.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/components/kuery_bar/index.tsx#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [kuery.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/lib/kuery.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern), [with_kuery_autocompletion.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/target/types/public/components/kuery_bar/with_kuery_autocompletion.d.ts#:~:text=IIndexPattern)+ 14 more | - | +| | [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType), [use_derived_index_pattern.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/alerts/components/param_details_form/use_derived_index_pattern.tsx#:~:text=IFieldType) | 8.1 | +| | [legacy_shims.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/public/legacy_shims.ts#:~:text=injectedMetadata) | - | +| | [bulk_uploader.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/monitoring/server/kibana_monitoring/bulk_uploader.ts#:~:text=process) | - | @@ -674,21 +674,21 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract) | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 38 more | - | -| | [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec) | - | -| | [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=indexPatterns), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=indexPatterns), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/pages/alerts/index.tsx#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns)+ 5 more | - | -| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters) | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter) | 8.1 | -| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter) | 8.1 | -| | [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec) | - | -| | [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract) | - | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 38 more | - | -| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter) | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter) | 8.1 | -| | [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 14 more | - | -| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter) | 8.1 | -| | [use_discover_link.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_discover_link.tsx#:~:text=urlGenerator) | - | +| | [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 38 more | - | +| | [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec) | - | +| | [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=indexPatterns), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=indexPatterns), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/pages/alerts/index.tsx#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns), [observability_index_patterns.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.test.ts#:~:text=indexPatterns)+ 5 more | - | +| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=esFilters) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter) | 8.1 | +| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter) | 8.1 | +| | [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec), [observability_index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/utils/observability_index_patterns.ts#:~:text=IndexPatternSpec) | - | +| | [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract), [rtl_helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/rtl_helpers.tsx#:~:text=IndexPatternsContract) | - | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 38 more | - | +| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=ExistsFilter) | 8.1 | +| | [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [lens_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern), [default_configs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#:~:text=IndexPattern)+ 14 more | - | +| | [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter), [filter_value_label.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx#:~:text=Filter) | 8.1 | +| | [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_discover_link.tsx#:~:text=urlGenerator) | - | @@ -696,11 +696,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern)+ 2 more | - | -| | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatterns), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatterns) | - | -| | [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern)+ 2 more | - | -| | [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern) | - | -| | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=urlGenerator), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=urlGenerator) | - | +| | [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern)+ 2 more | - | +| | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatterns), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatterns) | - | +| | [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern)+ 2 more | - | +| | [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_errors.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [use_pack_query_last_results.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_pack_query_last_results.ts#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern), [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=IndexPattern) | - | +| | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=urlGenerator), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=urlGenerator) | - | @@ -708,8 +708,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24) | - | -| | [license.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/painless_lab/server/services/license.ts#:~:text=license%24) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24) | - | +| | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/server/services/license.ts#:~:text=license%24) | - | @@ -717,11 +717,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [options_list_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/control_types/options_list/options_list_embeddable.tsx#:~:text=esFilters), [options_list_embeddable.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/control_types/options_list/options_list_embeddable.tsx#:~:text=esFilters) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter) | 8.1 | -| | [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal) | - | +| | [options_list_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/control_types/options_list/options_list_embeddable.tsx#:~:text=esFilters), [options_list_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/control_types/options_list/options_list_embeddable.tsx#:~:text=esFilters) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/input_controls/embeddable/types.ts#:~:text=Filter) | 8.1 | +| | [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal) | - | @@ -729,10 +729,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/region_map/public/plugin.ts#:~:text=fieldFormats) | - | -| | [region_map_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/region_map/public/region_map_fn.ts#:~:text=context) | - | -| | [region_map_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/region_map/public/region_map_fn.ts#:~:text=context) | - | -| | [region_map_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/region_map/public/region_map_fn.ts#:~:text=context) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/region_map/public/plugin.ts#:~:text=fieldFormats) | - | +| | [region_map_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/region_map/public/region_map_fn.ts#:~:text=context) | - | +| | [region_map_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/region_map/public/region_map_fn.ts#:~:text=context) | - | +| | [region_map_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/region_map/public/region_map_fn.ts#:~:text=context) | - | @@ -740,7 +740,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/remote_clusters/server/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/remote_clusters/server/plugin.ts#:~:text=license%24) | - | @@ -748,19 +748,19 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern) | - | -| | [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource) | - | -| | [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern) | - | -| | [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource) | - | -| | [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/plugin.ts#:~:text=fieldFormats) | - | -| | [ilm_policy_link.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/management/ilm_policy_link.tsx#:~:text=getUrl) | - | -| | [ilm_policy_link.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/management/ilm_policy_link.tsx#:~:text=getUrl) | - | -| | [get_csv_panel_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx#:~:text=license%24), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/share_context_menu/index.ts#:~:text=license%24), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/management/index.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/plugin.ts#:~:text=license%24), [get_csv_panel_action.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts#:~:text=license%24) | - | -| | [reporting_usage_collector.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/usage/reporting_usage_collector.ts#:~:text=license%24), [core.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/core.ts#:~:text=license%24) | - | -| | [get_user.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/routes/lib/get_user.ts#:~:text=authc) | - | -| | [core.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/core.ts#:~:text=spacesService), [core.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/core.ts#:~:text=spacesService), [core.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/core.ts#:~:text=spacesService) | 7.16 | -| | [core.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/reporting/server/core.ts#:~:text=getSpaceId) | 7.16 | +| | [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern) | - | +| | [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource) | - | +| | [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern) | - | +| | [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=fieldsFromSource) | - | +| | [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern), [generate_csv.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/export_types/csv_searchsource/generate_csv/generate_csv.ts#:~:text=IndexPattern) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/plugin.ts#:~:text=fieldFormats) | - | +| | [ilm_policy_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/management/ilm_policy_link.tsx#:~:text=getUrl) | - | +| | [ilm_policy_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/management/ilm_policy_link.tsx#:~:text=getUrl) | - | +| | [get_csv_panel_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx#:~:text=license%24), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/share_context_menu/index.ts#:~:text=license%24), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/management/index.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/plugin.ts#:~:text=license%24), [get_csv_panel_action.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts#:~:text=license%24) | - | +| | [reporting_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/usage/reporting_usage_collector.ts#:~:text=license%24), [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=license%24) | - | +| | [get_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/lib/get_user.ts#:~:text=authc) | - | +| | [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=spacesService), [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=spacesService), [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=spacesService) | 7.16 | +| | [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=getSpaceId) | 7.16 | @@ -768,7 +768,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [license.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/rollup/server/services/license.ts#:~:text=license%24) | - | +| | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rollup/server/services/license.ts#:~:text=license%24) | - | @@ -776,12 +776,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/plugin.ts#:~:text=indexPatterns), [saved_object.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/saved_object.test.ts#:~:text=indexPatterns), [saved_object.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/saved_object.test.ts#:~:text=indexPatterns) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/plugin.ts#:~:text=indexPatterns), [saved_object.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/saved_object.test.ts#:~:text=indexPatterns), [saved_object.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/saved_object.test.ts#:~:text=indexPatterns) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract), [hydrate_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/hydrate_index_pattern.ts#:~:text=IndexPatternsContract) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/types.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern), [apply_es_resp.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts#:~:text=IndexPattern) | - | @@ -789,21 +789,21 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=IndexPatternsContract)+ 16 more | - | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern) | - | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec) | - | -| | [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName), [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName) | 8.1 | -| | [saved_objects_table_page.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/saved_objects_table_page.tsx#:~:text=indexPatterns) | - | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec) | - | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=IndexPatternsContract)+ 16 more | - | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern) | - | -| | [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName), [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName) | 8.1 | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern) | - | -| | [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName), [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName) | 8.1 | -| | [service_registry.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/services/service_registry.ts#:~:text=SavedObjectLoader), [service_registry.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/services/service_registry.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=SavedObjectLoader), [create_field_list.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=SavedObjectLoader), [form.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/object_view/components/form.tsx#:~:text=SavedObjectLoader), [form.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/management_section/object_view/components/form.tsx#:~:text=SavedObjectLoader)+ 3 more | - | -| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject) | - | -| | [resolve_import_errors.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts#:~:text=createNewCopy) | - | -| | [resolve_import_errors.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts#:~:text=createNewCopy) | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=IndexPatternsContract)+ 16 more | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern) | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec) | - | +| | [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName), [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName) | 8.1 | +| | [saved_objects_table_page.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/saved_objects_table_page.tsx#:~:text=indexPatterns) | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternSpec) | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [saved_objects_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx#:~:text=IndexPatternsContract), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=IndexPatternsContract)+ 16 more | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern) | - | +| | [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName), [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName) | 8.1 | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern), [flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx#:~:text=IndexPattern) | - | +| | [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName), [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=castEsToKbnFieldTypeName) | 8.1 | +| | [service_registry.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/services/service_registry.ts#:~:text=SavedObjectLoader), [service_registry.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/services/service_registry.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObjectLoader), [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=SavedObjectLoader), [create_field_list.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/create_field_list.ts#:~:text=SavedObjectLoader), [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/object_view/components/form.tsx#:~:text=SavedObjectLoader), [form.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/management_section/object_view/components/form.tsx#:~:text=SavedObjectLoader)+ 3 more | - | +| | [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject), [resolve_saved_objects.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_saved_objects.test.ts#:~:text=SavedObject) | - | +| | [resolve_import_errors.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts#:~:text=createNewCopy) | - | +| | [resolve_import_errors.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts#:~:text=createNewCopy) | - | @@ -811,7 +811,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [request_handler_context.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/saved_objects_tagging/server/request_handler_context.ts#:~:text=authz) | - | +| | [request_handler_context.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/saved_objects_tagging/server/request_handler_context.ts#:~:text=authz) | - | @@ -819,7 +819,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [api.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_tagging_oss/public/api.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_tagging_oss/public/decorator/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_tagging_oss/public/decorator/types.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_tagging_oss/public/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/master/src/plugins/saved_objects_tagging_oss/public/api.ts#:~:text=SavedObject) | - | +| | [api.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_tagging_oss/public/api.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_tagging_oss/public/decorator/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_tagging_oss/public/decorator/types.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_tagging_oss/public/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/src/plugins/saved_objects_tagging_oss/public/api.ts#:~:text=SavedObject) | - | @@ -827,8 +827,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/searchprofiler/server/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/server/plugin.ts#:~:text=license%24) | - | @@ -836,20 +836,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract) | - | -| | [roles_management_app.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=indexPatterns) | - | -| | [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract) | - | -| | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | - | -| | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | - | -| | [license_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | - | -| | [plugin.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/plugin.tsx#:~:text=license%24) | - | -| | [license_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService) | 7.16 | -| | [audit_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/audit/audit_service.ts#:~:text=getSpaceId), [check_privileges_dynamically.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_privileges_dynamically.ts#:~:text=getSpaceId), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=getSpaceId), [check_privileges_dynamically.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_privileges_dynamically.test.ts#:~:text=getSpaceId) | 7.16 | -| | [check_saved_objects_privileges.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.ts#:~:text=namespaceToSpaceId), [secure_saved_objects_client_wrapper.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts#:~:text=namespaceToSpaceId), [secure_saved_objects_client_wrapper.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts#:~:text=namespaceToSpaceId), [secure_saved_objects_client_wrapper.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts#:~:text=namespaceToSpaceId), [check_privileges_dynamically.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_privileges_dynamically.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId)+ 10 more | 7.16 | -| | [account_management_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/account_management/account_management_app.test.ts#:~:text=appBasePath), [access_agreement_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_app.test.ts#:~:text=appBasePath), [logged_out_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/logged_out/logged_out_app.test.ts#:~:text=appBasePath), [login_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/login/login_app.test.ts#:~:text=appBasePath), [logout_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=appBasePath), [overwritten_session_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_app.test.ts#:~:text=appBasePath) | - | -| | [account_management_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/account_management/account_management_app.test.ts#:~:text=onAppLeave), [access_agreement_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_app.test.ts#:~:text=onAppLeave), [logged_out_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/logged_out/logged_out_app.test.ts#:~:text=onAppLeave), [login_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/login/login_app.test.ts#:~:text=onAppLeave), [logout_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=onAppLeave), [overwritten_session_app.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_app.test.ts#:~:text=onAppLeave) | - | +| | [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract) | - | +| | [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=indexPatterns) | - | +| | [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract), [edit_role_page.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/target/types/public/management/roles/edit_role/edit_role_page.d.ts#:~:text=IndexPatternsContract) | - | +| | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | - | +| | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | - | +| | [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) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=license%24) | - | +| | [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) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=spacesService) | 7.16 | +| | [audit_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/audit/audit_service.ts#:~:text=getSpaceId), [check_privileges_dynamically.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_privileges_dynamically.ts#:~:text=getSpaceId), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=getSpaceId), [check_privileges_dynamically.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_privileges_dynamically.test.ts#:~:text=getSpaceId) | 7.16 | +| | [check_saved_objects_privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.ts#:~:text=namespaceToSpaceId), [secure_saved_objects_client_wrapper.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts#:~:text=namespaceToSpaceId), [secure_saved_objects_client_wrapper.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts#:~:text=namespaceToSpaceId), [secure_saved_objects_client_wrapper.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts#:~:text=namespaceToSpaceId), [check_privileges_dynamically.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_privileges_dynamically.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId), [check_saved_objects_privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/check_saved_objects_privileges.test.ts#:~:text=namespaceToSpaceId)+ 10 more | 7.16 | +| | [account_management_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/account_management/account_management_app.test.ts#:~:text=appBasePath), [access_agreement_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_app.test.ts#:~:text=appBasePath), [logged_out_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logged_out/logged_out_app.test.ts#:~:text=appBasePath), [login_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/login/login_app.test.ts#:~:text=appBasePath), [logout_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=appBasePath), [overwritten_session_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_app.test.ts#:~:text=appBasePath) | - | +| | [account_management_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/account_management/account_management_app.test.ts#:~:text=onAppLeave), [access_agreement_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/access_agreement/access_agreement_app.test.ts#:~:text=onAppLeave), [logged_out_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logged_out/logged_out_app.test.ts#:~:text=onAppLeave), [login_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/login/login_app.test.ts#:~:text=onAppLeave), [logout_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=onAppLeave), [overwritten_session_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/overwritten_session/overwritten_session_app.test.ts#:~:text=onAppLeave) | - | @@ -857,28 +857,28 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [use_risky_hosts_dashboard_button_href.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_risky_hosts_dashboard_button_href.ts#:~:text=dashboardUrlGenerator), [use_risky_hosts_dashboard_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_risky_hosts_dashboard_links.tsx#:~:text=dashboardUrlGenerator), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=dashboardUrlGenerator) | - | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern)+ 30 more | - | -| | [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#:~:text=IIndexPattern)+ 74 more | - | -| | [middleware.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/plugin.tsx#:~:text=indexPatterns), [dependencies_start_mock.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/mock/endpoint/dependencies_start_mock.ts#:~:text=indexPatterns) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx#:~:text=esFilters), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters)+ 14 more | 8.1 | -| | [expandable_network.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/side_panel/network_details/expandable_network.tsx#:~:text=esQuery), [expandable_network.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/side_panel/network_details/expandable_network.tsx#:~:text=esQuery), [events_viewer.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#:~:text=esQuery), [events_viewer.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx#:~:text=esQuery)+ 30 more | 8.1 | -| | [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter)+ 167 more | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#:~:text=IIndexPattern)+ 158 more | - | -| | [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField) | - | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern)+ 30 more | - | -| | [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter)+ 167 more | 8.1 | -| | [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField) | - | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern)+ 10 more | - | -| | [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter)+ 167 more | 8.1 | -| | [policy_config.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode)+ 4 more | - | -| | [policy_config.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode)+ 4 more | - | -| | [create_signals_migration_route.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts#:~:text=authc), [delete_signals_migration_route.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts#:~:text=authc), [finalize_signals_migration_route.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts#:~:text=authc), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts#:~:text=authc) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/plugin.ts#:~:text=spacesService) | 7.16 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/plugin.ts#:~:text=getSpaceId), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/plugin.ts#:~:text=getSpaceId) | 7.16 | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/index.tsx#:~:text=onAppLeave) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/index.tsx#:~:text=AppLeaveHandler), [routes.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/routes.tsx#:~:text=AppLeaveHandler), [routes.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/routes.tsx#:~:text=AppLeaveHandler)+ 3 more | - | +| | [use_risky_hosts_dashboard_button_href.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_risky_hosts_dashboard_button_href.ts#:~:text=dashboardUrlGenerator), [use_risky_hosts_dashboard_links.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_risky_hosts_dashboard_links.tsx#:~:text=dashboardUrlGenerator), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=dashboardUrlGenerator) | - | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern)+ 30 more | - | +| | [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#:~:text=IIndexPattern)+ 74 more | - | +| | [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=indexPatterns), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/plugin.tsx#:~:text=indexPatterns), [dependencies_start_mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/mock/endpoint/dependencies_start_mock.ts#:~:text=indexPatterns) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx#:~:text=esFilters), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters), [epic.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/epic.ts#:~:text=esFilters)+ 14 more | 8.1 | +| | [expandable_network.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/side_panel/network_details/expandable_network.tsx#:~:text=esQuery), [expandable_network.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/side_panel/network_details/expandable_network.tsx#:~:text=esQuery), [events_viewer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#:~:text=esQuery), [events_viewer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx#:~:text=esQuery)+ 30 more | 8.1 | +| | [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter)+ 167 more | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [action.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx#:~:text=IIndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#:~:text=IIndexPattern)+ 158 more | - | +| | [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField) | - | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern)+ 30 more | - | +| | [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter)+ 167 more | 8.1 | +| | [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField), [field_name_cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/table/field_name_cell.tsx#:~:text=IndexPatternField) | - | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/helpers.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [entry_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/entry_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern), [list_item.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/threat_match/list_item.tsx#:~:text=IndexPattern)+ 10 more | - | +| | [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/model.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/actions.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [selectors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/store/inputs/selectors.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts#:~:text=Filter)+ 167 more | 8.1 | +| | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode)+ 4 more | - | +| | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode), [isolation.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts#:~:text=mode)+ 4 more | - | +| | [create_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts#:~:text=authc), [delete_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts#:~:text=authc), [finalize_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts#:~:text=authc), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts#:~:text=authc) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=spacesService), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=spacesService) | 7.16 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=getSpaceId), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=getSpaceId) | 7.16 | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/index.tsx#:~:text=onAppLeave) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/home/index.tsx#:~:text=AppLeaveHandler), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/home/index.tsx#:~:text=AppLeaveHandler), [routes.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/routes.tsx#:~:text=AppLeaveHandler), [routes.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/app/routes.tsx#:~:text=AppLeaveHandler)+ 3 more | - | @@ -886,7 +886,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [license.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/snapshot_restore/server/services/license.ts#:~:text=license%24) | - | +| | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/snapshot_restore/server/services/license.ts#:~:text=license%24) | - | @@ -894,9 +894,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24) | - | -| | [copy_to_space_flyout_internal.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx#:~:text=createNewCopy) | - | -| | [copy_to_space_flyout_internal.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx#:~:text=createNewCopy) | - | +| | [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24) | - | +| | [copy_to_space_flyout_internal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx#:~:text=createNewCopy) | - | +| | [copy_to_space_flyout_internal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx#:~:text=createNewCopy) | - | @@ -904,20 +904,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract) | - | -| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern) | - | -| | [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern)+ 1 more | - | -| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType)+ 16 more | 8.1 | -| | [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=indexPatterns), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns) | - | -| | [expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/threshold/expression.tsx#:~:text=fieldFormats) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esKuery) | 8.1 | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esQuery) | 8.1 | -| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType)+ 42 more | 8.1 | -| | [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern)+ 12 more | - | -| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract) | - | -| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern) | - | -| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType)+ 16 more | 8.1 | -| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern) | - | +| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract) | - | +| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern) | - | +| | [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern)+ 1 more | - | +| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType)+ 16 more | 8.1 | +| | [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=indexPatterns), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=indexPatterns) | - | +| | [expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/threshold/expression.tsx#:~:text=fieldFormats) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esKuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esKuery) | 8.1 | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=esQuery) | 8.1 | +| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType)+ 42 more | 8.1 | +| | [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [entity_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [boundary_index_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/index.tsx#:~:text=IIndexPattern)+ 12 more | - | +| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPatternsContract) | - | +| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern) | - | +| | [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/single_field_select.tsx#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType), [single_field_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/single_field_select.d.ts#:~:text=IFieldType)+ 16 more | 8.1 | +| | [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.tsx#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern), [geo_index_pattern_select.d.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/stack_alerts/target/types/public/alert_types/geo_containment/query_builder/util_components/geo_index_pattern_select.d.ts#:~:text=IndexPattern) | - | @@ -925,10 +925,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/tile_map/public/plugin.ts#:~:text=fieldFormats) | - | -| | [tile_map_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/tile_map/public/tile_map_fn.ts#:~:text=context) | - | -| | [tile_map_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/tile_map/public/tile_map_fn.ts#:~:text=context) | - | -| | [tile_map_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/tile_map/public/tile_map_fn.ts#:~:text=context) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/tile_map/public/plugin.ts#:~:text=fieldFormats) | - | +| | [tile_map_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/tile_map/public/tile_map_fn.ts#:~:text=context) | - | +| | [tile_map_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/tile_map/public/tile_map_fn.ts#:~:text=context) | - | +| | [tile_map_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/tile_map/public/tile_map_fn.ts#:~:text=context) | - | @@ -936,15 +936,15 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType) | 8.1 | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx#:~:text=esQuery) | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter)+ 5 more | 8.1 | -| | [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern)+ 8 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter)+ 5 more | 8.1 | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType) | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter)+ 5 more | 8.1 | -| | [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType), [index.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType) | 8.1 | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType) | 8.1 | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx#:~:text=esQuery), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx#:~:text=esQuery) | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter)+ 5 more | 8.1 | +| | [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/container/source/index.tsx#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/mock/index_pattern.ts#:~:text=IIndexPattern), [helpers.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#:~:text=IIndexPattern)+ 8 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter)+ 5 more | 8.1 | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType) | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/cells/index.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/store.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [model.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/store/t_grid/model.ts#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/body/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#:~:text=Filter)+ 5 more | 8.1 | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/common/types/timeline/columns/index.tsx#:~:text=IFieldSubType) | 8.1 | @@ -952,20 +952,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract) | - | -| | [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern)+ 30 more | - | -| | [es_index_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern) | - | -| | [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes) | - | -| | [step_create_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_create/step_create_form.tsx#:~:text=indexPatterns), [step_details_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx#:~:text=indexPatterns), [use_search_items.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/use_search_items.ts#:~:text=indexPatterns), [use_clone_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/transform_management/components/action_clone/use_clone_action.tsx#:~:text=indexPatterns), [use_action_discover.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/transform_management/components/action_discover/use_action_discover.tsx#:~:text=indexPatterns), [edit_transform_flyout_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/edit_transform_flyout_form.tsx#:~:text=indexPatterns), [use_edit_action.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/transform_management/components/action_edit/use_edit_action.tsx#:~:text=indexPatterns) | - | -| | [use_search_bar.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esKuery), [use_search_bar.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esKuery), [use_search_bar.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esKuery) | 8.1 | -| | [use_search_bar.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esQuery), [use_search_bar.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esQuery), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=esQuery), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=esQuery), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=esQuery) | 8.1 | -| | [es_index_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern) | - | -| | [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes) | - | -| | [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract) | - | -| | [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern)+ 30 more | - | -| | [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes) | - | -| | [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern)+ 10 more | - | -| | [license.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/transform/server/services/license.ts#:~:text=license%24) | - | +| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract) | - | +| | [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern)+ 30 more | - | +| | [es_index_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern) | - | +| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes) | - | +| | [step_create_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_create/step_create_form.tsx#:~:text=indexPatterns), [step_details_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx#:~:text=indexPatterns), [use_search_items.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/use_search_items.ts#:~:text=indexPatterns), [use_clone_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/transform_management/components/action_clone/use_clone_action.tsx#:~:text=indexPatterns), [use_action_discover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/transform_management/components/action_discover/use_action_discover.tsx#:~:text=indexPatterns), [edit_transform_flyout_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/transform_management/components/edit_transform_flyout/edit_transform_flyout_form.tsx#:~:text=indexPatterns), [use_edit_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/transform_management/components/action_edit/use_edit_action.tsx#:~:text=indexPatterns) | - | +| | [use_search_bar.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esKuery), [use_search_bar.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esKuery), [use_search_bar.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esKuery) | 8.1 | +| | [use_search_bar.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esQuery), [use_search_bar.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/hooks/use_search_bar.ts#:~:text=esQuery), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=esQuery), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=esQuery), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=esQuery) | 8.1 | +| | [es_index_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [es_index_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/services/es_index_service.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern), [transforms.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/transforms.ts#:~:text=IIndexPattern) | - | +| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes) | - | +| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternsContract) | - | +| | [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern)+ 30 more | - | +| | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_search_items/common.ts#:~:text=IndexPatternAttributes) | - | +| | [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [index_pattern.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/common/types/index_pattern.ts#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [wizard.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/wizard/wizard.tsx#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [get_pivot_dropdown_options.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/get_pivot_dropdown_options.ts#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern), [filter_agg_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_agg_form.tsx#:~:text=IndexPattern)+ 10 more | - | +| | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/services/license.ts#:~:text=license%24) | - | @@ -973,9 +973,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [external_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/public/application/components/overview/fix_logs_step/external_links.tsx#:~:text=getUrl), [app_context.mock.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/app_context.mock.ts#:~:text=getUrl) | - | -| | [external_links.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/public/application/components/overview/fix_logs_step/external_links.tsx#:~:text=getUrl), [app_context.mock.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/app_context.mock.ts#:~:text=getUrl) | - | -| | [reindex_service.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24) | - | +| | [external_links.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/public/application/components/overview/fix_logs_step/external_links.tsx#:~:text=getUrl), [app_context.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/app_context.mock.ts#:~:text=getUrl) | - | +| | [external_links.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/public/application/components/overview/fix_logs_step/external_links.tsx#:~:text=getUrl), [app_context.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/app_context.mock.ts#:~:text=getUrl) | - | +| | [reindex_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24) | - | @@ -983,10 +983,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern) | - | -| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=indexPatterns) | - | -| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern) | - | -| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern) | - | +| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern) | - | +| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=indexPatterns) | - | +| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern) | - | +| | [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [uptime_index_pattern_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/contexts/uptime_index_pattern_context.tsx#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern), [update_kuery_string.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts#:~:text=IndexPattern) | - | @@ -994,9 +994,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | -| | [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | -| | [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | +| | [context_variables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | +| | [context_variables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | +| | [context_variables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [context_variables.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/context_variables.ts#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [url_drilldown.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.tsx#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter), [data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/drilldowns/url_drilldown/public/lib/test/data.ts#:~:text=Filter) | 8.1 | @@ -1004,14 +1004,14 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_params.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params.tsx#:~:text=IndexPattern)+ 24 more | - | -| | [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [top_field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/top_field.tsx#:~:text=IndexPatternField)+ 38 more | - | -| | [reducers.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [sidebar.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx#:~:text=toJSON) | 8.1 | -| | [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [top_field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/top_field.tsx#:~:text=IndexPatternField)+ 38 more | - | -| | [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_params.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params.tsx#:~:text=IndexPattern)+ 24 more | - | -| | [reducers.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [sidebar.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx#:~:text=toJSON) | 8.1 | -| | [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [top_field.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/controls/top_field.tsx#:~:text=IndexPatternField)+ 14 more | - | -| | [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_params.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_default_editor/public/components/agg_params.tsx#:~:text=IndexPattern)+ 7 more | - | +| | [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_params.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params.tsx#:~:text=IndexPattern)+ 24 more | - | +| | [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [top_field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/top_field.tsx#:~:text=IndexPatternField)+ 38 more | - | +| | [reducers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [sidebar.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx#:~:text=toJSON) | 8.1 | +| | [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [top_field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/top_field.tsx#:~:text=IndexPatternField)+ 38 more | - | +| | [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_params.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params.tsx#:~:text=IndexPattern)+ 24 more | - | +| | [reducers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [reducers.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts#:~:text=toJSON), [sidebar.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx#:~:text=toJSON) | 8.1 | +| | [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_type_field_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_field_filters.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [agg_param_props.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_param_props.ts#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/field.tsx#:~:text=IndexPatternField), [top_field.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/controls/top_field.tsx#:~:text=IndexPatternField)+ 14 more | - | +| | [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [agg_type_filters.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/agg_filters/agg_type_filters.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [editor_config.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/utils/editor_config.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_params_helper.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params_helper.ts#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_select.tsx#:~:text=IndexPattern), [agg_params.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_default_editor/public/components/agg_params.tsx#:~:text=IndexPattern)+ 7 more | - | @@ -1019,8 +1019,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [get_layers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/utils/get_layers.test.ts#:~:text=fieldFormats)+ 5 more | - | -| | [pie_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_fn.ts#:~:text=Render), [pie_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/pie/public/pie_fn.ts#:~:text=Render) | - | +| | [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [pie_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_component.tsx#:~:text=fieldFormats), [get_layers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/utils/get_layers.test.ts#:~:text=fieldFormats)+ 5 more | - | +| | [pie_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_fn.ts#:~:text=Render), [pie_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/pie/public/pie_fn.ts#:~:text=Render) | - | @@ -1028,7 +1028,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/table/public/plugin.ts#:~:text=fieldFormats) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/table/public/plugin.ts#:~:text=fieldFormats) | - | @@ -1036,16 +1036,16 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/plugin.ts#:~:text=indexPatterns) | - | -| | [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams) | 8.1 | -| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=esQuery), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=esQuery), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=esQuery) | 8.1 | -| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter) | 8.1 | -| | [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract) | - | -| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter) | 8.1 | -| | [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams) | 8.1 | -| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter) | 8.1 | -| | [run.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timelion/server/routes/run.ts#:~:text=indexPatternsServiceFactory) | - | +| | [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/plugin.ts#:~:text=indexPatterns) | - | +| | [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams) | 8.1 | +| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=esQuery), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=esQuery), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=esQuery) | 8.1 | +| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter) | 8.1 | +| | [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [plugin_services.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract), [timelion_expression_input_helpers.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_expression_input_helpers.test.ts#:~:text=IndexPatternsContract) | - | +| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter) | 8.1 | +| | [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_renderer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams), [timelion_vis_component.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx#:~:text=RangeFilterParams) | 8.1 | +| | [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter), [timelion_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts#:~:text=Filter) | 8.1 | +| | [run.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timelion/server/routes/run.ts#:~:text=indexPatternsServiceFactory) | - | @@ -1053,28 +1053,28 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | -| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 40 more | - | -| | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=indexPatterns), [combo_box_select.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/index_pattern_select/combo_box_select.tsx#:~:text=indexPatterns), [query_bar_wrapper.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/query_bar_wrapper.tsx#:~:text=indexPatterns), [annotation_row.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx#:~:text=indexPatterns), [metrics_type.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/metrics_type.ts#:~:text=indexPatterns), [convert_series_to_datatable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts#:~:text=indexPatterns), [timeseries_vis_renderer.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/timeseries_vis_renderer.tsx#:~:text=indexPatterns) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/plugin.ts#:~:text=fieldFormats) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig) | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter) | 8.1 | -| | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField)+ 2 more | - | -| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | -| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 40 more | - | -| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig) | 8.1 | -| | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField) | - | -| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 15 more | - | -| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | -| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/plugin.ts#:~:text=fieldFormats) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig) | 8.1 | -| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/timeseries/server/plugin.ts#:~:text=indexPatternsServiceFactory) | - | +| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | +| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 40 more | - | +| | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=indexPatterns), [combo_box_select.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/index_pattern_select/combo_box_select.tsx#:~:text=indexPatterns), [query_bar_wrapper.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/query_bar_wrapper.tsx#:~:text=indexPatterns), [annotation_row.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/annotation_row.tsx#:~:text=indexPatterns), [metrics_type.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/metrics_type.ts#:~:text=indexPatterns), [convert_series_to_datatable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.ts#:~:text=indexPatterns), [timeseries_vis_renderer.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/timeseries_vis_renderer.tsx#:~:text=indexPatterns) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/plugin.ts#:~:text=fieldFormats) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig) | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter) | 8.1 | +| | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField)+ 2 more | - | +| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | +| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 40 more | - | +| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig) | 8.1 | +| | [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField), [convert_series_to_datatable.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/components/lib/convert_series_to_datatable.test.ts#:~:text=IndexPatternField) | - | +| | [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [cached_index_pattern_fetcher.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern), [index_patterns_utils.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/index_patterns_utils.test.ts#:~:text=IndexPattern)+ 15 more | - | +| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [default_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/default_search_strategy.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [cached_index_pattern_fetcher.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [rollup_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/types.ts#:~:text=IndexPatternsService)+ 44 more | - | +| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/plugin.ts#:~:text=fieldFormats) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter), [index.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/common/types/index.ts#:~:text=Filter) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/types.ts#:~:text=EsQueryConfig) | 8.1 | +| | [abstract_search_strategy.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts#:~:text=getNonScriptedFields), [fetch_fields.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/public/application/lib/fetch_fields.ts#:~:text=getNonScriptedFields) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/timeseries/server/plugin.ts#:~:text=indexPatternsServiceFactory) | - | @@ -1082,16 +1082,16 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern) | - | -| | [search_api.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/data_model/search_api.ts#:~:text=indexPatterns), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=indexPatterns), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=indexPatterns), [search_api.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/data_model/search_api.test.ts#:~:text=indexPatterns), [search_api.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/data_model/search_api.test.ts#:~:text=indexPatterns), [search_api.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/data_model/search_api.test.ts#:~:text=indexPatterns), [view.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts#:~:text=indexPatterns) | - | -| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=esQuery), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=esQuery), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=esQuery) | 8.1 | -| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter) | 8.1 | -| | [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern) | - | -| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter) | 8.1 | -| | [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern) | - | -| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/plugin.ts#:~:text=injectedMetadata) | - | -| | [search_api.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/data_model/search_api.ts#:~:text=injectedMetadata), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/public/plugin.ts#:~:text=injectedMetadata), [search_api.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vega/target/types/public/data_model/search_api.d.ts#:~:text=injectedMetadata) | - | +| | [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern) | - | +| | [search_api.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/data_model/search_api.ts#:~:text=indexPatterns), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=indexPatterns), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=indexPatterns), [search_api.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/data_model/search_api.test.ts#:~:text=indexPatterns), [search_api.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/data_model/search_api.test.ts#:~:text=indexPatterns), [search_api.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/data_model/search_api.test.ts#:~:text=indexPatterns), [view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts#:~:text=indexPatterns) | - | +| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=esQuery), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=esQuery), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=esQuery) | 8.1 | +| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter) | 8.1 | +| | [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern) | - | +| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter) | 8.1 | +| | [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern), [extract_index_pattern.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/lib/extract_index_pattern.ts#:~:text=IndexPattern) | - | +| | [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter), [vega_request_handler.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/vega_request_handler.ts#:~:text=Filter) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/plugin.ts#:~:text=injectedMetadata) | - | +| | [search_api.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/data_model/search_api.ts#:~:text=injectedMetadata), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/public/plugin.ts#:~:text=injectedMetadata), [search_api.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vega/target/types/public/data_model/search_api.d.ts#:~:text=injectedMetadata) | - | @@ -1099,7 +1099,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/vislib/public/plugin.ts#:~:text=fieldFormats) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/vislib/public/plugin.ts#:~:text=fieldFormats) | - | @@ -1107,11 +1107,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/xy/public/plugin.ts#:~:text=fieldFormats) | - | -| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=context) | - | -| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=Render), [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=Render) | - | -| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=context) | - | -| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/master/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=context) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/xy/public/plugin.ts#:~:text=fieldFormats) | - | +| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=context) | - | +| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=Render), [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=Render) | - | +| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=context) | - | +| | [xy_vis_fn.ts](https://github.com/elastic/kibana/tree/main/src/plugins/vis_types/xy/public/expression_functions/xy_vis_fn.ts#:~:text=context) | - | @@ -1119,23 +1119,23 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract) | - | -| | [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern)+ 10 more | - | -| | [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=toJSON) | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/plugin.ts#:~:text=indexPatterns) | - | -| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=esFilters), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=esFilters) | 8.1 | -| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter) | 8.1 | -| | [controls_references.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/utils/saved_visualization_references/controls_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [controls_references.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/utils/saved_visualization_references/controls_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [timeseries_references.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/utils/saved_visualization_references/timeseries_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [timeseries_references.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/utils/saved_visualization_references/timeseries_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [controls_references.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/utils/saved_visualization_references/controls_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE)+ 8 more | - | -| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract) | - | -| | [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern)+ 10 more | - | -| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter) | 8.1 | -| | [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=toJSON) | 8.1 | -| | [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern) | - | -| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter) | 8.1 | -| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=__LEGACY), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=__LEGACY) | - | -| | [find_list_items.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/find_list_items.ts#:~:text=SavedObjectLoader), [find_list_items.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/find_list_items.ts#:~:text=SavedObjectLoader), [saved_visualizations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts#:~:text=SavedObjectLoader), [saved_visualizations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts#:~:text=SavedObjectLoader), [saved_visualizations.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts#:~:text=SavedObjectLoader) | - | -| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject), [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject) | - | -| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObjectClass) | - | +| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract) | - | +| | [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern)+ 10 more | - | +| | [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=toJSON) | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/plugin.ts#:~:text=indexPatterns) | - | +| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=esFilters), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=esFilters) | 8.1 | +| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter) | 8.1 | +| | [controls_references.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/utils/saved_visualization_references/controls_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [controls_references.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/utils/saved_visualization_references/controls_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [timeseries_references.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/utils/saved_visualization_references/timeseries_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [timeseries_references.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/utils/saved_visualization_references/timeseries_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [visualization_saved_object_migrations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE), [controls_references.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/utils/saved_visualization_references/controls_references.ts#:~:text=INDEX_PATTERN_SAVED_OBJECT_TYPE)+ 8 more | - | +| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=IndexPatternsContract) | - | +| | [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern)+ 10 more | - | +| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter) | 8.1 | +| | [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=toJSON) | 8.1 | +| | [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/vis_types/types.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [create_vis_embeddable_from_object.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=IndexPattern) | - | +| | [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter), [visualize_embeddable.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts#:~:text=Filter) | 8.1 | +| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=__LEGACY), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=__LEGACY) | - | +| | [find_list_items.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/find_list_items.ts#:~:text=SavedObjectLoader), [find_list_items.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/find_list_items.ts#:~:text=SavedObjectLoader), [saved_visualizations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts#:~:text=SavedObjectLoader), [saved_visualizations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts#:~:text=SavedObjectLoader), [saved_visualizations.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts#:~:text=SavedObjectLoader) | - | +| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject), [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObject) | - | +| | [_saved_vis.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts#:~:text=SavedObjectClass) | - | @@ -1143,19 +1143,19 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern) | - | -| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=indexPatterns), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=indexPatterns) | - | -| | [use_visualize_app_state.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx#:~:text=esFilters), [use_visualize_app_state.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx#:~:text=esFilters), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=esFilters), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=esFilters), [get_visualize_list_item_link.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts#:~:text=esFilters), [get_visualize_list_item_link.test.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts#:~:text=esFilters) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter)+ 6 more | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=ensureDefaultDataView), [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=ensureDefaultDataView) | - | -| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern) | - | -| | [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/common/locator.ts#:~:text=isFilterPinned), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/common/locator.ts#:~:text=isFilterPinned), [locator.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/common/locator.ts#:~:text=isFilterPinned) | 8.1 | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter)+ 6 more | 8.1 | -| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter)+ 6 more | 8.1 | -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/plugin.ts#:~:text=ensureDefaultDataView) | - | -| | [visualize_listing.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_listing.tsx#:~:text=settings), [visualize_listing.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_listing.tsx#:~:text=settings) | - | -| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=onAppLeave), [visualize_editor_common.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/components/visualize_editor_common.tsx#:~:text=onAppLeave), [app.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/app.tsx#:~:text=onAppLeave), [index.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/public/application/index.tsx#:~:text=onAppLeave), [app.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/app.d.ts#:~:text=onAppLeave), [index.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/index.d.ts#:~:text=onAppLeave), [visualize_editor_common.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/components/visualize_editor_common.d.ts#:~:text=onAppLeave), [visualize_top_nav.d.ts](https://github.com/elastic/kibana/tree/master/src/plugins/visualize/target/types/public/application/components/visualize_top_nav.d.ts#:~:text=onAppLeave) | - | +| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern) | - | +| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=indexPatterns), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=indexPatterns), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=indexPatterns) | - | +| | [use_visualize_app_state.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx#:~:text=esFilters), [use_visualize_app_state.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.tsx#:~:text=esFilters), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=esFilters), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=esFilters), [get_visualize_list_item_link.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts#:~:text=esFilters), [get_visualize_list_item_link.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts#:~:text=esFilters) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter)+ 6 more | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=ensureDefaultDataView), [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=ensureDefaultDataView) | - | +| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern) | - | +| | [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/common/locator.ts#:~:text=isFilterPinned), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/common/locator.ts#:~:text=isFilterPinned), [locator.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/common/locator.ts#:~:text=isFilterPinned) | 8.1 | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter)+ 6 more | 8.1 | +| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern), [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=IndexPattern) | - | +| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/types.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [utils.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/utils.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [use_linked_search_updates.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter), [types.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/types.d.ts#:~:text=Filter)+ 6 more | 8.1 | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/plugin.ts#:~:text=ensureDefaultDataView) | - | +| | [visualize_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_listing.tsx#:~:text=settings), [visualize_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_listing.tsx#:~:text=settings) | - | +| | [visualize_top_nav.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_top_nav.tsx#:~:text=onAppLeave), [visualize_editor_common.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/components/visualize_editor_common.tsx#:~:text=onAppLeave), [app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/app.tsx#:~:text=onAppLeave), [index.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/public/application/index.tsx#:~:text=onAppLeave), [app.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/app.d.ts#:~:text=onAppLeave), [index.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/index.d.ts#:~:text=onAppLeave), [visualize_editor_common.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/components/visualize_editor_common.d.ts#:~:text=onAppLeave), [visualize_top_nav.d.ts](https://github.com/elastic/kibana/tree/main/src/plugins/visualize/target/types/public/application/components/visualize_top_nav.d.ts#:~:text=onAppLeave) | - | @@ -1163,4 +1163,4 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | - | \ No newline at end of file +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | - | \ No newline at end of file diff --git a/api_docs/elastic_apm_synthtrace.json b/api_docs/elastic_apm_synthtrace.json new file mode 100644 index 0000000000000..13d950c53a8df --- /dev/null +++ b/api_docs/elastic_apm_synthtrace.json @@ -0,0 +1,321 @@ +{ + "id": "@elastic/apm-synthtrace", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getBreakdownMetrics", + "type": "Function", + "tags": [], + "label": "getBreakdownMetrics", + "description": [], + "signature": [ + "(events: ", + "Fields", + "[]) => ", + "Fields", + "[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/utils/get_breakdown_metrics.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getBreakdownMetrics.$1", + "type": "Array", + "tags": [], + "label": "events", + "description": [], + "signature": [ + "Fields", + "[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/utils/get_breakdown_metrics.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getObserverDefaults", + "type": "Function", + "tags": [], + "label": "getObserverDefaults", + "description": [], + "signature": [ + "() => ", + "Fields" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/defaults/get_observer_defaults.ts", + "deprecated": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getSpanDestinationMetrics", + "type": "Function", + "tags": [], + "label": "getSpanDestinationMetrics", + "description": [], + "signature": [ + "(events: ", + "Fields", + "[]) => { \"metricset.name\": string; 'span.destination.service.response_time.sum.us': number; 'span.destination.service.response_time.count': number; '@timestamp'?: number | undefined; 'agent.name'?: string | undefined; 'agent.version'?: string | undefined; 'container.id'?: string | undefined; 'ecs.version'?: string | undefined; 'event.outcome'?: string | undefined; 'event.ingested'?: number | undefined; 'error.id'?: string | undefined; 'error.exception'?: ", + "Exception", + "[] | undefined; 'error.grouping_name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'host.name'?: string | undefined; 'observer.version'?: string | undefined; 'observer.version_major'?: number | undefined; 'parent.id'?: string | undefined; 'processor.event'?: string | undefined; 'processor.name'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.id'?: string | undefined; 'transaction.duration.us'?: number | undefined; 'transaction.duration.histogram'?: { values: number[]; counts: number[]; } | undefined; 'transaction.sampled'?: true | undefined; 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'service.node.name'?: string | undefined; 'span.id'?: string | undefined; 'span.name'?: string | undefined; 'span.type'?: string | undefined; 'span.subtype'?: string | undefined; 'span.duration.us'?: number | undefined; 'span.destination.service.name'?: string | undefined; 'span.destination.service.resource'?: string | undefined; 'span.destination.service.type'?: string | undefined; 'span.self_time.count'?: number | undefined; 'span.self_time.sum.us'?: number | undefined; 'system.process.memory.size'?: number | undefined; 'system.memory.actual.free'?: number | undefined; 'system.memory.total'?: number | undefined; 'system.cpu.total.norm.pct'?: number | undefined; 'system.process.memory.rss.bytes'?: number | undefined; 'system.process.cpu.total.norm.pct'?: number | undefined; }[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/utils/get_span_destination_metrics.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getSpanDestinationMetrics.$1", + "type": "Array", + "tags": [], + "label": "events", + "description": [], + "signature": [ + "Fields", + "[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/utils/get_span_destination_metrics.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getTransactionMetrics", + "type": "Function", + "tags": [], + "label": "getTransactionMetrics", + "description": [], + "signature": [ + "(events: ", + "Fields", + "[]) => { 'transaction.duration.histogram': { values: number[]; counts: number[]; }; _doc_count: number; '@timestamp'?: number | undefined; 'agent.name'?: string | undefined; 'agent.version'?: string | undefined; 'container.id'?: string | undefined; 'ecs.version'?: string | undefined; 'event.outcome'?: string | undefined; 'event.ingested'?: number | undefined; 'error.id'?: string | undefined; 'error.exception'?: ", + "Exception", + "[] | undefined; 'error.grouping_name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'host.name'?: string | undefined; 'metricset.name'?: string | undefined; 'observer.version'?: string | undefined; 'observer.version_major'?: number | undefined; 'parent.id'?: string | undefined; 'processor.event'?: string | undefined; 'processor.name'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.id'?: string | undefined; 'transaction.duration.us'?: number | undefined; 'transaction.sampled'?: true | undefined; 'service.name'?: string | undefined; 'service.environment'?: string | undefined; 'service.node.name'?: string | undefined; 'span.id'?: string | undefined; 'span.name'?: string | undefined; 'span.type'?: string | undefined; 'span.subtype'?: string | undefined; 'span.duration.us'?: number | undefined; 'span.destination.service.name'?: string | undefined; 'span.destination.service.resource'?: string | undefined; 'span.destination.service.type'?: string | undefined; 'span.destination.service.response_time.sum.us'?: number | undefined; 'span.destination.service.response_time.count'?: number | undefined; 'span.self_time.count'?: number | undefined; 'span.self_time.sum.us'?: number | undefined; 'system.process.memory.size'?: number | undefined; 'system.memory.actual.free'?: number | undefined; 'system.memory.total'?: number | undefined; 'system.cpu.total.norm.pct'?: number | undefined; 'system.process.memory.rss.bytes'?: number | undefined; 'system.process.cpu.total.norm.pct'?: number | undefined; }[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/utils/get_transaction_metrics.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.getTransactionMetrics.$1", + "type": "Array", + "tags": [], + "label": "events", + "description": [], + "signature": [ + "Fields", + "[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/utils/get_transaction_metrics.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.service", + "type": "Function", + "tags": [], + "label": "service", + "description": [], + "signature": [ + "(name: string, environment: string, agentName: string) => ", + "Service" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.service.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/service.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.service.$2", + "type": "string", + "tags": [], + "label": "environment", + "description": [], + "signature": [ + "string" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/service.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.service.$3", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.timerange", + "type": "Function", + "tags": [], + "label": "timerange", + "description": [], + "signature": [ + "(from: number, to: number) => ", + "Timerange" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/timerange.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.timerange.$1", + "type": "number", + "tags": [], + "label": "from", + "description": [], + "signature": [ + "number" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/timerange.ts", + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.timerange.$2", + "type": "number", + "tags": [], + "label": "to", + "description": [], + "signature": [ + "number" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/timerange.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.toElasticsearchOutput", + "type": "Function", + "tags": [], + "label": "toElasticsearchOutput", + "description": [], + "signature": [ + "({\n events,\n writeTargets,\n}: { events: ", + "Fields", + "[]; writeTargets: ", + "ElasticsearchOutputWriteTargets", + "; }) => ", + "ElasticsearchOutput", + "[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.toElasticsearchOutput.$1", + "type": "Object", + "tags": [], + "label": "{\n events,\n writeTargets,\n}", + "description": [], + "path": "packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.toElasticsearchOutput.$1.events", + "type": "Array", + "tags": [], + "label": "events", + "description": [], + "signature": [ + "Fields", + "[]" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts", + "deprecated": false + }, + { + "parentPluginId": "@elastic/apm-synthtrace", + "id": "def-server.toElasticsearchOutput.$1.writeTargets", + "type": "Object", + "tags": [], + "label": "writeTargets", + "description": [], + "signature": [ + "ElasticsearchOutputWriteTargets" + ], + "path": "packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts", + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kibana_utils.json b/api_docs/kibana_utils.json index 71174e6eafe3f..0384db008edec 100644 --- a/api_docs/kibana_utils.json +++ b/api_docs/kibana_utils.json @@ -2259,7 +2259,7 @@ "tags": [], "label": "createSessionStorageStateStorage", "description": [ - "\nCreates {@link ISessionStorageStateStorage}\n{@link https://github.com/elastic/kibana/blob/master/src/plugins/kibana_utils/docs/state_sync/storages/session_storage.md | guide}" + "\nCreates {@link ISessionStorageStateStorage}\n{@link https://github.com/elastic/kibana/blob/main/src/plugins/kibana_utils/docs/state_sync/storages/session_storage.md | guide}" ], "signature": [ "(storage?: Storage) => ", @@ -2579,7 +2579,7 @@ "tags": [], "label": "createStateContainerReactHelpers", "description": [ - "\nCreates helpers for using {@link StateContainer | State Containers} with react\nRefer to {@link https://github.com/elastic/kibana/blob/master/src/plugins/kibana_utils/docs/state_containers/react.md | guide} for details" + "\nCreates helpers for using {@link StateContainer | State Containers} with react\nRefer to {@link https://github.com/elastic/kibana/blob/main/src/plugins/kibana_utils/docs/state_containers/react.md | guide} for details" ], "signature": [ " This documentation is being automatically generated using an - [_experimental_ system](https://github.com/elastic/kibana/blob/master/rfcs/text/0014_api_documentation.md). That means + [_experimental_ system](https://github.com/elastic/kibana/blob/main/rfcs/text/0014_api_documentation.md). That means it may be removed or modified at any time. If you have any questions, feedback or concerns, please create an issue using the label `APIDocs`, or reach out to the Kibana Tech Leads who are temporarily owning and maintaining this system. @@ -46,7 +46,7 @@ the instructions @@ -139,7 +139,7 @@ export type foo: string | AnInterface; ### Example plugins -Running Kibana with `yarn start --run-examples` will include all [example plugins](https://github.com/elastic/kibana/tree/master/examples). These are tested examples of platform services in use. We strongly encourage anyone providing a platform level service or to include a tutorial that links to a tested example plugin. This is better than relying on copied code snippets, which can quickly get out of date. +Running Kibana with `yarn start --run-examples` will include all [example plugins](https://github.com/elastic/kibana/tree/main/examples). These are tested examples of platform services in use. We strongly encourage anyone providing a platform level service or to include a tutorial that links to a tested example plugin. This is better than relying on copied code snippets, which can quickly get out of date. ## Performance @@ -165,7 +165,7 @@ all of our apps are accessible. ## Localization -Kibana is translated into other languages. Use our i18n utilities to ensure your public facing strings will be translated to ensure all Kibana apps are localized. Read and adhere to our [i18n guidelines](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/GUIDELINE.md) +Kibana is translated into other languages. Use our i18n utilities to ensure your public facing strings will be translated to ensure all Kibana apps are localized. Read and adhere to our [i18n guidelines](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/GUIDELINE.md) Elasticians, check out the #kibana-localization channel to ask questions and receive guidance. @@ -173,7 +173,7 @@ Kibana is translated into other languages. Use our i18n utilities to ensure your ## Styleguide -We use es-lint rules when possible, but please review our [styleguide](https://github.com/elastic/kibana/blob/master/STYLEGUIDE.md), which includes recommendations that can't be linted on. +We use es-lint rules when possible, but please review our [styleguide](https://github.com/elastic/kibana/blob/main/STYLEGUIDE.md), which includes recommendations that can't be linted on. Es-lint overrides on a per-plugin level are discouraged. @@ -231,7 +231,7 @@ Consider how you want to handle the PR review. Reviewing each PR going into the **3. Use an example plugin** -If you are building a service for developers, create an [example plugin](https://github.com/elastic/kibana/tree/master/examples) to showcase and test intended usage. This is a great way for reviewers and PMs to play around with a feature through the UI, before the production UI is ready. This can also help developers consuming your services get hands on. +If you are building a service for developers, create an [example plugin](https://github.com/elastic/kibana/tree/main/examples) to showcase and test intended usage. This is a great way for reviewers and PMs to play around with a feature through the UI, before the production UI is ready. This can also help developers consuming your services get hands on. ## Embrace the monorepo @@ -241,7 +241,7 @@ When experimenting with code, it's completely fine to create a separate GitHub r There are some exceptions where a separate repo makes sense. However, they are exceptions to the rule. A separate repo has proven beneficial when there's a dedicated team collaborating on a package which has multiple consumers, for example [EUI](https://github.com/elastic/eui). -It may be tempting to get caught up in the dream of writing the next package which is published to npm and downloaded millions of times a week. Knowing the quality of developers that are working on Kibana, this is a real possibility. However, knowing which packages will see mass adoption is impossible to predict. Instead of jumping directly to writing code in a separate repo and accepting all of the complications that come along with it, prefer keeping code inside the Kibana repo. A [Kibana package](https://github.com/elastic/kibana/tree/master/packages) can be used to publish a package to npm, while still keeping the code inside the Kibana repo. Move code to an external repo only when there is a good reason, for example to enable external contributions. +It may be tempting to get caught up in the dream of writing the next package which is published to npm and downloaded millions of times a week. Knowing the quality of developers that are working on Kibana, this is a real possibility. However, knowing which packages will see mass adoption is impossible to predict. Instead of jumping directly to writing code in a separate repo and accepting all of the complications that come along with it, prefer keeping code inside the Kibana repo. A [Kibana package](https://github.com/elastic/kibana/tree/main/packages) can be used to publish a package to npm, while still keeping the code inside the Kibana repo. Move code to an external repo only when there is a good reason, for example to enable external contributions. ## Security best practices diff --git a/dev_docs/contributing/code_walkthrough.mdx b/dev_docs/contributing/code_walkthrough.mdx index 47eb05a95c424..62965add07578 100644 --- a/dev_docs/contributing/code_walkthrough.mdx +++ b/dev_docs/contributing/code_walkthrough.mdx @@ -11,59 +11,59 @@ A high-level walk through of the folder structure of our [repository](https://gi Tip: Look for a `README.md` in a folder to learn about its contents. -## [.buildkite](https://github.com/elastic/kibana/tree/master/.buildkite) +## [.buildkite](https://github.com/elastic/kibana/tree/main/.buildkite) Managed by the operations team to set up a new buildkite ci system. Can be ignored by folks outside the Operations team. -## [.ci](https://github.com/elastic/kibana/tree/master/.ci) +## [.ci](https://github.com/elastic/kibana/tree/main/.ci) Managed by the operations team to contain Jenkins settings. Can be ignored by folks outside the Operations team. -## [.github](https://github.com/elastic/kibana/tree/master/.github) +## [.github](https://github.com/elastic/kibana/tree/main/.github) -Contains GitHub configuration settings. This file contains issue templates, and the [CODEOWNERS](https://github.com/elastic/kibana/blob/master/.github/CODEOWNERS) file. It's important for teams to keep the CODEOWNERS file up-to-date so the right team is pinged for a code owner review on PRs that edit certain files. Note that the `CODEOWNERS` file only exists on the main/master branch, and is not backported to other branches in the repo. +Contains GitHub configuration settings. This file contains issue templates, and the [CODEOWNERS](https://github.com/elastic/kibana/blob/main/.github/CODEOWNERS) file. It's important for teams to keep the CODEOWNERS file up-to-date so the right team is pinged for a code owner review on PRs that edit certain files. Note that the `CODEOWNERS` file only exists on the main/master branch, and is not backported to other branches in the repo. -## [api_docs](https://github.com/elastic/kibana/tree/master/api_docs) +## [api_docs](https://github.com/elastic/kibana/tree/main/api_docs) Every file in here is auto-generated by the and used to render our API documentation. If you edit a public plugin or package API and run `node scripts/build_api_docs` you will see files changed in this folder. Do not edit the contents of this folder directly! Note that currently you may see _a lot_ of changes because that command is not run on every PR and so the content in this folder is often outdated. -## [config](https://github.com/elastic/kibana/tree/master/config) +## [config](https://github.com/elastic/kibana/tree/main/config) This contains the base configuration file, `kibana.yml`. If you want to tweak any settings, create a `kibana.dev.yml` in here which will get picked up during development, and not checked into GitHub. -## [docs](https://github.com/elastic/kibana/tree/master/docs) +## [docs](https://github.com/elastic/kibana/tree/main/docs) -Every folder in here _except_ the [development one](https://github.com/elastic/kibana/tree/master/docs/development) contains manually generated asciidocs that end up hosted in our [Elastic guide](https://www.elastic.co/guide/). +Every folder in here _except_ the [development one](https://github.com/elastic/kibana/tree/main/docs/development) contains manually generated asciidocs that end up hosted in our [Elastic guide](https://www.elastic.co/guide/). The `development` folder contains markdown that is auto-generated with our legacy API docs tool. We are aiming to remove it shortly after 8.0FF. -## [dev_docs](https://github.com/elastic/kibana/tree/master/dev_docs) +## [dev_docs](https://github.com/elastic/kibana/tree/main/dev_docs) This is where a lot of manually written content for our Developer Guide resides. Developers may also keep the information closer to what it's describing, but it's a good spot for high-level information, or information that describes how multiple plugins work together. -## [examples](https://github.com/elastic/kibana/tree/master/examples) +## [examples](https://github.com/elastic/kibana/tree/main/examples) These are our tested example plugins that also get built and hosted [here](https://demo.kibana.dev/8.0/app/developerExamples). If a plugin is written for testing purposes only, it won't go in here. These example plugins should be written with the intention of helping developers understand how to use our services. -## [legacy_rfcs](https://github.com/elastic/kibana/tree/master/legacy_rfcs) +## [legacy_rfcs](https://github.com/elastic/kibana/tree/main/legacy_rfcs) We used to write RFCs in `md` format and keep them in the repository, but we have since moved to Google Docs. We kept the folder around, since some folks still read these old docs. If you are an internal contributor you can visit to read about our current RFC process. -## [licenses](https://github.com/elastic/kibana/tree/master/licenses) +## [licenses](https://github.com/elastic/kibana/tree/main/licenses) Contains our two license header texts, one for the Elastic license and one for the Elastic+SSPL license. All code files inside x-pack should have the Elastic license text at the top, all code files outside x-pack should contain the other. If you have your environment set up to auto-fix on save, eslint should take care of adding it for you. If you don't have it, ci will fail. Can be ignored for the most part, this rarely changes. -## [packages](https://github.com/elastic/kibana/tree/master/packages) +## [packages](https://github.com/elastic/kibana/tree/main/packages) -The packages folder contains a mixture of build-time related code (like the [code needed to build the api docs](https://github.com/elastic/kibana/tree/master/packages/kbn-docs-utils)), as well as static code that some plugins rely on (like the [kbn-monaco package](https://github.com/elastic/kibana/tree/master/packages/kbn-monaco)). covers how packages differ from plugins. +The packages folder contains a mixture of build-time related code (like the [code needed to build the api docs](https://github.com/elastic/kibana/tree/main/packages/kbn-docs-utils)), as well as static code that some plugins rely on (like the [kbn-monaco package](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco)). covers how packages differ from plugins. -## [plugins](https://github.com/elastic/kibana/tree/master/plugins) +## [plugins](https://github.com/elastic/kibana/tree/main/plugins) This is an empty folder in GitHub. It's where third party developers should put their plugin folders. Internal developers can ignore this folder. -## [scripts](https://github.com/elastic/kibana/tree/master/scripts) +## [scripts](https://github.com/elastic/kibana/tree/main/scripts) Contains a bunch of developer scripts. These are usually very small files with just two lines that kick off a command, the logic of which resides elsewhere (sometimes `src/dev`, sometimes inside `packages`). Example: @@ -72,65 +72,65 @@ require('../src/setup_node_env'); require('@kbn/es-archiver').runCli(); ``` -## [src](https://github.com/elastic/kibana/tree/master/src) +## [src](https://github.com/elastic/kibana/tree/main/src) This folder and the packages folder contain the most code and where developers usually find themselves. I'll touch on a few of the subfolder, the rest can generally be ignored, or are build/ops related code. -### [src/cli*](https://github.com/elastic/kibana/tree/master/src/cli) +### [src/cli*](https://github.com/elastic/kibana/tree/main/src/cli) Maintained primarily by the Operations team, this folder contains code that initializes the Kibana runtime and a bit of work to handle authorization for interactive setup mode. Most devs should be able to ignore this code. -### [src/core](https://github.com/elastic/kibana/tree/master/src/core) +### [src/core](https://github.com/elastic/kibana/tree/main/src/core) This code primarily belongs to the Core team and contains the plugin infrastructure, as well as a bunch of fundamental services like migrations, saved objects, and some UI utilities (toasts, flyouts, etc.). -### [src/dev](https://github.com/elastic/kibana/tree/master/src/dev) +### [src/dev](https://github.com/elastic/kibana/tree/main/src/dev) Maintained by the Operations team, this code contains build and development tooling related code. This folder existed before `packages`, so contains mostly older code that hasn't been migrated to packages. Prefer creating a `package` if possible. Can be ignored for the most part if you are not on the Ops team. Prefer -### [src/plugins](https://github.com/elastic/kibana/tree/master/src/plugins) +### [src/plugins](https://github.com/elastic/kibana/tree/main/src/plugins) Contains all of our Basic-licensed plugins. Most folders in this directory will contain `README.md` files explaining what they do. If there are none, you can look at the `owner.gitHub` field inside all `kibana.json`s that will tell you which team to get in touch with for questions. Note that as plugins can be nested, each folder in this directory may contain multiple plugins. -## [test](https://github.com/elastic/kibana/tree/master/test) +## [test](https://github.com/elastic/kibana/tree/main/test) Contains functional tests and related FTR (functional test runner) code for the plugins inside `src/plugins`, although there is a push to move the tests to reside inside the plugins themselves. -## [typings](https://github.com/elastic/kibana/tree/master/typings) +## [typings](https://github.com/elastic/kibana/tree/main/typings) Maintained by Ops and Core, this contains global typings for dependencies that do not provide their own types, or don't have types available via [DefinitelyTyped](https://definitelytyped.org). This directory is intended to be minimal; types should only be added here as a last resort. -## [vars](https://github.com/elastic/kibana/tree/master/vars) +## [vars](https://github.com/elastic/kibana/tree/main/vars) A bunch of groovy scripts maintained by the Operations team. -## [x-pack](https://github.com/elastic/kibana/tree/master/x-pack) +## [x-pack](https://github.com/elastic/kibana/tree/main/x-pack) Contains all code and infrasturcture that powers our gold+ (non-basic) features that are provided under a more restrictive license. -### [x-pack/build_chromium](https://github.com/elastic/kibana/tree/master/x-pack/build_chromium) +### [x-pack/build_chromium](https://github.com/elastic/kibana/tree/main/x-pack/build_chromium) Maintained by the App Services UX team, this contains Reporting-related code for building Chromium in order to take server side screenshots. -### [x-pack/dev-tools](https://github.com/elastic/kibana/tree/master/x-pack/dev-tools) +### [x-pack/dev-tools](https://github.com/elastic/kibana/tree/main/x-pack/dev-tools) Maintained by the Operations team. -### [x-pack/examples](https://github.com/elastic/kibana/tree/master/x-pack/examples) +### [x-pack/examples](https://github.com/elastic/kibana/tree/main/x-pack/examples) Contains all example plugins that rely on gold+ features. -### [x-pack/plugins](https://github.com/elastic/kibana/tree/master/x-pack/plugins) +### [x-pack/plugins](https://github.com/elastic/kibana/tree/main/x-pack/plugins) Contains code for all the plugins that power our gold+ features. -### [x-pack/scripts](https://github.com/elastic/kibana/tree/master/x-pack/scripts) +### [x-pack/scripts](https://github.com/elastic/kibana/tree/main/x-pack/scripts) Maintained by the Ops team, this folder contains some scripts for running x-pack utilities, like the functional test runner that runs with a license higher than Basic. -### [x-pack/test](https://github.com/elastic/kibana/tree/master/x-pack/test) +### [x-pack/test](https://github.com/elastic/kibana/tree/main/x-pack/test) Functional tests for our gold+ features. diff --git a/dev_docs/contributing/standards.mdx b/dev_docs/contributing/standards.mdx index 5f61be80ee207..172a83935b966 100644 --- a/dev_docs/contributing/standards.mdx +++ b/dev_docs/contributing/standards.mdx @@ -69,6 +69,6 @@ Every team should be collecting telemetry metrics on it’s public API usage. Th ### Documentation -Every public API should be documented inside the [docs/api](https://github.com/elastic/kibana/tree/master/docs/api) folder in asciidoc (this content will eventually be migrated to mdx to support the new docs system). If a public REST API is undocumented, you should either document it, or make it internal. +Every public API should be documented inside the [docs/api](https://github.com/elastic/kibana/tree/main/docs/api) folder in asciidoc (this content will eventually be migrated to mdx to support the new docs system). If a public REST API is undocumented, you should either document it, or make it internal. Every public API should have a release tag specified using the appropriate documentation release tag above. If you do this, the docs system will provide a pop up explaining the conditions. If an API is not marked, it should be considered experimental. diff --git a/dev_docs/getting_started/hello_world_plugin.mdx b/dev_docs/getting_started/hello_world_plugin.mdx index b95d0cac201fc..be4fcf5671a42 100644 --- a/dev_docs/getting_started/hello_world_plugin.mdx +++ b/dev_docs/getting_started/hello_world_plugin.mdx @@ -9,7 +9,7 @@ tags: ['kibana', 'dev', 'contributor', 'tutorials'] This tutorial walks you through two ways to create a plugin that registers an application that says "Hello World!". -You can view the tested example plugin at [examples/hello_world](https://github.com/elastic/kibana/tree/master/examples/hello_world). +You can view the tested example plugin at [examples/hello_world](https://github.com/elastic/kibana/tree/main/examples/hello_world). ## 1. Set up your development environment diff --git a/dev_docs/key_concepts/anatomy_of_a_plugin.mdx b/dev_docs/key_concepts/anatomy_of_a_plugin.mdx index 3e6c391eea141..491f93550d14c 100644 --- a/dev_docs/key_concepts/anatomy_of_a_plugin.mdx +++ b/dev_docs/key_concepts/anatomy_of_a_plugin.mdx @@ -76,7 +76,7 @@ plugins/ - preboot plugins are bootstrapped to prepare the environment before Kibana starts. - standard plugins define Kibana functionality while Kibana is running. -`owner` - [Required] Help users of your plugin know who manages this plugin and how to get in touch. This is required for internal plugins. `Owner.name` should be the name of the team that manages this plugin. This should match the team that owns this code in the [CODEOWNERS](https://github.com/elastic/kibana/blob/master/.github/CODEOWNERS) file (however, this is not currently enforced). Internal teams should also use a [GitHub team alias](https://github.com/orgs/elastic/teams) for `owner.githubTeam`. While many teams can contribute to a plugin, only a single team should be the primary owner. +`owner` - [Required] Help users of your plugin know who manages this plugin and how to get in touch. This is required for internal plugins. `Owner.name` should be the name of the team that manages this plugin. This should match the team that owns this code in the [CODEOWNERS](https://github.com/elastic/kibana/blob/main/.github/CODEOWNERS) file (however, this is not currently enforced). Internal teams should also use a [GitHub team alias](https://github.com/orgs/elastic/teams) for `owner.githubTeam`. While many teams can contribute to a plugin, only a single team should be the primary owner. `description` - [Required] Give your plugin a description to help other developers understand what it does. This is required for internal plugins. diff --git a/dev_docs/key_concepts/kibana_platform_plugin_intro.mdx b/dev_docs/key_concepts/kibana_platform_plugin_intro.mdx index 737b9d8708f29..195e5c1f6f211 100644 --- a/dev_docs/key_concepts/kibana_platform_plugin_intro.mdx +++ b/dev_docs/key_concepts/kibana_platform_plugin_intro.mdx @@ -33,7 +33,7 @@ At a super high-level, Kibana is composed of **plugins**, **core**, and **Kibana -When the [Bazel migration](https://github.com/elastic/kibana/blob/master/legacy_rfcs/text/0015_bazel.md) is complete, all code, including plugins, will be a package. With that, packages won't be required to be in the `packages/` directory and can be located somewhere that makes more sense structurally. +When the [Bazel migration](https://github.com/elastic/kibana/blob/main/legacy_rfcs/text/0015_bazel.md) is complete, all code, including plugins, will be a package. With that, packages won't be required to be in the `packages/` directory and can be located somewhere that makes more sense structurally. In the meantime, the following can be used to determine whether it makes sense to add code to a package inside the `packages` folder, or a plugin inside `src/plugins` or `x-pack/plugins`. @@ -49,7 +49,7 @@ Downsides to packages: 1. It's not . The packages folder is far away from the plugins folder. Having your stateless code in a plugin and the rest in a package may make it hard to find, leading to duplication. The Operations team hopes to fix this by supporting packages and plugins existing in the same folder. You can track this work by following [this issue](https://github.com/elastic/kibana/issues/112886). -2. Development overhead. Developers have to run `yarn kbn watch` to have changes rebuilt automatically. [Phase II](https://github.com/elastic/kibana/blob/master/legacy_rfcs/text/0015_bazel.md#phase-ii---docs-developer-experience) of the Bazel migration work will bring the development experience on par with plugin development. This work can be tracked [here](https://github.com/elastic/kibana/issues/104519). +2. Development overhead. Developers have to run `yarn kbn watch` to have changes rebuilt automatically. [Phase II](https://github.com/elastic/kibana/blob/main/legacy_rfcs/text/0015_bazel.md#phase-ii---docs-developer-experience) of the Bazel migration work will bring the development experience on par with plugin development. This work can be tracked [here](https://github.com/elastic/kibana/issues/104519). 3. Development performance. Rebuild time is typically longer than it would be for the same code in a plugin. The reasons are captured in [this issue](https://github.com/elastic/kibana/issues/107648). The ops team is actively working to reduce this performance increase. diff --git a/dev_docs/key_concepts/navigation.mdx b/dev_docs/key_concepts/navigation.mdx index 27ba3db111411..b96bfede8fe36 100644 --- a/dev_docs/key_concepts/navigation.mdx +++ b/dev_docs/key_concepts/navigation.mdx @@ -30,7 +30,7 @@ Assuming you want to link from your app to *Discover*. When building such URL th ### Prepending a proper `basePath` -To prepend Kibana's `basePath` use the [core.http.basePath.prepend](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.ibasepath.prepend.md) helper: +To prepend Kibana's `basePath` use the [core.http.basePath.prepend](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.ibasepath.prepend.md) helper: ```tsx const discoverUrl = core.http.basePath.prepend(`/discover`); @@ -50,7 +50,7 @@ console.log(discoverUrl); // http://localhost:5601/bpr/s/space/app/discover const discoverUrlWithSomeState = core.http.basePath.prepend(`/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'2020-09-10T11:39:50.203Z',to:'2020-09-10T11:40:20.249Z'))&_a=(columns:!(_source),filters:!(),index:'90943e30-9a47-11e8-b64d-95841ca0b247',interval:auto,query:(language:kuery,query:''),sort:!())`); ``` -Instead, each app should expose [a locator](https://github.com/elastic/kibana/blob/master/src/plugins/share/common/url_service/locators/README.md). +Instead, each app should expose [a locator](https://github.com/elastic/kibana/blob/main/src/plugins/share/common/url_service/locators/README.md). Other apps should use those locators for navigation or URL creation. ```tsx @@ -60,7 +60,7 @@ const discoverUrl = await plugins.discover.locator.getUrl({filters, timeRange}); await plugins.discover.locator.navigate({filters, timeRange}); ``` -To get a better idea, take a look at *Discover* locator [implementation](https://github.com/elastic/kibana/blob/master/src/plugins/discover/public/locator.ts). +To get a better idea, take a look at *Discover* locator [implementation](https://github.com/elastic/kibana/blob/main/src/plugins/discover/public/locator.ts). It allows specifying various **Discover** app state pieces like: index pattern, filters, query, time range and more. There are two ways to access locators of other apps: @@ -86,8 +86,8 @@ window.location.href = urlToADashboard; To navigate between different Kibana apps without a page reload there are APIs in `core`: -* [core.application.navigateToApp](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetoapp.md) -* [core.application.navigateToUrl](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetourl.md) +* [core.application.navigateToApp](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetoapp.md) +* [core.application.navigateToUrl](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.applicationstart.navigatetourl.md) *Rendering a link to a different app on its own would also cause a full page reload:* @@ -112,7 +112,7 @@ const MySPALink = () => ``` As it would be too much boilerplate to do this for each link in your app, there is a handy wrapper that helps with it: -[RedirectAppLinks](https://github.com/elastic/kibana/blob/master/src/plugins/kibana_react/public/app_links/redirect_app_link.tsx#L49). +[RedirectAppLinks](https://github.com/elastic/kibana/blob/main/src/plugins/kibana_react/public/app_links/redirect_app_link.tsx#L49). ```jsx const MyApp = () => @@ -134,9 +134,9 @@ Common rules to follow in this scenario: This is required to make sure `core` is aware of navigations triggered inside your app, so it could act accordingly when needed. -* `Core`'s [ScopedHistory](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md) instance. -* [Example usage](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.appmountparameters.history.md) -* [Example plugin](https://github.com/elastic/kibana/blob/master/test/plugin_functional/plugins/core_plugin_a/public/application.tsx#L120) +* `Core`'s [ScopedHistory](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md) instance. +* [Example usage](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.appmountparameters.history.md) +* [Example plugin](https://github.com/elastic/kibana/blob/main/test/plugin_functional/plugins/core_plugin_a/public/application.tsx#L120) Relative links will be resolved relative to your app's route (e.g.: `http://localhost5601/app/{your-app-id}`) and setting up internal links in your app in SPA friendly way would look something like: @@ -152,7 +152,7 @@ const MyInternalLink = () => Try to avoid using `window.location` and `window.history` directly. - Instead, use [ScopedHistory](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md) instance provided by `core`. + Instead, use [ScopedHistory](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md) instance provided by `core`. - This way `core` will know about location changes triggered within your app, and it would act accordingly. @@ -190,7 +190,7 @@ There are utils to help you to implement such kind of state syncing. - Adding a query param flag or simple key/value to the URL. - Follow [these docs](https://github.com/elastic/kibana/blob/master/src/plugins/kibana_utils/docs/state_sync#state-syncing-utilities) to learn more. + Follow [these docs](https://github.com/elastic/kibana/blob/main/src/plugins/kibana_utils/docs/state_sync#state-syncing-utilities) to learn more. ## Preserving state between navigations @@ -212,7 +212,7 @@ you'd notice that state is stored inside that link, and it also gets updated whe ![image](../assets/state_inside_the_link.png) This is where separation into `_a` and `_g` query params comes into play. What is considered a *global* state gets constantly updated in those navigation links. In the example above it was a time filter. -This is backed by [KbnUrlTracker](https://github.com/elastic/kibana/blob/master/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts#L57) util. You can use it to achieve similar behavior. +This is backed by [KbnUrlTracker](https://github.com/elastic/kibana/blob/main/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts#L57) util. You can use it to achieve similar behavior. NOTE: After migrating to KP navigation works without page reloads and all plugins are loaded simultaneously. Hence, likely there are simpler ways to preserve state of your application, unless you want to do it through URL. diff --git a/dev_docs/key_concepts/persistable_state.mdx b/dev_docs/key_concepts/persistable_state.mdx index 189259cf1085b..25d3f37a86be4 100644 --- a/dev_docs/key_concepts/persistable_state.mdx +++ b/dev_docs/key_concepts/persistable_state.mdx @@ -49,7 +49,7 @@ If the state your plugin is storing can be provided by other plugins (your plugi Any plugin that stores any persistable state as part of their saved object should make sure that its saved object migration and reference extraction and injection methods correctly use the matching `PersistableStateService` implementation for the state they are storing. -Take a look at [example saved object](https://github.com/elastic/kibana/blob/master/examples/embeddable_examples/server/searchable_list_saved_object.ts#L32) which stores an embeddable state. Note how the `migrations`, `extractReferences` and `injectReferences` are defined. +Take a look at [example saved object](https://github.com/elastic/kibana/blob/main/examples/embeddable_examples/server/searchable_list_saved_object.ts#L32) which stores an embeddable state. Note how the `migrations`, `extractReferences` and `injectReferences` are defined. ## Storing persistable state as part of URL @@ -71,7 +71,7 @@ To support persisting your state in saved objects owned by another plugin, the < text="Learn how to define Saved Object references" /> -[See example embeddable providing extract/inject functions](https://github.com/elastic/kibana/blob/master/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts) +[See example embeddable providing extract/inject functions](https://github.com/elastic/kibana/blob/main/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts) ### Migrations and Backward compatibility @@ -79,9 +79,9 @@ As your plugin evolves, you may need to change your state in a breaking way. If . -[See an example saved object storing embeddable state implementing saved object migration function](https://github.com/elastic/kibana/blob/master/examples/embeddable_examples/server/searchable_list_saved_object.ts) +[See an example saved object storing embeddable state implementing saved object migration function](https://github.com/elastic/kibana/blob/main/examples/embeddable_examples/server/searchable_list_saved_object.ts) -[See example embeddable providing migration functions](https://github.com/elastic/kibana/blob/master/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts) +[See example embeddable providing migration functions](https://github.com/elastic/kibana/blob/main/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts) ## Telemetry diff --git a/dev_docs/tutorials/endpoints.mdx b/dev_docs/tutorials/endpoints.mdx index 92ead4d714626..1d6fc0edf1e64 100644 --- a/dev_docs/tutorials/endpoints.mdx +++ b/dev_docs/tutorials/endpoints.mdx @@ -17,7 +17,7 @@ The service allows plugins to: - to implement custom authentication and authorization strategy. - See [the server-side HTTP service API docs](https://github.com/elastic/kibana/blob/master/docs/development/core/server/kibana-plugin-core-server.httpservicesetup.md) + See [the server-side HTTP service API docs](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.httpservicesetup.md) **Registering a basic GET endpoint** @@ -55,7 +55,7 @@ export class MyPlugin implements Plugin { ``` - See [the routing example plugin](https://github.com/elastic/kibana/blob/master/examples/routing_example) for more route registration examples. + See [the routing example plugin](https://github.com/elastic/kibana/blob/main/examples/routing_example) for more route registration examples. ## Consuming the endpoint from the client-side @@ -79,9 +79,9 @@ async function fetchData(http: HttpStart, id: string) { ``` - See [the client-side HTTP service API docs](https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.httpsetup.md) + See [the client-side HTTP service API docs](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.httpsetup.md) - See [the routing example plugin](https://github.com/elastic/kibana/blob/master/examples/routing_example) for more endpoint consumption examples. + See [the routing example plugin](https://github.com/elastic/kibana/blob/main/examples/routing_example) for more endpoint consumption examples. diff --git a/dev_docs/tutorials/expressions.mdx b/dev_docs/tutorials/expressions.mdx index 4688da98b7b01..c4b37a125838e 100644 --- a/dev_docs/tutorials/expressions.mdx +++ b/dev_docs/tutorials/expressions.mdx @@ -57,7 +57,7 @@ const result = await executionContract.getData(); ``` - Check the full spec of execute function [here](https://github.com/elastic/kibana/blob/master/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.md) + Check the full spec of execute function [here](https://github.com/elastic/kibana/blob/main/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.md) In addition, on the browser side, there are two additional ways to run expressions and render the results. @@ -71,7 +71,7 @@ This is the easiest way to get expressions rendered inside your application. ``` - Check the full spec of ReactExpressionRenderer component props [here](https://github.com/elastic/kibana/blob/master/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md) + Check the full spec of ReactExpressionRenderer component props [here](https://github.com/elastic/kibana/blob/main/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md) #### Expression loader @@ -83,7 +83,7 @@ const handler = loader(domElement, expression, params); ``` - Check the full spec of expression loader params [here](https://github.com/elastic/kibana/blob/master/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md) + Check the full spec of expression loader params [here](https://github.com/elastic/kibana/blob/main/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md) ### Creating new expression functions @@ -106,7 +106,7 @@ expressions.registerFunction(functionDefinition); ``` - Check the full interface of ExpressionFuntionDefinition [here](https://github.com/elastic/kibana/blob/master/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md) + Check the full interface of ExpressionFuntionDefinition [here](https://github.com/elastic/kibana/blob/main/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md) ### Creating new expression renderers @@ -128,5 +128,5 @@ expressions.registerRenderer(rendererDefinition); ``` - Check the full interface of ExpressionRendererDefinition [here](https://github.com/elastic/kibana/blob/master/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrenderdefinition.md) + Check the full interface of ExpressionRendererDefinition [here](https://github.com/elastic/kibana/blob/main/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrenderdefinition.md) diff --git a/dev_docs/tutorials/kibana_page_template.mdx b/dev_docs/tutorials/kibana_page_template.mdx index bc0abc99d8921..f7169ea33cea7 100644 --- a/dev_docs/tutorials/kibana_page_template.mdx +++ b/dev_docs/tutorials/kibana_page_template.mdx @@ -124,7 +124,7 @@ Increases the consistency in messaging across all the solutions during the getti This is a built-in configuration that displays a very specific UI and requires very specific keys. It will also ignore all other configurations of the template including `pageHeader` and `children`, with the exception of continuing to show `solutionNav`. -The `noDataConfig` is of type [`NoDataPagProps`](https://github.com/elastic/kibana/blob/master/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx): +The `noDataConfig` is of type [`NoDataPagProps`](https://github.com/elastic/kibana/blob/main/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx): 1. `solution: string`: Single name for the current solution, used to auto-generate the title, logo, and description *(required)* 2. `docsLink: string`: Required to set the docs link for the whole solution *(required)* diff --git a/dev_docs/tutorials/saved_objects.mdx b/dev_docs/tutorials/saved_objects.mdx index 29a0b60983d90..9583e195d1c82 100644 --- a/dev_docs/tutorials/saved_objects.mdx +++ b/dev_docs/tutorials/saved_objects.mdx @@ -254,4 +254,4 @@ the error should be verbose and informative so that the corrupt document can be ### Testing Migrations -Bugs in a migration function cause downtime for our users and therefore have a very high impact. Follow the . +Bugs in a migration function cause downtime for our users and therefore have a very high impact. Follow the . diff --git a/dev_docs/tutorials/testing_plugins.mdx b/dev_docs/tutorials/testing_plugins.mdx index 14089bc3fa315..b8f8029e7b16c 100644 --- a/dev_docs/tutorials/testing_plugins.mdx +++ b/dev_docs/tutorials/testing_plugins.mdx @@ -217,9 +217,9 @@ Cons: - brittle tests ###### Example -You can reuse existing [api_integration](https://github.com/elastic/kibana/blob/master/test/api_integration/config.js) setup by registering a test file within a -[test loader](https://github.com/elastic/kibana/blob/master/test/api_integration/apis/index.ts). More about the existing FTR setup in the -[contribution guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-specific-kibana-tests) +You can reuse existing [api_integration](https://github.com/elastic/kibana/blob/main/test/api_integration/config.js) setup by registering a test file within a +[test loader](https://github.com/elastic/kibana/blob/main/test/api_integration/apis/index.ts). More about the existing FTR setup in the +[contribution guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md#running-specific-kibana-tests) The tests cover: - authenticated / non-authenticated user access (when applicable) @@ -409,7 +409,7 @@ While applications do get an opportunity to unmount and run cleanup logic, it is #### Example -By following the [renderApp](https://github.com/elastic/kibana/blob/master/src/core/CONVENTIONS.md#applications) convention, you can greatly reduce the amount of logic in your application's mount function. This makes testing your application's actual rendering logic easier. +By following the [renderApp](https://github.com/elastic/kibana/blob/main/src/core/CONVENTIONS.md#applications) convention, you can greatly reduce the amount of logic in your application's mount function. This makes testing your application's actual rendering logic easier. ```typescript jsx /** public/plugin.ts */ diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 275086ece1951..9e22dde28b40e 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -3271,7 +3271,7 @@ To rename the Ingest Manger plugin to Fleet: ==== Kibana plugins can no longer rely on their server code being automatically transpiled with Babel. -The https://github.com/elastic/kibana/tree/master/packages/kbn-plugin-helpers[`@kbn/plugin-helpers`] +The https://github.com/elastic/kibana/tree/main/packages/kbn-plugin-helpers[`@kbn/plugin-helpers`] provide a build task that will transform a plugin's server code to plain JS via Babel, but plugin authors can use a tool of their choosing to accomplish the same result. @@ -3683,7 +3683,7 @@ Resolves https://github.com/elastic/kibana/issues/73557[#73557]. {kib} provides the new {es} client as a part of the {es} service on the server-side. The legacy client is deprecated on and subject for removal in `7.x`. Reference -the https://github.com/elastic/kibana/blob/master/src/core/MIGRATION_EXAMPLES.md#elasticsearch-client[migration guide] to refactor your code +the https://github.com/elastic/kibana/blob/main/src/core/MIGRATION_EXAMPLES.md#elasticsearch-client[migration guide] to refactor your code *via https://github.com/elastic/kibana/pull/73651[#73651]* @@ -4980,8 +4980,8 @@ setup(core: CoreSetup) { The API reference docs for `state_sync` and `state_containers` are now available: -* https://github.com/elastic/kibana/blob/master/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.md[state_sync] -* https://github.com/elastic/kibana/blob/master/docs/development/plugins/kibana_utils/common/state_containers/kibana-plugin-plugins-kibana_utils-common-state_containers.md[state_containers] +* https://github.com/elastic/kibana/blob/main/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.md[state_sync] +* https://github.com/elastic/kibana/blob/main/docs/development/plugins/kibana_utils/common/state_containers/kibana-plugin-plugins-kibana_utils-common-state_containers.md[state_containers] *via https://github.com/elastic/kibana/pull/67354[#67354]* @@ -6039,7 +6039,7 @@ The corresponding code was previously moved to the new platform. For more information on where to locate new platform `data` services, refer to the -https://github.com/elastic/kibana/blob/master/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] +https://github.com/elastic/kibana/blob/main/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] in `src/core/MIGRATION.md`. *via https://github.com/elastic/kibana/pull/61618[#61618]* @@ -6585,7 +6585,7 @@ const myPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginAp For more information on where to locate new platform `data` services, please refer to the table of -https://github.com/elastic/kibana/blob/master/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] +https://github.com/elastic/kibana/blob/main/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] in `src/core/MIGRATION.md`. *via {kib-pull}60449[#60449]* @@ -6748,7 +6748,7 @@ const trigger = { ===== Use log4j pattern syntax Logging output of the New platform plugins can use adjusted -via https://github.com/elastic/kibana/blob/master/src/core/server/logging/README.md[new config]. +via https://github.com/elastic/kibana/blob/main/src/core/server/logging/README.md[new config]. *via {kib-pull}57433[#57433]* @@ -6906,14 +6906,14 @@ const reactToUiComponent: (comp: React.ComponentType) => UiComponent; ===== Start consuming np logging config Provides experimental support of new logging format for **new platform plugins**. -More about https://github.com/elastic/kibana/blob/master/src/core/server/logging/README.md[the logging format]. +More about https://github.com/elastic/kibana/blob/main/src/core/server/logging/README.md[the logging format]. *via {kib-pull}56480[#56480]* [discrete] ===== [State Management] State syncing utils docs -Refer to https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync[these docs] +Refer to https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_sync[these docs] on state syncing utils. *via {kib-pull}56479[#56479]* @@ -7029,8 +7029,8 @@ import { BUCKET_TYPES, METRIC_TYPES } from 'src/plugins/data/public'; The above examples are not comprehensive, but represent some of the more common uses of `agg_types`. For more details, please refer to the interfaces -in https://github.com/elastic/kibana/blob/master/src/plugins/data/public/types.ts#L50[the source code], -as well as the data plugin's https://github.com/elastic/kibana/blob/master/src/plugins/data/public/index.ts#L282[`public/index` file]. +in https://github.com/elastic/kibana/blob/main/src/plugins/data/public/types.ts#L50[the source code], +as well as the data plugin's https://github.com/elastic/kibana/blob/main/src/plugins/data/public/index.ts#L282[`public/index` file]. *`ui/time_buckets`* https://github.com/elastic/kibana/pull/58805[#58805] diff --git a/docs/api/dashboard-api.asciidoc b/docs/api/dashboard-api.asciidoc index e6f54dd9156ec..94511c3154fe0 100644 --- a/docs/api/dashboard-api.asciidoc +++ b/docs/api/dashboard-api.asciidoc @@ -1,7 +1,7 @@ [[dashboard-api]] == Import and export dashboard APIs -deprecated::[7.15.0,Both of these APIs have been deprecated in favor of <> and <>.] +deprecated::[7.15.0,These experimental APIs have been deprecated in favor of <> and <>.] Import and export dashboards with the corresponding saved objects, such as visualizations, saved searches, and index patterns. diff --git a/docs/api/dashboard/export-dashboard.asciidoc b/docs/api/dashboard/export-dashboard.asciidoc index 3a20eff0a54d2..098ec976569bd 100644 --- a/docs/api/dashboard/export-dashboard.asciidoc +++ b/docs/api/dashboard/export-dashboard.asciidoc @@ -6,7 +6,7 @@ deprecated::[7.15.0,Use <> instead.] -Export dashboards and corresponding saved objects. +experimental[] Export dashboards and corresponding saved objects. [[dashboard-api-export-request]] ==== Request diff --git a/docs/api/dashboard/import-dashboard.asciidoc b/docs/api/dashboard/import-dashboard.asciidoc index e4817d6cb7ee9..41eb47500c8d7 100644 --- a/docs/api/dashboard/import-dashboard.asciidoc +++ b/docs/api/dashboard/import-dashboard.asciidoc @@ -6,7 +6,7 @@ deprecated::[7.15.0,Use <> instead.] -Import dashboards and corresponding saved objects. +experimental[] Import dashboards and corresponding saved objects. [[dashboard-api-import-request]] ==== Request diff --git a/docs/concepts/index.asciidoc b/docs/concepts/index.asciidoc index 20d7103f021cd..e46f63e97b19f 100644 --- a/docs/concepts/index.asciidoc +++ b/docs/concepts/index.asciidoc @@ -133,9 +133,18 @@ The structured filters are the only way to use the {es} Query DSL in JSON form, or to target a specific index pattern for filtering. Each of the structured filters is combined with AND logic on the rest of the query. -[role="screenshot"] -image:concepts/images/add-filter-popup.png["Add filter popup"] - +++++ + + +++++ [float] === Saving objects diff --git a/docs/developer/advanced/development-es-snapshots.asciidoc b/docs/developer/advanced/development-es-snapshots.asciidoc index 4c801bf750979..38146e65b6326 100644 --- a/docs/developer/advanced/development-es-snapshots.asciidoc +++ b/docs/developer/advanced/development-es-snapshots.asciidoc @@ -81,7 +81,7 @@ Each day, a https://kibana-ci.elastic.co/job/elasticsearch+snapshots+trigger/[Je https://kibana-ci.elastic.co/job/elasticsearch+snapshots+build/[This Jenkins job] builds the {es} snapshots and uploads them to GCS. -The Jenkins job pipeline definition is https://github.com/elastic/kibana/blob/master/.ci/es-snapshots/Jenkinsfile_build_es[in the {kib} repo]. +The Jenkins job pipeline definition is https://github.com/elastic/kibana/blob/main/.ci/es-snapshots/Jenkinsfile_build_es[in the {kib} repo]. 1. Checkout {es} repo for the given branch/version. 2. Run `./gradlew -p distribution/archives assemble --parallel` to create all of the {es} distributions. @@ -97,7 +97,7 @@ The Jenkins job pipeline definition is https://github.com/elastic/kibana/blob/ma https://kibana-ci.elastic.co/job/elasticsearch+snapshots+verify/[This Jenkins job] tests the latest {es} snapshot with the full {kib} CI pipeline, and promotes if it there are no test failures. -The Jenkins job pipeline definition is https://github.com/elastic/kibana/blob/master/.ci/es-snapshots/Jenkinsfile_verify_es[in the {kib} repo]. +The Jenkins job pipeline definition is https://github.com/elastic/kibana/blob/main/.ci/es-snapshots/Jenkinsfile_verify_es[in the {kib} repo]. 1. Checkout {kib} and set up CI environment as normal. 2. Set the `ES_SNAPSHOT_MANIFEST` env var to point to the latest snapshot manifest. diff --git a/docs/developer/advanced/sharing-saved-objects.asciidoc b/docs/developer/advanced/sharing-saved-objects.asciidoc index 8a0373363e473..9a009e6ad49b7 100644 --- a/docs/developer/advanced/sharing-saved-objects.asciidoc +++ b/docs/developer/advanced/sharing-saved-objects.asciidoc @@ -157,7 +157,7 @@ const savedObject = resolveResult.saved_object; TIP: See an example of this in https://github.com/elastic/kibana/pull/107256#user-content-example-steps[step 2 of the POC]! The -https://github.com/elastic/kibana/blob/master/docs/development/core/server/kibana-plugin-core-server.savedobjectsresolveresponse.md[SavedObjectsResolveResponse +https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.savedobjectsresolveresponse.md[SavedObjectsResolveResponse interface] has three fields, summarized below: * `saved_object` - The saved object that was found. diff --git a/docs/developer/architecture/add-data-tutorials.asciidoc b/docs/developer/architecture/add-data-tutorials.asciidoc index 8b6f7d5448364..3f1b42c008ee7 100644 --- a/docs/developer/architecture/add-data-tutorials.asciidoc +++ b/docs/developer/architecture/add-data-tutorials.asciidoc @@ -11,7 +11,7 @@ Each tutorial contains three sets of instructions: [discrete] === Creating a new tutorial -1. Create a new directory in the link:https://github.com/elastic/kibana/tree/master/src/plugins/home/server/tutorials[tutorials directory]. +1. Create a new directory in the link:https://github.com/elastic/kibana/tree/main/src/plugins/home/server/tutorials[tutorials directory]. 2. In the new directory, create a file called `index.ts` that exports a function. The function must return a function object that conforms to the `TutorialSchema` interface link:{kib-repo}tree/{branch}/src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts[tutorial schema]. 3. Register the tutorial in link:{kib-repo}tree/{branch}/src/plugins/home/server/tutorials/register.ts[register.ts] by adding it to the `builtInTutorials`. diff --git a/docs/developer/contributing/development-documentation.asciidoc b/docs/developer/contributing/development-documentation.asciidoc index 70dd756ca808e..7137d5bad051c 100644 --- a/docs/developer/contributing/development-documentation.asciidoc +++ b/docs/developer/contributing/development-documentation.asciidoc @@ -15,7 +15,7 @@ Documentation about specific services a plugin offers should be encapsulated in: === End user documentation Documentation about user facing features should be written in http://asciidoc.org/[asciidoc] at -{kib-repo}/tree/master/docs[https://github.com/elastic/kibana/tree/master/docs] +{kib-repo}/tree/master/docs[https://github.com/elastic/kibana/tree/main/docs] To build the docs, you must clone the https://github.com/elastic/docs[elastic/docs] repo as a sibling of your {kib} repo. Follow the instructions in that project's @@ -38,4 +38,4 @@ REST APIs should be documented using the following recommended formats: === General developer documentation and guidelines General developer guildlines and documentation, like this right here, should be written in http://asciidoc.org/[asciidoc] -at {kib-repo}/tree/master/docs/developer[https://github.com/elastic/kibana/tree/master/docs/developer] +at {kib-repo}/tree/master/docs/developer[https://github.com/elastic/kibana/tree/main/docs/developer] diff --git a/docs/developer/contributing/development-functional-tests.asciidoc b/docs/developer/contributing/development-functional-tests.asciidoc index 687a27a71f304..5dc6f2dee5a44 100644 --- a/docs/developer/contributing/development-functional-tests.asciidoc +++ b/docs/developer/contributing/development-functional-tests.asciidoc @@ -114,7 +114,7 @@ Use the `--help` flag for more options. [discrete] ==== Environment -The tests are written in https://mochajs.org[mocha] using https://github.com/elastic/kibana/tree/master/packages/kbn-expect[@kbn/expect] for assertions. +The tests are written in https://mochajs.org[mocha] using https://github.com/elastic/kibana/tree/main/packages/kbn-expect[@kbn/expect] for assertions. We use https://www.w3.org/TR/webdriver1/[WebDriver Protocol] to run tests in both Chrome and Firefox with the help of https://sites.google.com/a/chromium.org/chromedriver/[chromedriver] and https://firefox-source-docs.mozilla.org/testing/geckodriver/[geckodriver]. When the `FunctionalTestRunner` launches, remote service creates a new webdriver session, which starts the driver and a stripped-down browser instance. We use `browser` service and `webElementWrapper` class to wrap up https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/[Webdriver API]. @@ -204,7 +204,7 @@ Tests should normally setRoles() in the before() and restoreDefaults() in the af [discrete] ==== Anatomy of a test file -This annotated example file shows the basic structure every test suite uses. It starts by importing https://github.com/elastic/kibana/tree/master/packages/kbn-expect[`@kbn/expect`] and defining its default export: an anonymous Test Provider. The test provider then destructures the Provider API for the `getService()` and `getPageObjects()` functions. It uses these functions to collect the dependencies of this suite. The rest of the test file will look pretty normal to mocha.js users. `describe()`, `it()`, `before()` and the lot are used to define suites that happen to automate a browser via services and objects of type `PageObject`. +This annotated example file shows the basic structure every test suite uses. It starts by importing https://github.com/elastic/kibana/tree/main/packages/kbn-expect[`@kbn/expect`] and defining its default export: an anonymous Test Provider. The test provider then destructures the Provider API for the `getService()` and `getPageObjects()` functions. It uses these functions to collect the dependencies of this suite. The rest of the test file will look pretty normal to mocha.js users. `describe()`, `it()`, `before()` and the lot are used to define suites that happen to automate a browser via services and objects of type `PageObject`. ["source","js"] ---- diff --git a/docs/developer/contributing/development-unit-tests.asciidoc b/docs/developer/contributing/development-unit-tests.asciidoc index 3261721c58bab..703862eaa9a06 100644 --- a/docs/developer/contributing/development-unit-tests.asciidoc +++ b/docs/developer/contributing/development-unit-tests.asciidoc @@ -83,6 +83,6 @@ to proceed in this mode. === Unit Testing Plugins Even when using -https://github.com/elastic/kibana/tree/master/packages/kbn-plugin-generator[Kibana +https://github.com/elastic/kibana/tree/main/packages/kbn-plugin-generator[Kibana plugin generator] we do not enforce a way for unit testing your plugin. Please setup and you use the tools of your choice. If the plugin will live inside the Kibana repo `Jest` must be used. \ No newline at end of file diff --git a/docs/developer/contributing/interpreting-ci-failures.asciidoc b/docs/developer/contributing/interpreting-ci-failures.asciidoc index 505aa79849a63..55136dcbc9bc5 100644 --- a/docs/developer/contributing/interpreting-ci-failures.asciidoc +++ b/docs/developer/contributing/interpreting-ci-failures.asciidoc @@ -31,4 +31,4 @@ To view the logs for a failed specific ciGroup, jest, type checkers, linters, et image::images/jenkins/pipeline_steps_view.png[] -Scroll down the page until you find a failed step *(1)*, and then look up a few lines for the `Branch:` step to see which specific job this is. If this is the job you're looking for click the little terminal icon next to the failed step *(1)* to view the logs for that specific step in the Pipeline. \ No newline at end of file +Scroll down the page until you find a failed step *(1)*, and then look up a few lines for the `Branch:` step to see which specific job this is. If this is the job you're looking for click the little terminal icon next to the failed step *(1)* to view the logs for that specific step in the Pipeline. diff --git a/docs/developer/contributing/linting.asciidoc b/docs/developer/contributing/linting.asciidoc index eb7c22c517e4b..e0369484e906c 100644 --- a/docs/developer/contributing/linting.asciidoc +++ b/docs/developer/contributing/linting.asciidoc @@ -31,7 +31,7 @@ EditorConfig, which can be set up by installing a plugin in your editor that dynamically updates its configuration. Take a look at the http://editorconfig.org/#download[EditorConfig] site to find a plugin for your editor, and browse our -https://github.com/elastic/kibana/blob/master/.editorconfig[`.editorconfig`] +https://github.com/elastic/kibana/blob/main/.editorconfig[`.editorconfig`] file to see what config rules we set up. [discrete] diff --git a/docs/developer/plugin-api-changes/plugin-api-changes-7_12.asciidoc b/docs/developer/plugin-api-changes/plugin-api-changes-7_12.asciidoc index 887ae0829acaf..a6940fba1121f 100644 --- a/docs/developer/plugin-api-changes/plugin-api-changes-7_12.asciidoc +++ b/docs/developer/plugin-api-changes/plugin-api-changes-7_12.asciidoc @@ -1,14 +1,81 @@ [[plugin-api-changes]] -== Plugin API changes in 7.13 +== Plugin API changes in {minor-version} ++++ Plugin API changes ++++ This page discusses the plugin API changes that you need to be aware of when migrating -your application to {kib} 7.13. +your application to {kib} {minor-version}. -Other versions: {kibana-ref-all}/7.12/plugin-api-changes.html[7.12] | +Other versions: {kibana-ref-all}/7.15/plugin-api-changes.html[7.15] | +{kibana-ref-all}/7.14/plugin-api-changes.html[7.14] | +{kibana-ref-all}/7.13/plugin-api-changes.html[7.13] | +{kibana-ref-all}/7.12/plugin-api-changes.html[7.12] | {kibana-ref-all}/7.11/plugin-api-changes-7-11.html[7.11] | {kibana-ref-all}/7.10/breaking-changes-7.10.html#general-plugin-API-changes-7-10[7.10] | {kibana-ref-all}/7.9/breaking-changes-7.9.html#general-plugin-API-changes-79[7.9] | {kibana-ref-all}/7.8/breaking-changes-7.8.html#general-plugin-API-changes-78[7.8] + +[[breaking_plugin_v7.16.0_112602]] +.Deprecation warnings logged for plugins that cannot be disabled +[%collapsible] +==== + +The ability for most plugins to be disabled using the `{plugin_name}.enabled` +config option has been deprecated. In 8.0, most {kib} plugins can no longer +be disabled using this option. + +You can still opt-in to this feature by explicitly adding an +`enabled` property to your config schema. However, we recommend against +this when possible. This change affects whether or not a plugin's code is loaded by +{kib}'s core, introducing complexity and creating a new set of configuration +scenarios that must be tested. + +To allow some aspects of your plugin to be disabled, +for example the ability to remove it from the {kib} UI, +we recommend creating "nested" configuration options. For example, use +`{plugin_name}.ui.enabled` instead of `{plugin_name}.enabled`, and then read +from the configuration at runtime to conditionally render your application. +This gives you similar functionality without preventing your plugin code from loading altogether. + +Refer to https://github.com/elastic/kibana/pull/112602[#112602]. + +==== + +[[breaking_plugin_v7.16.0_109368]] +.Angular removed from doc viewer +[%collapsible] +==== + +You can no longer use the `directive` property when registering a `DocView` via +the `addDocView()` method in *Discover* to register an Angular doc view. +Going forward, we no longer support Angular in our plugin APIs. + +Refer to https://github.com/elastic/kibana/pull/109368[#109368]. + +==== + +[[breaking_plugin_v7.16.0_109243]] +.`LegacyRequest` type removed from Core API +[%collapsible] +==== + +The Core API no longer accepts `LegacyRequest` in `BasePath` and `ScopeableRequet` types. + +Refer to https://github.com/elastic/kibana/pull/109243[#109243]. + +==== + +[[breaking_plugin_v7.16.0_107619]] +.Legacy {es} client removed +[%collapsible] +==== + +The legacy {es} client is no longer available in `CoreSetup` and +`RequestHandlerContext` interfaces. Use the +https://www.elastic.co/guide/en/kibana/current/elasticsearch-service.html[new client] +instead. + +Refer to https://github.com/elastic/kibana/pull/107619[#107619]. + +==== diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 03ea196f49837..20b25de01fa3d 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -599,7 +599,7 @@ Documentation: https://www.elastic.co/guide/en/kibana/master/task-manager-produc |<> |Contains Elastic-supported translations. Owned by the Localizations team. -For adding localizations and instrument a ui to support translated content, see https://github.com/elastic/kibana/tree/master/packages/kbn-i18n +For adding localizations and instrument a ui to support translated content, see https://github.com/elastic/kibana/tree/main/packages/kbn-i18n |{kib-repo}blob/{branch}/x-pack/plugins/triggers_actions_ui/README.md[triggersActionsUi] diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md index 2b7fe40af65fa..e99c56112bd99 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md @@ -236,6 +236,8 @@ readonly links: { readonly snapshotRestore: Record; readonly ingest: Record; readonly fleet: Readonly<{ + datastreamsILM: string; + beatsAgentComparison: string; guide: string; fleetServer: string; fleetServerAddFleetServer: string; diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md index fdf469f443f28..5871a84c5402e 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md @@ -17,5 +17,5 @@ export interface DocLinksStart | --- | --- | --- | | [DOC\_LINK\_VERSION](./kibana-plugin-core-public.doclinksstart.doc_link_version.md) | string | | | [ELASTIC\_WEBSITE\_URL](./kibana-plugin-core-public.doclinksstart.elastic_website_url.md) | string | | -| [links](./kibana-plugin-core-public.doclinksstart.links.md) | {
readonly settings: string;
readonly elasticStackGetStarted: string;
readonly apm: {
readonly kibanaSettings: string;
readonly supportedServiceMaps: string;
readonly customLinks: string;
readonly droppedTransactionSpans: string;
readonly upgrading: string;
readonly metaData: string;
};
readonly canvas: {
readonly guide: string;
};
readonly dashboard: {
readonly guide: string;
readonly drilldowns: string;
readonly drilldownsTriggerPicker: string;
readonly urlDrilldownTemplateSyntax: string;
readonly urlDrilldownVariables: string;
};
readonly discover: Record<string, string>;
readonly filebeat: {
readonly base: string;
readonly installation: string;
readonly configuration: string;
readonly elasticsearchOutput: string;
readonly elasticsearchModule: string;
readonly startup: string;
readonly exportedFields: string;
readonly suricataModule: string;
readonly zeekModule: string;
};
readonly auditbeat: {
readonly base: string;
readonly auditdModule: string;
readonly systemModule: string;
};
readonly metricbeat: {
readonly base: string;
readonly configure: string;
readonly httpEndpoint: string;
readonly install: string;
readonly start: string;
};
readonly enterpriseSearch: {
readonly base: string;
readonly appSearchBase: string;
readonly workplaceSearchBase: string;
};
readonly heartbeat: {
readonly base: string;
};
readonly libbeat: {
readonly getStarted: string;
};
readonly logstash: {
readonly base: string;
};
readonly functionbeat: {
readonly base: string;
};
readonly winlogbeat: {
readonly base: string;
};
readonly aggs: {
readonly composite: string;
readonly composite_missing_bucket: string;
readonly date_histogram: string;
readonly date_range: string;
readonly date_format_pattern: string;
readonly filter: string;
readonly filters: string;
readonly geohash_grid: string;
readonly histogram: string;
readonly ip_range: string;
readonly range: string;
readonly significant_terms: string;
readonly terms: string;
readonly avg: string;
readonly avg_bucket: string;
readonly max_bucket: string;
readonly min_bucket: string;
readonly sum_bucket: string;
readonly cardinality: string;
readonly count: string;
readonly cumulative_sum: string;
readonly derivative: string;
readonly geo_bounds: string;
readonly geo_centroid: string;
readonly max: string;
readonly median: string;
readonly min: string;
readonly moving_avg: string;
readonly percentile_ranks: string;
readonly serial_diff: string;
readonly std_dev: string;
readonly sum: string;
readonly top_hits: string;
};
readonly runtimeFields: {
readonly overview: string;
readonly mapping: string;
};
readonly scriptedFields: {
readonly scriptFields: string;
readonly scriptAggs: string;
readonly painless: string;
readonly painlessApi: string;
readonly painlessLangSpec: string;
readonly painlessSyntax: string;
readonly painlessWalkthrough: string;
readonly luceneExpressions: string;
};
readonly search: {
readonly sessions: string;
readonly sessionLimits: string;
};
readonly indexPatterns: {
readonly introduction: string;
readonly fieldFormattersNumber: string;
readonly fieldFormattersString: string;
readonly runtimeFields: string;
};
readonly addData: string;
readonly kibana: string;
readonly upgradeAssistant: string;
readonly rollupJobs: string;
readonly elasticsearch: Record<string, string>;
readonly siem: {
readonly privileges: string;
readonly guide: string;
readonly gettingStarted: string;
readonly ml: string;
readonly ruleChangeLog: string;
readonly detectionsReq: string;
readonly networkMap: string;
readonly troubleshootGaps: string;
};
readonly securitySolution: {
readonly trustedApps: string;
};
readonly query: {
readonly eql: string;
readonly kueryQuerySyntax: string;
readonly luceneQuerySyntax: string;
readonly percolate: string;
readonly queryDsl: string;
readonly autocompleteChanges: string;
};
readonly date: {
readonly dateMath: string;
readonly dateMathIndexNames: string;
};
readonly management: Record<string, string>;
readonly ml: Record<string, string>;
readonly transforms: Record<string, string>;
readonly visualize: Record<string, string>;
readonly apis: Readonly<{
bulkIndexAlias: string;
byteSizeUnits: string;
createAutoFollowPattern: string;
createFollower: string;
createIndex: string;
createSnapshotLifecyclePolicy: string;
createRoleMapping: string;
createRoleMappingTemplates: string;
createRollupJobsRequest: string;
createApiKey: string;
createPipeline: string;
createTransformRequest: string;
cronExpressions: string;
executeWatchActionModes: string;
indexExists: string;
openIndex: string;
putComponentTemplate: string;
painlessExecute: string;
painlessExecuteAPIContexts: string;
putComponentTemplateMetadata: string;
putSnapshotLifecyclePolicy: string;
putIndexTemplateV1: string;
putWatch: string;
simulatePipeline: string;
timeUnits: string;
updateTransform: string;
}>;
readonly observability: Readonly<{
guide: string;
infrastructureThreshold: string;
logsThreshold: string;
metricsThreshold: string;
monitorStatus: string;
monitorUptime: string;
tlsCertificate: string;
uptimeDurationAnomaly: string;
}>;
readonly alerting: Record<string, string>;
readonly maps: Record<string, string>;
readonly monitoring: Record<string, string>;
readonly security: Readonly<{
apiKeyServiceSettings: string;
clusterPrivileges: string;
elasticsearchSettings: string;
elasticsearchEnableSecurity: string;
indicesPrivileges: string;
kibanaTLS: string;
kibanaPrivileges: string;
mappingRoles: string;
mappingRolesFieldRules: string;
runAsPrivilege: string;
}>;
readonly spaces: Readonly<{
kibanaLegacyUrlAliases: string;
kibanaDisableLegacyUrlAliasesApi: string;
}>;
readonly watcher: Record<string, string>;
readonly ccs: Record<string, string>;
readonly plugins: Record<string, string>;
readonly snapshotRestore: Record<string, string>;
readonly ingest: Record<string, string>;
readonly fleet: Readonly<{
guide: string;
fleetServer: string;
fleetServerAddFleetServer: string;
settings: string;
settingsFleetServerHostSettings: string;
troubleshooting: string;
elasticAgent: string;
datastreams: string;
datastreamsNamingScheme: string;
installElasticAgent: string;
upgradeElasticAgent: string;
upgradeElasticAgent712lower: string;
learnMoreBlog: string;
apiKeysLearnMore: string;
}>;
readonly ecs: {
readonly guide: string;
};
readonly clients: {
readonly guide: string;
readonly goOverview: string;
readonly javaIndex: string;
readonly jsIntro: string;
readonly netGuide: string;
readonly perlGuide: string;
readonly phpGuide: string;
readonly pythonGuide: string;
readonly rubyOverview: string;
readonly rustGuide: string;
};
} | | +| [links](./kibana-plugin-core-public.doclinksstart.links.md) | {
readonly settings: string;
readonly elasticStackGetStarted: string;
readonly apm: {
readonly kibanaSettings: string;
readonly supportedServiceMaps: string;
readonly customLinks: string;
readonly droppedTransactionSpans: string;
readonly upgrading: string;
readonly metaData: string;
};
readonly canvas: {
readonly guide: string;
};
readonly dashboard: {
readonly guide: string;
readonly drilldowns: string;
readonly drilldownsTriggerPicker: string;
readonly urlDrilldownTemplateSyntax: string;
readonly urlDrilldownVariables: string;
};
readonly discover: Record<string, string>;
readonly filebeat: {
readonly base: string;
readonly installation: string;
readonly configuration: string;
readonly elasticsearchOutput: string;
readonly elasticsearchModule: string;
readonly startup: string;
readonly exportedFields: string;
readonly suricataModule: string;
readonly zeekModule: string;
};
readonly auditbeat: {
readonly base: string;
readonly auditdModule: string;
readonly systemModule: string;
};
readonly metricbeat: {
readonly base: string;
readonly configure: string;
readonly httpEndpoint: string;
readonly install: string;
readonly start: string;
};
readonly enterpriseSearch: {
readonly base: string;
readonly appSearchBase: string;
readonly workplaceSearchBase: string;
};
readonly heartbeat: {
readonly base: string;
};
readonly libbeat: {
readonly getStarted: string;
};
readonly logstash: {
readonly base: string;
};
readonly functionbeat: {
readonly base: string;
};
readonly winlogbeat: {
readonly base: string;
};
readonly aggs: {
readonly composite: string;
readonly composite_missing_bucket: string;
readonly date_histogram: string;
readonly date_range: string;
readonly date_format_pattern: string;
readonly filter: string;
readonly filters: string;
readonly geohash_grid: string;
readonly histogram: string;
readonly ip_range: string;
readonly range: string;
readonly significant_terms: string;
readonly terms: string;
readonly avg: string;
readonly avg_bucket: string;
readonly max_bucket: string;
readonly min_bucket: string;
readonly sum_bucket: string;
readonly cardinality: string;
readonly count: string;
readonly cumulative_sum: string;
readonly derivative: string;
readonly geo_bounds: string;
readonly geo_centroid: string;
readonly max: string;
readonly median: string;
readonly min: string;
readonly moving_avg: string;
readonly percentile_ranks: string;
readonly serial_diff: string;
readonly std_dev: string;
readonly sum: string;
readonly top_hits: string;
};
readonly runtimeFields: {
readonly overview: string;
readonly mapping: string;
};
readonly scriptedFields: {
readonly scriptFields: string;
readonly scriptAggs: string;
readonly painless: string;
readonly painlessApi: string;
readonly painlessLangSpec: string;
readonly painlessSyntax: string;
readonly painlessWalkthrough: string;
readonly luceneExpressions: string;
};
readonly search: {
readonly sessions: string;
readonly sessionLimits: string;
};
readonly indexPatterns: {
readonly introduction: string;
readonly fieldFormattersNumber: string;
readonly fieldFormattersString: string;
readonly runtimeFields: string;
};
readonly addData: string;
readonly kibana: string;
readonly upgradeAssistant: string;
readonly rollupJobs: string;
readonly elasticsearch: Record<string, string>;
readonly siem: {
readonly privileges: string;
readonly guide: string;
readonly gettingStarted: string;
readonly ml: string;
readonly ruleChangeLog: string;
readonly detectionsReq: string;
readonly networkMap: string;
readonly troubleshootGaps: string;
};
readonly securitySolution: {
readonly trustedApps: string;
};
readonly query: {
readonly eql: string;
readonly kueryQuerySyntax: string;
readonly luceneQuerySyntax: string;
readonly percolate: string;
readonly queryDsl: string;
readonly autocompleteChanges: string;
};
readonly date: {
readonly dateMath: string;
readonly dateMathIndexNames: string;
};
readonly management: Record<string, string>;
readonly ml: Record<string, string>;
readonly transforms: Record<string, string>;
readonly visualize: Record<string, string>;
readonly apis: Readonly<{
bulkIndexAlias: string;
byteSizeUnits: string;
createAutoFollowPattern: string;
createFollower: string;
createIndex: string;
createSnapshotLifecyclePolicy: string;
createRoleMapping: string;
createRoleMappingTemplates: string;
createRollupJobsRequest: string;
createApiKey: string;
createPipeline: string;
createTransformRequest: string;
cronExpressions: string;
executeWatchActionModes: string;
indexExists: string;
openIndex: string;
putComponentTemplate: string;
painlessExecute: string;
painlessExecuteAPIContexts: string;
putComponentTemplateMetadata: string;
putSnapshotLifecyclePolicy: string;
putIndexTemplateV1: string;
putWatch: string;
simulatePipeline: string;
timeUnits: string;
updateTransform: string;
}>;
readonly observability: Readonly<{
guide: string;
infrastructureThreshold: string;
logsThreshold: string;
metricsThreshold: string;
monitorStatus: string;
monitorUptime: string;
tlsCertificate: string;
uptimeDurationAnomaly: string;
}>;
readonly alerting: Record<string, string>;
readonly maps: Record<string, string>;
readonly monitoring: Record<string, string>;
readonly security: Readonly<{
apiKeyServiceSettings: string;
clusterPrivileges: string;
elasticsearchSettings: string;
elasticsearchEnableSecurity: string;
elasticsearchEnableApiKeys: string;
indicesPrivileges: string;
kibanaTLS: string;
kibanaPrivileges: string;
mappingRoles: string;
mappingRolesFieldRules: string;
runAsPrivilege: string;
}>;
readonly spaces: Readonly<{
kibanaLegacyUrlAliases: string;
kibanaDisableLegacyUrlAliasesApi: string;
}>;
readonly watcher: Record<string, string>;
readonly ccs: Record<string, string>;
readonly plugins: Record<string, string>;
readonly snapshotRestore: Record<string, string>;
readonly ingest: Record<string, string>;
readonly fleet: Readonly<{
datastreamsILM: string;
beatsAgentComparison: string;
guide: string;
fleetServer: string;
fleetServerAddFleetServer: string;
settings: string;
settingsFleetServerHostSettings: string;
troubleshooting: string;
elasticAgent: string;
datastreams: string;
datastreamsNamingScheme: string;
installElasticAgent: string;
upgradeElasticAgent: string;
upgradeElasticAgent712lower: string;
learnMoreBlog: string;
apiKeysLearnMore: string;
}>;
readonly ecs: {
readonly guide: string;
};
readonly clients: {
readonly guide: string;
readonly goOverview: string;
readonly javaIndex: string;
readonly jsIntro: string;
readonly netGuide: string;
readonly perlGuide: string;
readonly phpGuide: string;
readonly pythonGuide: string;
readonly rubyOverview: string;
readonly rustGuide: string;
};
} | | diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.incrementcounter.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.incrementcounter.md index 59d98bf4d607b..007b453817c8d 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.incrementcounter.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsrepository.incrementcounter.md @@ -31,7 +31,7 @@ The saved object after the specified fields were incremented When supplying a field name like `stats.api.counter` the field name will be used as-is to create a document like: `{attributes: {'stats.api.counter': 1}}` It will not create a nested structure like: `{attributes: {stats: {api: {counter: 1}}}}` -When using incrementCounter for collecting usage data, you need to ensure that usage collection happens on a best-effort basis and doesn't negatively affect your plugin or users. See https://github.com/elastic/kibana/blob/master/src/plugins/usage\_collection/README.mdx\#tracking-interactions-with-incrementcounter) +When using incrementCounter for collecting usage data, you need to ensure that usage collection happens on a best-effort basis and doesn't negatively affect your plugin or users. See https://github.com/elastic/kibana/blob/main/src/plugins/usage\_collection/README.mdx\#tracking-interactions-with-incrementcounter) ## Example diff --git a/docs/management/connectors/action-types/servicenow-sir.asciidoc b/docs/management/connectors/action-types/servicenow-sir.asciidoc index 40fb07897d206..8847a99fe3af0 100644 --- a/docs/management/connectors/action-types/servicenow-sir.asciidoc +++ b/docs/management/connectors/action-types/servicenow-sir.asciidoc @@ -37,6 +37,7 @@ Use the <> to customize connecto actionTypeId: .servicenow-sir config: apiUrl: https://example.service-now.com/ + usesTableApi: false secrets: username: testuser password: passwordkeystorevalue @@ -45,6 +46,9 @@ Use the <> to customize connecto Config defines information for the connector type. `apiUrl`:: An address that corresponds to *URL*. +`usesTableApi`:: A boolean that indicates if the connector uses the Table API or the Import Set API. + +Note: If `usesTableApi` is set to false the Elastic application should be installed in ServiceNow. Secrets defines sensitive information for the connector type. diff --git a/docs/management/connectors/action-types/servicenow.asciidoc b/docs/management/connectors/action-types/servicenow.asciidoc index eae1fce75731d..bfa8c7db657d0 100644 --- a/docs/management/connectors/action-types/servicenow.asciidoc +++ b/docs/management/connectors/action-types/servicenow.asciidoc @@ -37,6 +37,7 @@ Use the <> to customize connecto actionTypeId: .servicenow config: apiUrl: https://example.service-now.com/ + usesTableApi: false secrets: username: testuser password: passwordkeystorevalue @@ -45,6 +46,9 @@ Use the <> to customize connecto Config defines information for the connector type. `apiUrl`:: An address that corresponds to *URL*. +`usesTableApi`:: A boolean that indicates if the connector uses the Table API or the Import Set API. + +Note: If `usesTableApi` is set to false the Elastic application should be installed in ServiceNow. Secrets defines sensitive information for the connector type. diff --git a/docs/migration/migrate_7_10.asciidoc b/docs/migration/migrate_7_10.asciidoc index 88e8f3f5632bc..eac25c5c50abd 100644 --- a/docs/migration/migrate_7_10.asciidoc +++ b/docs/migration/migrate_7_10.asciidoc @@ -79,7 +79,7 @@ To rename the Ingest Manger plugin to Fleet: ==== Kibana plugins can no longer rely on their server code being automatically transpiled with Babel. -The https://github.com/elastic/kibana/tree/master/packages/kbn-plugin-helpers[`@kbn/plugin-helpers`] +The https://github.com/elastic/kibana/tree/main/packages/kbn-plugin-helpers[`@kbn/plugin-helpers`] provide a build task that will transform a plugin's server code to plain JS via Babel, but plugin authors can use a tool of their choosing to accomplish the same result. @@ -491,7 +491,7 @@ Resolves https://github.com/elastic/kibana/issues/73557[#73557]. {kib} provides the new {es} client as a part of the {es} service on the server-side. The legacy client is deprecated on and subject for removal in `7.x`. Reference -the https://github.com/elastic/kibana/blob/master/src/core/MIGRATION_EXAMPLES.md#elasticsearch-client[migration guide] to refactor your code +the https://github.com/elastic/kibana/blob/main/src/core/MIGRATION_EXAMPLES.md#elasticsearch-client[migration guide] to refactor your code *via https://github.com/elastic/kibana/pull/73651[#73651]* diff --git a/docs/migration/migrate_7_7.asciidoc b/docs/migration/migrate_7_7.asciidoc index b7185b6849d11..a446a54b8f44e 100644 --- a/docs/migration/migrate_7_7.asciidoc +++ b/docs/migration/migrate_7_7.asciidoc @@ -64,7 +64,7 @@ const myPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginAp For more information on where to locate new platform `data` services, please refer to the table of -https://github.com/elastic/kibana/blob/master/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] +https://github.com/elastic/kibana/blob/main/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] in `src/core/MIGRATION.md`. *via {kib-pull}60449[#60449]* @@ -227,7 +227,7 @@ const trigger = { ==== Use log4j pattern syntax Logging output of the New platform plugins can use adjusted -via https://github.com/elastic/kibana/blob/master/src/core/server/logging/README.md[new config]. +via https://github.com/elastic/kibana/blob/main/src/core/server/logging/README.md[new config]. *via {kib-pull}57433[#57433]* @@ -385,14 +385,14 @@ const reactToUiComponent: (comp: React.ComponentType) => UiComponent; ==== Start consuming np logging config Provides experimental support of new logging format for **new platform plugins**. -More about https://github.com/elastic/kibana/blob/master/src/core/server/logging/README.md[the logging format]. +More about https://github.com/elastic/kibana/blob/main/src/core/server/logging/README.md[the logging format]. *via {kib-pull}56480[#56480]* [discrete] ==== [State Management] State syncing utils docs -Refer to https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync[these docs] +Refer to https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_sync[these docs] on state syncing utils. *via {kib-pull}56479[#56479]* @@ -508,8 +508,8 @@ import { BUCKET_TYPES, METRIC_TYPES } from 'src/plugins/data/public'; The above examples are not comprehensive, but represent some of the more common uses of `agg_types`. For more details, please refer to the interfaces -in https://github.com/elastic/kibana/blob/master/src/plugins/data/public/types.ts#L50[the source code], -as well as the data plugin's https://github.com/elastic/kibana/blob/master/src/plugins/data/public/index.ts#L282[`public/index` file]. +in https://github.com/elastic/kibana/blob/main/src/plugins/data/public/types.ts#L50[the source code], +as well as the data plugin's https://github.com/elastic/kibana/blob/main/src/plugins/data/public/index.ts#L282[`public/index` file]. *`ui/time_buckets`* https://github.com/elastic/kibana/pull/58805[#58805] diff --git a/docs/migration/migrate_7_8.asciidoc b/docs/migration/migrate_7_8.asciidoc index 49d677bcd854f..91eeb7f32cea9 100644 --- a/docs/migration/migrate_7_8.asciidoc +++ b/docs/migration/migrate_7_8.asciidoc @@ -383,7 +383,7 @@ The corresponding code was previously moved to the new platform. For more information on where to locate new platform `data` services, refer to the -https://github.com/elastic/kibana/blob/master/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] +https://github.com/elastic/kibana/blob/main/src/core/MIGRATION.md#plugins-for-shared-application-services[plugins for shared application services] in `src/core/MIGRATION.md`. *via https://github.com/elastic/kibana/pull/61618[#61618]* diff --git a/docs/migration/migrate_7_9.asciidoc b/docs/migration/migrate_7_9.asciidoc index c7c6e942f7587..2fc792c348660 100644 --- a/docs/migration/migrate_7_9.asciidoc +++ b/docs/migration/migrate_7_9.asciidoc @@ -422,8 +422,8 @@ setup(core: CoreSetup) { The API reference docs for `state_sync` and `state_containers` are now available: -* https://github.com/elastic/kibana/blob/master/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.md[state_sync] -* https://github.com/elastic/kibana/blob/master/docs/development/plugins/kibana_utils/common/state_containers/kibana-plugin-plugins-kibana_utils-common-state_containers.md[state_containers] +* https://github.com/elastic/kibana/blob/main/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.md[state_sync] +* https://github.com/elastic/kibana/blob/main/docs/development/plugins/kibana_utils/common/state_containers/kibana-plugin-plugins-kibana_utils-common-state_containers.md[state_containers] *via https://github.com/elastic/kibana/pull/67354[#67354]* diff --git a/docs/settings/spaces-settings.asciidoc b/docs/settings/spaces-settings.asciidoc index 969adb93185d0..97ce5c191c88c 100644 --- a/docs/settings/spaces-settings.asciidoc +++ b/docs/settings/spaces-settings.asciidoc @@ -18,7 +18,7 @@ return all spaces using a single `_search` from {es}, so you must configure this setting lower than the `index.max_result_window` in {es}. The default is `1000`. -`monitoring.cluster_alerts-allowedSpaces` {ess-icon}:: +`monitoring.cluster_alerts.allowedSpaces` {ess-icon}:: Specifies the spaces where cluster alerts are automatically generated. You must specify all spaces where you want to generate alerts, including the default space. When the default space is unspecified, {kib} is unable to generate an alert for the default space. diff --git a/examples/bfetch_explorer/public/plugin.tsx b/examples/bfetch_explorer/public/plugin.tsx index f96a900063340..fd4687c5fb149 100644 --- a/examples/bfetch_explorer/public/plugin.tsx +++ b/examples/bfetch_explorer/public/plugin.tsx @@ -52,7 +52,7 @@ export class BfetchExplorerPlugin implements Plugin { links: [ { label: 'README', - href: 'https://github.com/elastic/kibana/blob/master/src/plugins/bfetch/README.md', + href: 'https://github.com/elastic/kibana/blob/main/src/plugins/bfetch/README.md', iconType: 'logoGithub', size: 's', target: '_blank', diff --git a/examples/developer_examples/README.md b/examples/developer_examples/README.md index 1a57838c43d24..db847b342d46b 100644 --- a/examples/developer_examples/README.md +++ b/examples/developer_examples/README.md @@ -14,7 +14,7 @@ services. Add your a link to your example using the developerExamples `register` links: [ { label: 'README', - href: 'https://github.com/elastic/kibana/tree/master/src/plugins/foo/README.md', + href: 'https://github.com/elastic/kibana/tree/main/src/plugins/foo/README.md', iconType: 'logoGithub', target: '_blank', size: 's', diff --git a/examples/embeddable_explorer/public/plugin.tsx b/examples/embeddable_explorer/public/plugin.tsx index 2154a69ce1a87..f6cdee1da126c 100644 --- a/examples/embeddable_explorer/public/plugin.tsx +++ b/examples/embeddable_explorer/public/plugin.tsx @@ -63,7 +63,7 @@ export class EmbeddableExplorerPlugin implements Plugin { demonstrated. You can read more about it{' '} here diff --git a/examples/expressions_explorer/public/plugin.tsx b/examples/expressions_explorer/public/plugin.tsx index 7eee563c43f27..329dcfbb11d45 100644 --- a/examples/expressions_explorer/public/plugin.tsx +++ b/examples/expressions_explorer/public/plugin.tsx @@ -72,7 +72,7 @@ export class ExpressionsExplorerPlugin implements Plugin { links: [ { label: 'IRouter', - href: 'https://github.com/elastic/kibana/blob/master/docs/development/core/server/kibana-plugin-core-server.irouter.md', + href: 'https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.irouter.md', iconType: 'logoGithub', target: '_blank', size: 's', }, { label: 'HttpHandler (core.http.fetch)', - href: 'https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.httphandler.md', + href: 'https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.httphandler.md', iconType: 'logoGithub', target: '_blank', size: 's', diff --git a/examples/screenshot_mode_example/README.md b/examples/screenshot_mode_example/README.md index ebae7480ca5fe..0e37f9bab78cc 100755 --- a/examples/screenshot_mode_example/README.md +++ b/examples/screenshot_mode_example/README.md @@ -6,4 +6,4 @@ A Kibana plugin ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/examples/search_examples/README.md b/examples/search_examples/README.md index bcc17bf7f3333..0ffd4b6cf96c6 100644 --- a/examples/search_examples/README.md +++ b/examples/search_examples/README.md @@ -6,4 +6,4 @@ ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/examples/search_examples/public/application.tsx b/examples/search_examples/public/application.tsx index 1920cdbe5c697..4e5212b6f76a2 100644 --- a/examples/search_examples/public/application.tsx +++ b/examples/search_examples/public/application.tsx @@ -27,7 +27,7 @@ const LINKS: ExampleLink[] = [ title: 'Search Sessions', }, { - path: 'https://github.com/elastic/kibana/blob/master/src/plugins/data/README.mdx', + path: 'https://github.com/elastic/kibana/blob/main/src/plugins/data/README.mdx', title: 'README (GitHub)', }, ]; diff --git a/examples/search_examples/public/plugin.ts b/examples/search_examples/public/plugin.ts index b00362aef1f5e..0645dcc1d4021 100644 --- a/examples/search_examples/public/plugin.ts +++ b/examples/search_examples/public/plugin.ts @@ -59,7 +59,7 @@ export class SearchExamplesPlugin links: [ { label: 'README', - href: 'https://github.com/elastic/kibana/tree/master/src/plugins/data/README.mdx', + href: 'https://github.com/elastic/kibana/tree/main/src/plugins/data/README.mdx', iconType: 'logoGithub', target: '_blank', size: 's', diff --git a/examples/state_containers_examples/public/plugin.ts b/examples/state_containers_examples/public/plugin.ts index ac65d42ae4050..bfc20fd2b48d2 100644 --- a/examples/state_containers_examples/public/plugin.ts +++ b/examples/state_containers_examples/public/plugin.ts @@ -88,14 +88,14 @@ export class StateContainersExamplesPlugin implements Plugin { links: [ { label: 'State containers README', - href: 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers', + href: 'https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_containers', iconType: 'logoGithub', size: 's', target: '_blank', }, { label: 'State sync utils README', - href: 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync', + href: 'https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_sync', iconType: 'logoGithub', size: 's', target: '_blank', diff --git a/examples/ui_actions_explorer/public/plugin.tsx b/examples/ui_actions_explorer/public/plugin.tsx index d3a87c5b64fd6..2b4365e987ac8 100644 --- a/examples/ui_actions_explorer/public/plugin.tsx +++ b/examples/ui_actions_explorer/public/plugin.tsx @@ -85,7 +85,7 @@ export class UiActionsExplorerPlugin implements Plugin instance.transaction('GET /api/product/list') - .timestamp(timestamp) - .duration(1000) - .success() - .children( - instance.span('GET apm-*/_search', 'db', 'elasticsearch') - .timestamp(timestamp + 50) - .duration(900) - .destination('elasticsearch') - .success() - ).serialize() - ); - -const metricsets = timerange(from, to) - .interval('30s') - .rate(1) - .flatMap(timestamp => instance.appMetrics({ - 'system.memory.actual.free': 800, - 'system.memory.total': 1000, - 'system.cpu.total.norm.pct': 0.6, - 'system.process.cpu.total.norm.pct': 0.7, - }).timestamp(timestamp) - .serialize() - ); - -const esEvents = toElasticsearchOutput(traceEvents.concat(metricsets)); -``` - -#### Generating metricsets - -`@elastic/apm-generator` can also automatically generate transaction metrics, span destination metrics and transaction breakdown metrics based on the generated trace events. If we expand on the previous example: - -```ts -import { getTransactionMetrics, getSpanDestinationMetrics, getBreakdownMetrics } from '@elastic/apm-generator'; - -const esEvents = toElasticsearchOutput([ - ...traceEvents, - ...getTransactionMetrics(traceEvents), - ...getSpanDestinationMetrics(traceEvents), - ...getBreakdownMetrics(traceEvents) -]); -``` - -### CLI - -Via the CLI, you can upload examples. The supported examples are listed in `src/lib/es.ts`. A `--target` option that specifies the Elasticsearch URL should be defined when running the `example` command. Here's an example: - -`$ node packages/elastic-apm-generator/src/scripts/es.js example simple-trace --target=http://admin:changeme@localhost:9200` - -The following options are supported: -- `to`: the end of the time range, in ISO format. By default, the current time will be used. -- `from`: the start of the time range, in ISO format. By default, `to` minus 15 minutes will be used. -- `apm-server-version`: the version used in the index names bootstrapped by APM Server, e.g. `7.16.0`. __If these indices do not exist, the script will exit with an error. It will not bootstrap the indices itself.__ - diff --git a/packages/elastic-apm-generator/src/scripts/es.ts b/packages/elastic-apm-generator/src/scripts/es.ts deleted file mode 100644 index d023ef7172892..0000000000000 --- a/packages/elastic-apm-generator/src/scripts/es.ts +++ /dev/null @@ -1,113 +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 { inspect } from 'util'; -import { Client } from '@elastic/elasticsearch'; -import { chunk } from 'lodash'; -import pLimit from 'p-limit'; -import yargs from 'yargs/yargs'; -import { toElasticsearchOutput } from '..'; -import { simpleTrace } from './examples/01_simple_trace'; - -yargs(process.argv.slice(2)) - .command( - 'example', - 'run an example scenario', - (y) => { - return y - .positional('scenario', { - describe: 'scenario to run', - choices: ['simple-trace'], - demandOption: true, - }) - .option('target', { - describe: 'elasticsearch target, including username/password', - }) - .option('from', { describe: 'start of timerange' }) - .option('to', { describe: 'end of timerange' }) - .option('workers', { - default: 1, - describe: 'number of concurrently connected ES clients', - }) - .option('apm-server-version', { - describe: 'APM Server version override', - }) - .demandOption('target'); - }, - (argv) => { - let events: any[] = []; - const toDateString = (argv.to as string | undefined) || new Date().toISOString(); - const fromDateString = - (argv.from as string | undefined) || - new Date(new Date(toDateString).getTime() - 15 * 60 * 1000).toISOString(); - - const to = new Date(toDateString).getTime(); - const from = new Date(fromDateString).getTime(); - - switch (argv._[1]) { - case 'simple-trace': - events = simpleTrace(from, to); - break; - } - - const docs = toElasticsearchOutput(events, argv['apm-server-version'] as string); - - const client = new Client({ - node: argv.target as string, - }); - - const fn = pLimit(argv.workers); - - const batches = chunk(docs, 1000); - - // eslint-disable-next-line no-console - console.log( - 'Uploading', - docs.length, - 'docs in', - batches.length, - 'batches', - 'from', - fromDateString, - 'to', - toDateString - ); - - Promise.all( - batches.map((batch) => - fn(() => { - return client.bulk({ - require_alias: true, - body: batch.flatMap((doc) => { - return [{ index: { _index: doc._index } }, doc._source]; - }), - }); - }) - ) - ) - .then((results) => { - const errors = results - .flatMap((result) => result.body.items) - .filter((item) => !!item.index?.error) - .map((item) => item.index?.error); - - if (errors.length) { - // eslint-disable-next-line no-console - console.error(inspect(errors.slice(0, 10), { depth: null })); - throw new Error('Failed to upload some items'); - } - process.exit(); - }) - .catch((err) => { - // eslint-disable-next-line no-console - console.error(err); - process.exit(1); - }); - } - ) - .parse(); diff --git a/packages/elastic-apm-generator/src/test/to_elasticsearch_output.test.ts b/packages/elastic-apm-generator/src/test/to_elasticsearch_output.test.ts deleted file mode 100644 index c1a5d47654fc9..0000000000000 --- a/packages/elastic-apm-generator/src/test/to_elasticsearch_output.test.ts +++ /dev/null @@ -1,37 +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 { Fields } from '../lib/entity'; -import { toElasticsearchOutput } from '../lib/output/to_elasticsearch_output'; - -describe('output to elasticsearch', () => { - let event: Fields; - - beforeEach(() => { - event = { - '@timestamp': new Date('2020-12-31T23:00:00.000Z').getTime(), - 'processor.event': 'transaction', - 'processor.name': 'transaction', - }; - }); - - it('properly formats @timestamp', () => { - const doc = toElasticsearchOutput([event])[0] as any; - - expect(doc._source['@timestamp']).toEqual('2020-12-31T23:00:00.000Z'); - }); - - it('formats a nested object', () => { - const doc = toElasticsearchOutput([event])[0] as any; - - expect(doc._source.processor).toEqual({ - event: 'transaction', - name: 'transaction', - }); - }); -}); diff --git a/packages/elastic-apm-generator/BUILD.bazel b/packages/elastic-apm-synthtrace/BUILD.bazel similarity index 91% rename from packages/elastic-apm-generator/BUILD.bazel rename to packages/elastic-apm-synthtrace/BUILD.bazel index 6b46b2b9181e5..5d9510c6a81d5 100644 --- a/packages/elastic-apm-generator/BUILD.bazel +++ b/packages/elastic-apm-synthtrace/BUILD.bazel @@ -2,8 +2,8 @@ load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project") load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") load("//src/dev/bazel:index.bzl", "jsts_transpiler") -PKG_BASE_NAME = "elastic-apm-generator" -PKG_REQUIRE_NAME = "@elastic/apm-generator" +PKG_BASE_NAME = "elastic-apm-synthtrace" +PKG_REQUIRE_NAME = "@elastic/apm-synthtrace" SOURCE_FILES = glob( [ @@ -25,6 +25,7 @@ NPM_MODULE_EXTRA_FILES = [ ] RUNTIME_DEPS = [ + "//packages/elastic-datemath", "@npm//@elastic/elasticsearch", "@npm//lodash", "@npm//moment", @@ -36,6 +37,7 @@ RUNTIME_DEPS = [ ] TYPES_DEPS = [ + "//packages/elastic-datemath", "@npm//@elastic/elasticsearch", "@npm//moment", "@npm//p-limit", diff --git a/packages/elastic-apm-synthtrace/README.md b/packages/elastic-apm-synthtrace/README.md new file mode 100644 index 0000000000000..cdbd536831676 --- /dev/null +++ b/packages/elastic-apm-synthtrace/README.md @@ -0,0 +1,116 @@ +# @elastic/apm-synthtrace + +`@elastic/apm-synthtrace` is an experimental tool to generate synthetic APM data. It is intended to be used for development and testing of the Elastic APM app in Kibana. + +At a high-level, the module works by modeling APM events/metricsets with [a fluent API](https://en.wikipedia.org/wiki/Fluent_interface). The models can then be serialized and converted to Elasticsearch documents. In the future we might support APM Server as an output as well. + +## Usage + +This section assumes that you've installed Kibana's dependencies by running `yarn kbn bootstrap` in the repository's root folder. + +This library can currently be used in two ways: + +- Imported as a Node.js module, for instance to be used in Kibana's functional test suite. +- With a command line interface, to index data based on a specified scenario. + +### Using the Node.js module + +#### Concepts + +- `Service`: a logical grouping for a monitored service. A `Service` object contains fields like `service.name`, `service.environment` and `agent.name`. +- `Instance`: a single instance of a monitored service. E.g., the workload for a monitored service might be spread across multiple containers. An `Instance` object contains fields like `service.node.name` and `container.id`. +- `Timerange`: an object that will return an array of timestamps based on an interval and a rate. These timestamps can be used to generate events/metricsets. +- `Transaction`, `Span`, `APMError` and `Metricset`: events/metricsets that occur on an instance. For more background, see the [explanation of the APM data model](https://www.elastic.co/guide/en/apm/get-started/7.15/apm-data-model.html) + +#### Example + +```ts +import { service, timerange, toElasticsearchOutput } from '@elastic/apm-synthtrace'; + +const instance = service('synth-go', 'production', 'go').instance('instance-a'); + +const from = new Date('2021-01-01T12:00:00.000Z').getTime(); +const to = new Date('2021-01-01T12:00:00.000Z').getTime(); + +const traceEvents = timerange(from, to) + .interval('1m') + .rate(10) + .flatMap((timestamp) => + instance + .transaction('GET /api/product/list') + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span('GET apm-*/_search', 'db', 'elasticsearch') + .timestamp(timestamp + 50) + .duration(900) + .destination('elasticsearch') + .success() + ) + .serialize() + ); + +const metricsets = timerange(from, to) + .interval('30s') + .rate(1) + .flatMap((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + .serialize() + ); + +const esEvents = toElasticsearchOutput(traceEvents.concat(metricsets)); +``` + +#### Generating metricsets + +`@elastic/apm-synthtrace` can also automatically generate transaction metrics, span destination metrics and transaction breakdown metrics based on the generated trace events. If we expand on the previous example: + +```ts +import { + getTransactionMetrics, + getSpanDestinationMetrics, + getBreakdownMetrics, +} from '@elastic/apm-synthtrace'; + +const esEvents = toElasticsearchOutput([ + ...traceEvents, + ...getTransactionMetrics(traceEvents), + ...getSpanDestinationMetrics(traceEvents), + ...getBreakdownMetrics(traceEvents), +]); +``` + +### CLI + +Via the CLI, you can upload scenarios, either using a fixed time range or continuously generating data. Some examples are available in in `src/scripts/examples`. Here's an example for live data: + +`$ node packages/elastic-apm-synthtrace/src/scripts/run packages/elastic-apm-synthtrace/src/scripts/examples/01_simple_trace.ts --target=http://admin:changeme@localhost:9200 --live` + +For a fixed time window: +`$ node packages/elastic-apm-synthtrace/src/scripts/run packages/elastic-apm-synthtrace/src/scripts/examples/01_simple_trace.ts --target=http://admin:changeme@localhost:9200 --from=now-24h --to=now` + +The script will try to automatically find bootstrapped APM indices. __If these indices do not exist, the script will exit with an error. It will not bootstrap the indices itself.__ + +The following options are supported: +| Option | Description | Default | +| ------------------| ------------------------------------------------------- | ------------ | +| `--target` | Elasticsearch target, including username/password. | **Required** | +| `--from` | The start of the time window. | `now - 15m` | +| `--to` | The end of the time window. | `now` | +| `--live` | Continously ingest data | `false` | +| `--clean` | Clean APM indices before indexing new data. | `false` | +| `--workers` | Amount of Node.js worker threads | `5` | +| `--bucketSize` | Size of bucket for which to generate data. | `15m` | +| `--interval` | The interval at which to index data. | `10s` | +| `--clientWorkers` | Number of simultaneously connected ES clients | `5` | +| `--batchSize` | Number of documents per bulk index request | `1000` | +| `--logLevel` | Log level. | `info` | diff --git a/packages/elastic-apm-generator/jest.config.js b/packages/elastic-apm-synthtrace/jest.config.js similarity index 89% rename from packages/elastic-apm-generator/jest.config.js rename to packages/elastic-apm-synthtrace/jest.config.js index 64aaa43741cc3..13d8643c5213c 100644 --- a/packages/elastic-apm-generator/jest.config.js +++ b/packages/elastic-apm-synthtrace/jest.config.js @@ -9,7 +9,7 @@ module.exports = { preset: '@kbn/test', rootDir: '../..', - roots: ['/packages/elastic-apm-generator'], + roots: ['/packages/elastic-apm-synthtrace'], setupFiles: [], setupFilesAfterEnv: [], }; diff --git a/packages/elastic-apm-generator/package.json b/packages/elastic-apm-synthtrace/package.json similarity index 85% rename from packages/elastic-apm-generator/package.json rename to packages/elastic-apm-synthtrace/package.json index 57dafd5d6431d..43699e4795586 100644 --- a/packages/elastic-apm-generator/package.json +++ b/packages/elastic-apm-synthtrace/package.json @@ -1,5 +1,5 @@ { - "name": "@elastic/apm-generator", + "name": "@elastic/apm-synthtrace", "version": "0.1.0", "description": "Elastic APM trace data generator", "license": "SSPL-1.0 OR Elastic License 2.0", diff --git a/packages/elastic-apm-synthtrace/src/.eslintrc.js b/packages/elastic-apm-synthtrace/src/.eslintrc.js new file mode 100644 index 0000000000000..2e3eef95f4bf3 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/.eslintrc.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 = { + rules: { + 'import/no-default-export': 'off', + }, +}; diff --git a/packages/elastic-apm-generator/src/index.ts b/packages/elastic-apm-synthtrace/src/index.ts similarity index 100% rename from packages/elastic-apm-generator/src/index.ts rename to packages/elastic-apm-synthtrace/src/index.ts diff --git a/packages/elastic-apm-generator/src/lib/apm_error.ts b/packages/elastic-apm-synthtrace/src/lib/apm_error.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/apm_error.ts rename to packages/elastic-apm-synthtrace/src/lib/apm_error.ts diff --git a/packages/elastic-apm-generator/src/lib/base_span.ts b/packages/elastic-apm-synthtrace/src/lib/base_span.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/base_span.ts rename to packages/elastic-apm-synthtrace/src/lib/base_span.ts diff --git a/packages/elastic-apm-generator/src/lib/defaults/get_observer_defaults.ts b/packages/elastic-apm-synthtrace/src/lib/defaults/get_observer_defaults.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/defaults/get_observer_defaults.ts rename to packages/elastic-apm-synthtrace/src/lib/defaults/get_observer_defaults.ts diff --git a/packages/elastic-apm-generator/src/lib/entity.ts b/packages/elastic-apm-synthtrace/src/lib/entity.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/entity.ts rename to packages/elastic-apm-synthtrace/src/lib/entity.ts diff --git a/packages/elastic-apm-generator/src/lib/instance.ts b/packages/elastic-apm-synthtrace/src/lib/instance.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/instance.ts rename to packages/elastic-apm-synthtrace/src/lib/instance.ts diff --git a/packages/elastic-apm-generator/src/lib/interval.ts b/packages/elastic-apm-synthtrace/src/lib/interval.ts similarity index 96% rename from packages/elastic-apm-generator/src/lib/interval.ts rename to packages/elastic-apm-synthtrace/src/lib/interval.ts index f13d54fd7415e..bafd1a06c5348 100644 --- a/packages/elastic-apm-generator/src/lib/interval.ts +++ b/packages/elastic-apm-synthtrace/src/lib/interval.ts @@ -21,7 +21,7 @@ export class Interval { throw new Error('Failed to parse interval'); } const timestamps: number[] = []; - while (now <= this.to) { + while (now < this.to) { timestamps.push(...new Array(rate).fill(now)); now = moment(now) .add(Number(args[1]), args[2] as any) diff --git a/packages/elastic-apm-generator/src/lib/metricset.ts b/packages/elastic-apm-synthtrace/src/lib/metricset.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/metricset.ts rename to packages/elastic-apm-synthtrace/src/lib/metricset.ts diff --git a/packages/elastic-apm-generator/src/lib/output/to_elasticsearch_output.ts b/packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts similarity index 52% rename from packages/elastic-apm-generator/src/lib/output/to_elasticsearch_output.ts rename to packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts index d90ce8e01f83d..016f1c5362fb4 100644 --- a/packages/elastic-apm-generator/src/lib/output/to_elasticsearch_output.ts +++ b/packages/elastic-apm-synthtrace/src/lib/output/to_elasticsearch_output.ts @@ -10,26 +10,59 @@ import { set } from 'lodash'; import { getObserverDefaults } from '../..'; import { Fields } from '../entity'; -export function toElasticsearchOutput(events: Fields[], versionOverride?: string) { +export interface ElasticsearchOutput { + _index: string; + _source: unknown; +} + +export interface ElasticsearchOutputWriteTargets { + transaction: string; + span: string; + error: string; + metric: string; +} + +const observerDefaults = getObserverDefaults(); + +const esDocumentDefaults = { + ecs: { + version: '1.4', + }, +}; + +// eslint-disable-next-line guard-for-in +for (const key in observerDefaults) { + set(esDocumentDefaults, key, observerDefaults[key as keyof typeof observerDefaults]); +} +export function toElasticsearchOutput({ + events, + writeTargets, +}: { + events: Fields[]; + writeTargets: ElasticsearchOutputWriteTargets; +}): ElasticsearchOutput[] { return events.map((event) => { - const values = { - ...event, - ...getObserverDefaults(), + const values = {}; + + Object.assign(values, event, { '@timestamp': new Date(event['@timestamp']!).toISOString(), 'timestamp.us': event['@timestamp']! * 1000, - 'ecs.version': '1.4', 'service.node.name': event['service.node.name'] || event['container.id'] || event['host.name'], - }; + }); const document = {}; + + Object.assign(document, esDocumentDefaults); + // eslint-disable-next-line guard-for-in for (const key in values) { const val = values[key as keyof typeof values]; set(document, key, val); } + return { - _index: `apm-${versionOverride || values['observer.version']}-${values['processor.event']}`, + _index: writeTargets[event['processor.event'] as keyof ElasticsearchOutputWriteTargets], _source: document, }; }); diff --git a/packages/elastic-apm-generator/src/lib/serializable.ts b/packages/elastic-apm-synthtrace/src/lib/serializable.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/serializable.ts rename to packages/elastic-apm-synthtrace/src/lib/serializable.ts diff --git a/packages/elastic-apm-generator/src/lib/service.ts b/packages/elastic-apm-synthtrace/src/lib/service.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/service.ts rename to packages/elastic-apm-synthtrace/src/lib/service.ts diff --git a/packages/elastic-apm-generator/src/lib/span.ts b/packages/elastic-apm-synthtrace/src/lib/span.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/span.ts rename to packages/elastic-apm-synthtrace/src/lib/span.ts diff --git a/packages/elastic-apm-generator/src/lib/timerange.ts b/packages/elastic-apm-synthtrace/src/lib/timerange.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/timerange.ts rename to packages/elastic-apm-synthtrace/src/lib/timerange.ts diff --git a/packages/elastic-apm-generator/src/lib/transaction.ts b/packages/elastic-apm-synthtrace/src/lib/transaction.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/transaction.ts rename to packages/elastic-apm-synthtrace/src/lib/transaction.ts diff --git a/packages/elastic-apm-generator/src/lib/utils/aggregate.ts b/packages/elastic-apm-synthtrace/src/lib/utils/aggregate.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/utils/aggregate.ts rename to packages/elastic-apm-synthtrace/src/lib/utils/aggregate.ts diff --git a/packages/elastic-apm-generator/src/lib/utils/create_picker.ts b/packages/elastic-apm-synthtrace/src/lib/utils/create_picker.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/utils/create_picker.ts rename to packages/elastic-apm-synthtrace/src/lib/utils/create_picker.ts diff --git a/packages/elastic-apm-generator/src/lib/utils/generate_id.ts b/packages/elastic-apm-synthtrace/src/lib/utils/generate_id.ts similarity index 63% rename from packages/elastic-apm-generator/src/lib/utils/generate_id.ts rename to packages/elastic-apm-synthtrace/src/lib/utils/generate_id.ts index cc372a56209aa..c65c2843ddd3b 100644 --- a/packages/elastic-apm-generator/src/lib/utils/generate_id.ts +++ b/packages/elastic-apm-synthtrace/src/lib/utils/generate_id.ts @@ -6,20 +6,17 @@ * Side Public License, v 1. */ -import uuidv5 from 'uuid/v5'; - let seq = 0; -const namespace = 'f38d5b83-8eee-4f5b-9aa6-2107e15a71e3'; - -function generateId(seed?: string) { - return uuidv5(seed ?? String(seq++), namespace).replace(/-/g, ''); +function generateId(seed?: string, length: number = 32) { + const str = seed ?? String(seq++); + return str.padStart(length, '0'); } export function generateShortId(seed?: string) { - return generateId(seed).substr(0, 16); + return generateId(seed, 16); } export function generateLongId(seed?: string) { - return generateId(seed).substr(0, 32); + return generateId(seed, 32); } diff --git a/packages/elastic-apm-generator/src/lib/utils/get_breakdown_metrics.ts b/packages/elastic-apm-synthtrace/src/lib/utils/get_breakdown_metrics.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/utils/get_breakdown_metrics.ts rename to packages/elastic-apm-synthtrace/src/lib/utils/get_breakdown_metrics.ts diff --git a/packages/elastic-apm-generator/src/lib/utils/get_span_destination_metrics.ts b/packages/elastic-apm-synthtrace/src/lib/utils/get_span_destination_metrics.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/utils/get_span_destination_metrics.ts rename to packages/elastic-apm-synthtrace/src/lib/utils/get_span_destination_metrics.ts diff --git a/packages/elastic-apm-generator/src/lib/utils/get_transaction_metrics.ts b/packages/elastic-apm-synthtrace/src/lib/utils/get_transaction_metrics.ts similarity index 100% rename from packages/elastic-apm-generator/src/lib/utils/get_transaction_metrics.ts rename to packages/elastic-apm-synthtrace/src/lib/utils/get_transaction_metrics.ts diff --git a/packages/elastic-apm-generator/src/scripts/examples/01_simple_trace.ts b/packages/elastic-apm-synthtrace/src/scripts/examples/01_simple_trace.ts similarity index 52% rename from packages/elastic-apm-generator/src/scripts/examples/01_simple_trace.ts rename to packages/elastic-apm-synthtrace/src/scripts/examples/01_simple_trace.ts index f6aad154532c2..8c1f24bd5e64f 100644 --- a/packages/elastic-apm-generator/src/scripts/examples/01_simple_trace.ts +++ b/packages/elastic-apm-synthtrace/src/scripts/examples/01_simple_trace.ts @@ -9,17 +9,21 @@ import { service, timerange, getTransactionMetrics, getSpanDestinationMetrics } from '../..'; import { getBreakdownMetrics } from '../../lib/utils/get_breakdown_metrics'; -export function simpleTrace(from: number, to: number) { - const instance = service('opbeans-go', 'production', 'go').instance('instance'); +export default function ({ from, to }: { from: number; to: number }) { + const numServices = 3; const range = timerange(from, to); - const transactionName = '240rpm/60% 1000ms'; + const transactionName = '240rpm/75% 1000ms'; - const successfulTraceEvents = range - .interval('1s') - .rate(3) - .flatMap((timestamp) => + const successfulTimestamps = range.interval('1s').rate(3); + + const failedTimestamps = range.interval('1s').rate(1); + + return new Array(numServices).fill(undefined).flatMap((_, index) => { + const instance = service(`opbeans-go-${index}`, 'production', 'go').instance('instance'); + + const successfulTraceEvents = successfulTimestamps.flatMap((timestamp) => instance .transaction(transactionName) .timestamp(timestamp) @@ -37,10 +41,7 @@ export function simpleTrace(from: number, to: number) { .serialize() ); - const failedTraceEvents = range - .interval('1s') - .rate(1) - .flatMap((timestamp) => + const failedTraceEvents = failedTimestamps.flatMap((timestamp) => instance .transaction(transactionName) .timestamp(timestamp) @@ -52,27 +53,28 @@ export function simpleTrace(from: number, to: number) { .serialize() ); - const metricsets = range - .interval('30s') - .rate(1) - .flatMap((timestamp) => - instance - .appMetrics({ - 'system.memory.actual.free': 800, - 'system.memory.total': 1000, - 'system.cpu.total.norm.pct': 0.6, - 'system.process.cpu.total.norm.pct': 0.7, - }) - .timestamp(timestamp) - .serialize() - ); - const events = successfulTraceEvents.concat(failedTraceEvents); + const metricsets = range + .interval('30s') + .rate(1) + .flatMap((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + .serialize() + ); + const events = successfulTraceEvents.concat(failedTraceEvents); - return [ - ...events, - ...metricsets, - ...getTransactionMetrics(events), - ...getSpanDestinationMetrics(events), - ...getBreakdownMetrics(events), - ]; + return [ + ...events, + ...metricsets, + ...getTransactionMetrics(events), + ...getSpanDestinationMetrics(events), + ...getBreakdownMetrics(events), + ]; + }); } diff --git a/packages/elastic-apm-generator/src/scripts/es.js b/packages/elastic-apm-synthtrace/src/scripts/run.js similarity index 96% rename from packages/elastic-apm-generator/src/scripts/es.js rename to packages/elastic-apm-synthtrace/src/scripts/run.js index 9f99a5d19b8f8..426b247b6b623 100644 --- a/packages/elastic-apm-generator/src/scripts/es.js +++ b/packages/elastic-apm-synthtrace/src/scripts/run.js @@ -12,4 +12,4 @@ require('@babel/register')({ presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript'], }); -require('./es.ts'); +require('./run.ts'); diff --git a/packages/elastic-apm-synthtrace/src/scripts/run.ts b/packages/elastic-apm-synthtrace/src/scripts/run.ts new file mode 100644 index 0000000000000..367cdc2b91505 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/run.ts @@ -0,0 +1,142 @@ +/* + * Copyright 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 datemath from '@elastic/datemath'; +import yargs from 'yargs/yargs'; +import { cleanWriteTargets } from './utils/clean_write_targets'; +import { intervalToMs } from './utils/interval_to_ms'; +import { getCommonResources } from './utils/get_common_resources'; +import { startHistoricalDataUpload } from './utils/start_historical_data_upload'; +import { startLiveDataUpload } from './utils/start_live_data_upload'; + +yargs(process.argv.slice(2)) + .command( + '*', + 'Generate data and index into Elasticsearch', + (y) => { + return y + .positional('file', { + describe: 'File that contains the trace scenario', + demandOption: true, + string: true, + }) + .option('target', { + describe: 'Elasticsearch target, including username/password', + demandOption: true, + string: true, + }) + .option('from', { + description: 'The start of the time window', + }) + .option('to', { + description: 'The end of the time window', + }) + .option('live', { + description: 'Generate and index data continuously', + boolean: true, + }) + .option('clean', { + describe: 'Clean APM indices before indexing new data', + default: false, + boolean: true, + }) + .option('workers', { + describe: 'Amount of Node.js worker threads', + default: 5, + }) + .option('bucketSize', { + describe: 'Size of bucket for which to generate data', + default: '15m', + }) + .option('interval', { + describe: 'The interval at which to index data', + default: '10s', + }) + .option('clientWorkers', { + describe: 'Number of concurrently connected ES clients', + default: 5, + }) + .option('batchSize', { + describe: 'Number of documents per bulk index request', + default: 1000, + }) + .option('logLevel', { + describe: 'Log level', + default: 'info', + }) + .conflicts('to', 'live'); + }, + async (argv) => { + const file = String(argv.file || argv._[0]); + + const { target, workers, clean, clientWorkers, batchSize } = argv; + + const { scenario, intervalInMs, bucketSizeInMs, logger, writeTargets, client, logLevel } = + await getCommonResources({ + ...argv, + file, + }); + + if (clean) { + await cleanWriteTargets({ writeTargets, client, logger }); + } + + const to = datemath.parse(String(argv.to ?? 'now'))!.valueOf(); + const from = argv.from + ? datemath.parse(String(argv.from))!.valueOf() + : to - intervalToMs('15m'); + + const live = argv.live; + + logger.info( + `Starting data generation\n: ${JSON.stringify( + { + intervalInMs, + bucketSizeInMs, + workers, + target, + writeTargets, + from: new Date(from).toISOString(), + to: new Date(to).toISOString(), + live, + }, + null, + 2 + )}` + ); + + startHistoricalDataUpload({ + from, + to, + file, + bucketSizeInMs, + client, + workers, + clientWorkers, + batchSize, + writeTargets, + logger, + logLevel, + target, + }); + + if (live) { + startLiveDataUpload({ + bucketSizeInMs, + client, + intervalInMs, + logger, + scenario, + start: to, + clientWorkers, + batchSize, + writeTargets, + }); + } + } + ) + .parse(); diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/clean_write_targets.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/clean_write_targets.ts new file mode 100644 index 0000000000000..efa24f164d51e --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/clean_write_targets.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Client } from '@elastic/elasticsearch'; +import { ElasticsearchOutputWriteTargets } from '../../lib/output/to_elasticsearch_output'; +import { Logger } from './logger'; + +export async function cleanWriteTargets({ + writeTargets, + client, + logger, +}: { + writeTargets: ElasticsearchOutputWriteTargets; + client: Client; + logger: Logger; +}) { + const targets = Object.values(writeTargets); + + logger.info(`Cleaning indices: ${targets.join(', ')}`); + + const response = await client.deleteByQuery({ + index: targets, + allow_no_indices: true, + conflicts: 'proceed', + body: { + query: { + match_all: {}, + }, + }, + wait_for_completion: false, + }); + + const task = response.body.task; + + if (task) { + await new Promise((resolve, reject) => { + const pollForTaskCompletion = async () => { + const taskResponse = await client.tasks.get({ + task_id: String(task), + }); + + logger.debug( + `Polled for task:\n${JSON.stringify(taskResponse.body, ['completed', 'error'], 2)}` + ); + + if (taskResponse.body.completed) { + resolve(); + } else if (taskResponse.body.error) { + reject(taskResponse.body.error); + } else { + setTimeout(pollForTaskCompletion, 2500); + } + }; + + pollForTaskCompletion(); + }); + } +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/get_common_resources.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/get_common_resources.ts new file mode 100644 index 0000000000000..3b51ac6c0c0a7 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/get_common_resources.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Client } from '@elastic/elasticsearch'; +import { getScenario } from './get_scenario'; +import { getWriteTargets } from './get_write_targets'; +import { intervalToMs } from './interval_to_ms'; +import { createLogger, LogLevel } from './logger'; + +export async function getCommonResources({ + file, + interval, + bucketSize, + target, + logLevel, +}: { + file: string; + interval: string; + bucketSize: string; + target: string; + logLevel: string; +}) { + let parsedLogLevel = LogLevel.info; + switch (logLevel) { + case 'trace': + parsedLogLevel = LogLevel.trace; + break; + + case 'info': + parsedLogLevel = LogLevel.info; + break; + + case 'debug': + parsedLogLevel = LogLevel.debug; + break; + + case 'error': + parsedLogLevel = LogLevel.error; + break; + } + + const logger = createLogger(parsedLogLevel); + + const intervalInMs = intervalToMs(interval); + if (!intervalInMs) { + throw new Error('Invalid interval'); + } + + const bucketSizeInMs = intervalToMs(bucketSize); + + if (!bucketSizeInMs) { + throw new Error('Invalid bucket size'); + } + + const client = new Client({ + node: target, + }); + + const [scenario, writeTargets] = await Promise.all([ + getScenario({ file, logger }), + getWriteTargets({ client }), + ]); + + return { + scenario, + writeTargets, + logger, + client, + intervalInMs, + bucketSizeInMs, + logLevel: parsedLogLevel, + }; +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/get_scenario.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/get_scenario.ts new file mode 100644 index 0000000000000..887969e8459cc --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/get_scenario.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import Path from 'path'; +import { Fields } from '../../lib/entity'; +import { Logger } from './logger'; + +export type Scenario = (options: { from: number; to: number }) => Fields[]; + +export function getScenario({ file, logger }: { file: unknown; logger: Logger }) { + const location = Path.join(process.cwd(), String(file)); + + logger.debug(`Loading scenario from ${location}`); + + return import(location).then((m) => { + if (m && m.default) { + return m.default; + } + throw new Error(`Could not find scenario at ${location}`); + }) as Promise; +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/get_write_targets.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/get_write_targets.ts new file mode 100644 index 0000000000000..7cbba4e735750 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/get_write_targets.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Client } from '@elastic/elasticsearch'; +import { ElasticsearchOutputWriteTargets } from '../../lib/output/to_elasticsearch_output'; + +export async function getWriteTargets({ + client, +}: { + client: Client; +}): Promise { + const [indicesResponse, datastreamsResponse] = await Promise.all([ + client.indices.getAlias({ + index: 'apm-*', + }), + client.indices.getDataStream({ + name: '*apm', + }), + ]); + + function getDataStreamName(filter: string) { + return datastreamsResponse.body.data_streams.find((stream) => stream.name.includes(filter)) + ?.name; + } + + function getAlias(filter: string) { + return Object.keys(indicesResponse.body) + .map((key) => { + return { + key, + writeIndexAlias: Object.entries(indicesResponse.body[key].aliases).find( + ([_, alias]) => alias.is_write_index + )?.[0], + }; + }) + .find(({ key, writeIndexAlias }) => writeIndexAlias && key.includes(filter)) + ?.writeIndexAlias!; + } + + const targets = { + transaction: getDataStreamName('traces-apm') || getAlias('-transaction'), + span: getDataStreamName('traces-apm') || getAlias('-span'), + metric: getDataStreamName('metrics-apm') || getAlias('-metric'), + error: getDataStreamName('logs-apm') || getAlias('-error'), + }; + + if (!targets.transaction || !targets.span || !targets.metric || !targets.error) { + throw new Error('Write targets could not be determined'); + } + + return targets; +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/interval_to_ms.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/interval_to_ms.ts new file mode 100644 index 0000000000000..4cba832be3161 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/interval_to_ms.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. + */ + +export function intervalToMs(interval: unknown) { + const [, valueAsString, unit] = String(interval).split(/(.*)(s|m|h|d|w)/); + + const value = Number(valueAsString); + + switch (unit) { + case 's': + return value * 1000; + case 'm': + return value * 1000 * 60; + + case 'h': + return value * 1000 * 60 * 60; + + case 'd': + return value * 1000 * 60 * 60 * 24; + + case 'w': + return value * 1000 * 60 * 60 * 24 * 7; + } + + throw new Error('Could not parse interval'); +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/logger.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/logger.ts new file mode 100644 index 0000000000000..4afdda74105cf --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/logger.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { isPromise } from 'util/types'; + +export enum LogLevel { + trace = 0, + debug = 1, + info = 2, + error = 3, +} + +function getTimeString() { + return `[${new Date().toLocaleTimeString()}]`; +} + +export function createLogger(logLevel: LogLevel) { + function logPerf(name: string, start: bigint) { + // eslint-disable-next-line no-console + console.debug( + getTimeString(), + `${name}: ${Number(process.hrtime.bigint() - start) / 1000000}ms` + ); + } + return { + perf: (name: string, cb: () => T): T => { + if (logLevel <= LogLevel.trace) { + const start = process.hrtime.bigint(); + const val = cb(); + if (isPromise(val)) { + val.then(() => { + logPerf(name, start); + }); + } else { + logPerf(name, start); + } + return val; + } + return cb(); + }, + debug: (...args: any[]) => { + if (logLevel <= LogLevel.debug) { + // eslint-disable-next-line no-console + console.debug(getTimeString(), ...args); + } + }, + info: (...args: any[]) => { + if (logLevel <= LogLevel.info) { + // eslint-disable-next-line no-console + console.log(getTimeString(), ...args); + } + }, + error: (...args: any[]) => { + if (logLevel <= LogLevel.error) { + // eslint-disable-next-line no-console + console.log(getTimeString(), ...args); + } + }, + }; +} + +export type Logger = ReturnType; diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/start_historical_data_upload.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/start_historical_data_upload.ts new file mode 100644 index 0000000000000..e940896fb3687 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/start_historical_data_upload.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Client } from '@elastic/elasticsearch'; +import pLimit from 'p-limit'; +import Path from 'path'; +import { Worker } from 'worker_threads'; +import { ElasticsearchOutputWriteTargets } from '../../lib/output/to_elasticsearch_output'; +import { Logger, LogLevel } from './logger'; + +export async function startHistoricalDataUpload({ + from, + to, + bucketSizeInMs, + workers, + clientWorkers, + batchSize, + writeTargets, + logLevel, + logger, + target, + file, +}: { + from: number; + to: number; + bucketSizeInMs: number; + client: Client; + workers: number; + clientWorkers: number; + batchSize: number; + writeTargets: ElasticsearchOutputWriteTargets; + logger: Logger; + logLevel: LogLevel; + target: string; + file: string; +}) { + let requestedUntil: number = from; + + function processNextBatch() { + const bucketFrom = requestedUntil; + const bucketTo = Math.min(to, bucketFrom + bucketSizeInMs); + + if (bucketFrom === bucketTo) { + return; + } + + requestedUntil = bucketTo; + + logger.info( + `Starting worker for ${new Date(bucketFrom).toISOString()} to ${new Date( + bucketTo + ).toISOString()}` + ); + + const worker = new Worker(Path.join(__dirname, './upload_next_batch.js'), { + workerData: { + bucketFrom, + bucketTo, + logLevel, + writeTargets, + target, + file, + clientWorkers, + batchSize, + }, + }); + + logger.perf('created_worker', () => { + return new Promise((resolve, reject) => { + worker.on('online', () => { + resolve(); + }); + }); + }); + + logger.perf('completed_worker', () => { + return new Promise((resolve, reject) => { + worker.on('exit', () => { + resolve(); + }); + }); + }); + + return new Promise((resolve, reject) => { + worker.on('error', (err) => { + reject(err); + }); + + worker.on('exit', (code) => { + if (code !== 0) { + reject(new Error(`Worker stopped: exit code ${code}`)); + return; + } + logger.debug('Worker completed'); + resolve(); + }); + }); + } + + const numBatches = Math.ceil((to - from) / bucketSizeInMs); + + const limiter = pLimit(workers); + + return Promise.all(new Array(numBatches).fill(undefined).map((_) => limiter(processNextBatch))); +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/start_live_data_upload.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/start_live_data_upload.ts new file mode 100644 index 0000000000000..0032df1d700e9 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/start_live_data_upload.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Client } from '@elastic/elasticsearch'; +import { partition } from 'lodash'; +import { Fields } from '../../lib/entity'; +import { ElasticsearchOutputWriteTargets } from '../../lib/output/to_elasticsearch_output'; +import { Scenario } from './get_scenario'; +import { Logger } from './logger'; +import { uploadEvents } from './upload_events'; + +export function startLiveDataUpload({ + start, + bucketSizeInMs, + intervalInMs, + clientWorkers, + batchSize, + writeTargets, + scenario, + client, + logger, +}: { + start: number; + bucketSizeInMs: number; + intervalInMs: number; + clientWorkers: number; + batchSize: number; + writeTargets: ElasticsearchOutputWriteTargets; + scenario: Scenario; + client: Client; + logger: Logger; +}) { + let queuedEvents: Fields[] = []; + let requestedUntil: number = start; + + function uploadNextBatch() { + const end = new Date().getTime(); + if (end > requestedUntil) { + const bucketFrom = requestedUntil; + const bucketTo = requestedUntil + bucketSizeInMs; + const nextEvents = scenario({ from: bucketFrom, to: bucketTo }); + logger.debug( + `Requesting ${new Date(bucketFrom).toISOString()} to ${new Date( + bucketTo + ).toISOString()}, events: ${nextEvents.length}` + ); + queuedEvents.push(...nextEvents); + requestedUntil = bucketTo; + } + + const [eventsToUpload, eventsToRemainInQueue] = partition( + queuedEvents, + (event) => event['@timestamp']! <= end + ); + + logger.info(`Uploading until ${new Date(end).toISOString()}, events: ${eventsToUpload.length}`); + + queuedEvents = eventsToRemainInQueue; + + uploadEvents({ + events: eventsToUpload, + client, + clientWorkers, + batchSize, + writeTargets, + logger, + }); + } + + setInterval(uploadNextBatch, intervalInMs); + + uploadNextBatch(); +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/upload_events.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/upload_events.ts new file mode 100644 index 0000000000000..ada9f73b09e39 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/upload_events.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Client } from '@elastic/elasticsearch'; +import { chunk } from 'lodash'; +import pLimit from 'p-limit'; +import { inspect } from 'util'; +import { Fields } from '../../lib/entity'; +import { + ElasticsearchOutputWriteTargets, + toElasticsearchOutput, +} from '../../lib/output/to_elasticsearch_output'; +import { Logger } from './logger'; + +export function uploadEvents({ + events, + client, + clientWorkers, + batchSize, + writeTargets, + logger, +}: { + events: Fields[]; + client: Client; + clientWorkers: number; + batchSize: number; + writeTargets: ElasticsearchOutputWriteTargets; + logger: Logger; +}) { + const esDocuments = logger.perf('to_elasticsearch_output', () => { + return toElasticsearchOutput({ events, writeTargets }); + }); + const fn = pLimit(clientWorkers); + + const batches = chunk(esDocuments, batchSize); + + logger.debug(`Uploading ${esDocuments.length} in ${batches.length} batches`); + + const time = new Date().getTime(); + + return Promise.all( + batches.map((batch) => + fn(() => { + return logger.perf('bulk_upload', () => + client.bulk({ + require_alias: true, + refresh: false, + body: batch.flatMap((doc) => { + return [{ index: { _index: doc._index } }, doc._source]; + }), + }) + ); + }) + ) + ) + .then((results) => { + const errors = results + .flatMap((result) => result.body.items) + .filter((item) => !!item.index?.error) + .map((item) => item.index?.error); + + if (errors.length) { + logger.error(inspect(errors.slice(0, 10), { depth: null })); + throw new Error('Failed to upload some items'); + } + + logger.debug(`Uploaded ${events.length} in ${new Date().getTime() - time}ms`); + }) + .catch((err) => { + // eslint-disable-next-line no-console + console.error(err); + process.exit(1); + }); +} diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/upload_next_batch.js b/packages/elastic-apm-synthtrace/src/scripts/utils/upload_next_batch.js new file mode 100644 index 0000000000000..86c7b67c24ff7 --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/upload_next_batch.js @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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. + */ + +/* eslint-disable @typescript-eslint/no-var-requires*/ +require('@babel/register')({ + extensions: ['.ts', '.js'], + presets: [['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript'], +}); + +require('./upload_next_batch.ts'); diff --git a/packages/elastic-apm-synthtrace/src/scripts/utils/upload_next_batch.ts b/packages/elastic-apm-synthtrace/src/scripts/utils/upload_next_batch.ts new file mode 100644 index 0000000000000..1e0280382e4db --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/scripts/utils/upload_next_batch.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 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. + */ + +// add this to workerExample.js file. +import { Client } from '@elastic/elasticsearch'; +import { workerData } from 'worker_threads'; +import { ElasticsearchOutputWriteTargets } from '../../lib/output/to_elasticsearch_output'; +import { getScenario } from './get_scenario'; +import { createLogger, LogLevel } from './logger'; +import { uploadEvents } from './upload_events'; + +const { bucketFrom, bucketTo, file, logLevel, target, writeTargets, clientWorkers, batchSize } = + workerData as { + bucketFrom: number; + bucketTo: number; + file: string; + logLevel: LogLevel; + target: string; + writeTargets: ElasticsearchOutputWriteTargets; + clientWorkers: number; + batchSize: number; + }; + +async function uploadNextBatch() { + if (bucketFrom === bucketTo) { + return; + } + + const logger = createLogger(logLevel); + const client = new Client({ + node: target, + }); + + const scenario = await logger.perf('get_scenario', () => getScenario({ file, logger })); + + const events = logger.perf('execute_scenario', () => + scenario({ from: bucketFrom, to: bucketTo }) + ); + + return uploadEvents({ + events, + client, + clientWorkers, + batchSize, + writeTargets, + logger, + }); +} + +uploadNextBatch() + .then(() => { + process.exit(0); + }) + .catch(() => { + process.exit(1); + }); diff --git a/packages/elastic-apm-generator/src/test/scenarios/01_simple_trace.test.ts b/packages/elastic-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts similarity index 90% rename from packages/elastic-apm-generator/src/test/scenarios/01_simple_trace.test.ts rename to packages/elastic-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts index 733093ce0a71c..fc20202e210ff 100644 --- a/packages/elastic-apm-generator/src/test/scenarios/01_simple_trace.test.ts +++ b/packages/elastic-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts @@ -18,7 +18,7 @@ describe('simple trace', () => { const range = timerange( new Date('2021-01-01T00:00:00.000Z').getTime(), - new Date('2021-01-01T00:15:00.000Z').getTime() - 1 + new Date('2021-01-01T00:15:00.000Z').getTime() ); events = range @@ -75,9 +75,9 @@ describe('simple trace', () => { 'service.environment': 'production', 'service.name': 'opbeans-java', 'service.node.name': 'instance-1', - 'trace.id': 'f6eb2f1cbba2597e89d2a63771c4344d', + 'trace.id': '00000000000000000000000000000241', 'transaction.duration.us': 1000000, - 'transaction.id': 'e9ece67cbacb52bf', + 'transaction.id': '0000000000000240', 'transaction.name': 'GET /api/product/list', 'transaction.type': 'request', 'transaction.sampled': true, @@ -92,19 +92,19 @@ describe('simple trace', () => { 'agent.name': 'java', 'container.id': 'instance-1', 'event.outcome': 'success', - 'parent.id': 'e7433020f2745625', + 'parent.id': '0000000000000300', 'processor.event': 'span', 'processor.name': 'transaction', 'service.environment': 'production', 'service.name': 'opbeans-java', 'service.node.name': 'instance-1', 'span.duration.us': 900000, - 'span.id': '21a776b44b9853dd', + 'span.id': '0000000000000302', 'span.name': 'GET apm-*/_search', 'span.subtype': 'elasticsearch', 'span.type': 'db', - 'trace.id': '048a0647263853abb94649ec0b92bdb4', - 'transaction.id': 'e7433020f2745625', + 'trace.id': '00000000000000000000000000000301', + 'transaction.id': '0000000000000300', }); }); }); diff --git a/packages/elastic-apm-generator/src/test/scenarios/02_transaction_metrics.test.ts b/packages/elastic-apm-synthtrace/src/test/scenarios/02_transaction_metrics.test.ts similarity index 98% rename from packages/elastic-apm-generator/src/test/scenarios/02_transaction_metrics.test.ts rename to packages/elastic-apm-synthtrace/src/test/scenarios/02_transaction_metrics.test.ts index 0b9f192d3d27d..58b28f71b9afc 100644 --- a/packages/elastic-apm-generator/src/test/scenarios/02_transaction_metrics.test.ts +++ b/packages/elastic-apm-synthtrace/src/test/scenarios/02_transaction_metrics.test.ts @@ -19,7 +19,7 @@ describe('transaction metrics', () => { const range = timerange( new Date('2021-01-01T00:00:00.000Z').getTime(), - new Date('2021-01-01T00:15:00.000Z').getTime() - 1 + new Date('2021-01-01T00:15:00.000Z').getTime() ); events = getTransactionMetrics( diff --git a/packages/elastic-apm-generator/src/test/scenarios/03_span_destination_metrics.test.ts b/packages/elastic-apm-synthtrace/src/test/scenarios/03_span_destination_metrics.test.ts similarity index 98% rename from packages/elastic-apm-generator/src/test/scenarios/03_span_destination_metrics.test.ts rename to packages/elastic-apm-synthtrace/src/test/scenarios/03_span_destination_metrics.test.ts index 158ccc5b5e714..0bf59f044bf03 100644 --- a/packages/elastic-apm-generator/src/test/scenarios/03_span_destination_metrics.test.ts +++ b/packages/elastic-apm-synthtrace/src/test/scenarios/03_span_destination_metrics.test.ts @@ -19,7 +19,7 @@ describe('span destination metrics', () => { const range = timerange( new Date('2021-01-01T00:00:00.000Z').getTime(), - new Date('2021-01-01T00:15:00.000Z').getTime() - 1 + new Date('2021-01-01T00:15:00.000Z').getTime() ); events = getSpanDestinationMetrics( diff --git a/packages/elastic-apm-generator/src/test/scenarios/04_breakdown_metrics.test.ts b/packages/elastic-apm-synthtrace/src/test/scenarios/04_breakdown_metrics.test.ts similarity index 99% rename from packages/elastic-apm-generator/src/test/scenarios/04_breakdown_metrics.test.ts rename to packages/elastic-apm-synthtrace/src/test/scenarios/04_breakdown_metrics.test.ts index aeb944f35faf6..469f56b99c5f2 100644 --- a/packages/elastic-apm-generator/src/test/scenarios/04_breakdown_metrics.test.ts +++ b/packages/elastic-apm-synthtrace/src/test/scenarios/04_breakdown_metrics.test.ts @@ -26,7 +26,7 @@ describe('breakdown metrics', () => { const start = new Date('2021-01-01T00:00:00.000Z').getTime(); - const range = timerange(start, start + INTERVALS * 30 * 1000 - 1); + const range = timerange(start, start + INTERVALS * 30 * 1000); events = getBreakdownMetrics([ ...range diff --git a/packages/elastic-apm-generator/src/test/scenarios/05_transactions_with_errors.test.ts b/packages/elastic-apm-synthtrace/src/test/scenarios/05_transactions_with_errors.test.ts similarity index 98% rename from packages/elastic-apm-generator/src/test/scenarios/05_transactions_with_errors.test.ts rename to packages/elastic-apm-synthtrace/src/test/scenarios/05_transactions_with_errors.test.ts index 289fdfa6cf565..63fdb691e8e5c 100644 --- a/packages/elastic-apm-generator/src/test/scenarios/05_transactions_with_errors.test.ts +++ b/packages/elastic-apm-synthtrace/src/test/scenarios/05_transactions_with_errors.test.ts @@ -61,6 +61,6 @@ describe('transactions with errors', () => { .serialize(); expect(error['error.grouping_name']).toEqual('test error'); - expect(error['error.grouping_key']).toMatchInlineSnapshot(`"8b96fa10a7f85a5d960198627bf50840"`); + expect(error['error.grouping_key']).toMatchInlineSnapshot(`"0000000000000000000000test error"`); }); }); diff --git a/packages/elastic-apm-generator/src/test/scenarios/06_application_metrics.test.ts b/packages/elastic-apm-synthtrace/src/test/scenarios/06_application_metrics.test.ts similarity index 100% rename from packages/elastic-apm-generator/src/test/scenarios/06_application_metrics.test.ts rename to packages/elastic-apm-synthtrace/src/test/scenarios/06_application_metrics.test.ts diff --git a/packages/elastic-apm-generator/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap b/packages/elastic-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap similarity index 78% rename from packages/elastic-apm-generator/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap rename to packages/elastic-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap index 00a55cb87b125..76a76d41ec81d 100644 --- a/packages/elastic-apm-generator/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap +++ b/packages/elastic-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap @@ -12,9 +12,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "b1c6c04a9ac15b138f716d383cc85e6b", + "trace.id": "00000000000000000000000000000001", "transaction.duration.us": 1000000, - "transaction.id": "36c16f18e75058f8", + "transaction.id": "0000000000000000", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -24,19 +24,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "36c16f18e75058f8", + "parent.id": "0000000000000000", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "fe778a305e6d57dd", + "span.id": "0000000000000002", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "b1c6c04a9ac15b138f716d383cc85e6b", - "transaction.id": "36c16f18e75058f8", + "trace.id": "00000000000000000000000000000001", + "transaction.id": "0000000000000000", }, Object { "@timestamp": 1609459260000, @@ -48,9 +48,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "53c6c37bd4c85f4fbc880cd80704a9cd", + "trace.id": "00000000000000000000000000000005", "transaction.duration.us": 1000000, - "transaction.id": "65ce74106eb050be", + "transaction.id": "0000000000000004", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -60,19 +60,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "65ce74106eb050be", + "parent.id": "0000000000000004", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "ad8c5e249a8658ec", + "span.id": "0000000000000006", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "53c6c37bd4c85f4fbc880cd80704a9cd", - "transaction.id": "65ce74106eb050be", + "trace.id": "00000000000000000000000000000005", + "transaction.id": "0000000000000004", }, Object { "@timestamp": 1609459320000, @@ -84,9 +84,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "5eebf2e8d8cc5f85be8c573a1b501c7d", + "trace.id": "00000000000000000000000000000009", "transaction.duration.us": 1000000, - "transaction.id": "91fa709d90625fff", + "transaction.id": "0000000000000008", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -96,19 +96,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "91fa709d90625fff", + "parent.id": "0000000000000008", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "228b569c530c52ac", + "span.id": "0000000000000010", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "5eebf2e8d8cc5f85be8c573a1b501c7d", - "transaction.id": "91fa709d90625fff", + "trace.id": "00000000000000000000000000000009", + "transaction.id": "0000000000000008", }, Object { "@timestamp": 1609459380000, @@ -120,9 +120,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "6e8da4beb752589a86d53287c9d902de", + "trace.id": "00000000000000000000000000000013", "transaction.duration.us": 1000000, - "transaction.id": "6c500d1d19835e68", + "transaction.id": "0000000000000012", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -132,19 +132,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "6c500d1d19835e68", + "parent.id": "0000000000000012", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "5eb13f140bde5334", + "span.id": "0000000000000014", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "6e8da4beb752589a86d53287c9d902de", - "transaction.id": "6c500d1d19835e68", + "trace.id": "00000000000000000000000000000013", + "transaction.id": "0000000000000012", }, Object { "@timestamp": 1609459440000, @@ -156,9 +156,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "0aaa92bd91df543c8fd10b662051d9e8", + "trace.id": "00000000000000000000000000000017", "transaction.duration.us": 1000000, - "transaction.id": "1b3246cc83595869", + "transaction.id": "0000000000000016", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -168,19 +168,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "1b3246cc83595869", + "parent.id": "0000000000000016", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "582221c79fd75a76", + "span.id": "0000000000000018", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "0aaa92bd91df543c8fd10b662051d9e8", - "transaction.id": "1b3246cc83595869", + "trace.id": "00000000000000000000000000000017", + "transaction.id": "0000000000000016", }, Object { "@timestamp": 1609459500000, @@ -192,9 +192,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "26be5f0e2c16576ebf5f39c505eb1ff2", + "trace.id": "00000000000000000000000000000021", "transaction.duration.us": 1000000, - "transaction.id": "12b49e3c83fe58d5", + "transaction.id": "0000000000000020", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -204,19 +204,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "12b49e3c83fe58d5", + "parent.id": "0000000000000020", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "526d186996835c09", + "span.id": "0000000000000022", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "26be5f0e2c16576ebf5f39c505eb1ff2", - "transaction.id": "12b49e3c83fe58d5", + "trace.id": "00000000000000000000000000000021", + "transaction.id": "0000000000000020", }, Object { "@timestamp": 1609459560000, @@ -228,9 +228,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "c17c414c0b51564ca30e2ad839393180", + "trace.id": "00000000000000000000000000000025", "transaction.duration.us": 1000000, - "transaction.id": "d9272009dd4354a1", + "transaction.id": "0000000000000024", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -240,19 +240,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "d9272009dd4354a1", + "parent.id": "0000000000000024", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "7582541fcbfc5dc6", + "span.id": "0000000000000026", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "c17c414c0b51564ca30e2ad839393180", - "transaction.id": "d9272009dd4354a1", + "trace.id": "00000000000000000000000000000025", + "transaction.id": "0000000000000024", }, Object { "@timestamp": 1609459620000, @@ -264,9 +264,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "0280b1ffaae75e7ab097c0b52c3b3e6a", + "trace.id": "00000000000000000000000000000029", "transaction.duration.us": 1000000, - "transaction.id": "bc52ca08063c505b", + "transaction.id": "0000000000000028", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -276,19 +276,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "bc52ca08063c505b", + "parent.id": "0000000000000028", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "37ab978487935abb", + "span.id": "0000000000000030", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "0280b1ffaae75e7ab097c0b52c3b3e6a", - "transaction.id": "bc52ca08063c505b", + "trace.id": "00000000000000000000000000000029", + "transaction.id": "0000000000000028", }, Object { "@timestamp": 1609459680000, @@ -300,9 +300,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "6fb5191297fb59cebdb6a0196e273676", + "trace.id": "00000000000000000000000000000033", "transaction.duration.us": 1000000, - "transaction.id": "186858dd88b75d59", + "transaction.id": "0000000000000032", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -312,19 +312,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "186858dd88b75d59", + "parent.id": "0000000000000032", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "5ab56f27d0ae569b", + "span.id": "0000000000000034", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "6fb5191297fb59cebdb6a0196e273676", - "transaction.id": "186858dd88b75d59", + "trace.id": "00000000000000000000000000000033", + "transaction.id": "0000000000000032", }, Object { "@timestamp": 1609459740000, @@ -336,9 +336,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "77b5ffe303ae59b49f9b0e5d5270c16a", + "trace.id": "00000000000000000000000000000037", "transaction.duration.us": 1000000, - "transaction.id": "0d5f44d48189546c", + "transaction.id": "0000000000000036", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -348,19 +348,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "0d5f44d48189546c", + "parent.id": "0000000000000036", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "80e94b0847cd5104", + "span.id": "0000000000000038", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "77b5ffe303ae59b49f9b0e5d5270c16a", - "transaction.id": "0d5f44d48189546c", + "trace.id": "00000000000000000000000000000037", + "transaction.id": "0000000000000036", }, Object { "@timestamp": 1609459800000, @@ -372,9 +372,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "51c6b70db4dc5cf89b690de45c0c7b71", + "trace.id": "00000000000000000000000000000041", "transaction.duration.us": 1000000, - "transaction.id": "7483e0606e435c83", + "transaction.id": "0000000000000040", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -384,19 +384,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "7483e0606e435c83", + "parent.id": "0000000000000040", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "2e99d193e0f954c1", + "span.id": "0000000000000042", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "51c6b70db4dc5cf89b690de45c0c7b71", - "transaction.id": "7483e0606e435c83", + "trace.id": "00000000000000000000000000000041", + "transaction.id": "0000000000000040", }, Object { "@timestamp": 1609459860000, @@ -408,9 +408,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "5d91a6cde6015897935e413bc500f211", + "trace.id": "00000000000000000000000000000045", "transaction.duration.us": 1000000, - "transaction.id": "f142c4cbc7f3568e", + "transaction.id": "0000000000000044", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -420,19 +420,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "f142c4cbc7f3568e", + "parent.id": "0000000000000044", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "1fc52f16e2f551ea", + "span.id": "0000000000000046", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "5d91a6cde6015897935e413bc500f211", - "transaction.id": "f142c4cbc7f3568e", + "trace.id": "00000000000000000000000000000045", + "transaction.id": "0000000000000044", }, Object { "@timestamp": 1609459920000, @@ -444,9 +444,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "c097c19d884d52579bb11a601b8a98b3", + "trace.id": "00000000000000000000000000000049", "transaction.duration.us": 1000000, - "transaction.id": "2e3a47fa2d905519", + "transaction.id": "0000000000000048", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -456,19 +456,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "2e3a47fa2d905519", + "parent.id": "0000000000000048", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "7c7828c850685337", + "span.id": "0000000000000050", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "c097c19d884d52579bb11a601b8a98b3", - "transaction.id": "2e3a47fa2d905519", + "trace.id": "00000000000000000000000000000049", + "transaction.id": "0000000000000048", }, Object { "@timestamp": 1609459980000, @@ -480,9 +480,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "4591e57f4d7f5986bdd7892561224e0f", + "trace.id": "00000000000000000000000000000053", "transaction.duration.us": 1000000, - "transaction.id": "de5eaa1e47dc56b1", + "transaction.id": "0000000000000052", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -492,19 +492,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "de5eaa1e47dc56b1", + "parent.id": "0000000000000052", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "8f62257f4a41546a", + "span.id": "0000000000000054", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "4591e57f4d7f5986bdd7892561224e0f", - "transaction.id": "de5eaa1e47dc56b1", + "trace.id": "00000000000000000000000000000053", + "transaction.id": "0000000000000052", }, Object { "@timestamp": 1609460040000, @@ -516,9 +516,9 @@ Array [ "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", - "trace.id": "85ee8e618433577b9316a1e14961aa89", + "trace.id": "00000000000000000000000000000057", "transaction.duration.us": 1000000, - "transaction.id": "af7eac7ae61e576a", + "transaction.id": "0000000000000056", "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -528,19 +528,19 @@ Array [ "agent.name": "java", "container.id": "instance-1", "event.outcome": "success", - "parent.id": "af7eac7ae61e576a", + "parent.id": "0000000000000056", "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "cc88b4cd921e590e", + "span.id": "0000000000000058", "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", - "trace.id": "85ee8e618433577b9316a1e14961aa89", - "transaction.id": "af7eac7ae61e576a", + "trace.id": "00000000000000000000000000000057", + "transaction.id": "0000000000000056", }, ] `; diff --git a/packages/elastic-apm-synthtrace/src/test/to_elasticsearch_output.test.ts b/packages/elastic-apm-synthtrace/src/test/to_elasticsearch_output.test.ts new file mode 100644 index 0000000000000..02d17f6b561ae --- /dev/null +++ b/packages/elastic-apm-synthtrace/src/test/to_elasticsearch_output.test.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Fields } from '../lib/entity'; +import { toElasticsearchOutput } from '../lib/output/to_elasticsearch_output'; + +const writeTargets = { + transaction: 'apm-8.0.0-transaction', + span: 'apm-8.0.0-span', + metric: 'apm-8.0.0-metric', + error: 'apm-8.0.0-error', +}; + +describe('output to elasticsearch', () => { + let event: Fields; + + beforeEach(() => { + event = { + '@timestamp': new Date('2020-12-31T23:00:00.000Z').getTime(), + 'processor.event': 'transaction', + 'processor.name': 'transaction', + 'service.node.name': 'instance-a', + }; + }); + + it('properly formats @timestamp', () => { + const doc = toElasticsearchOutput({ events: [event], writeTargets })[0] as any; + + expect(doc._source['@timestamp']).toEqual('2020-12-31T23:00:00.000Z'); + }); + + it('formats a nested object', () => { + const doc = toElasticsearchOutput({ events: [event], writeTargets })[0] as any; + + expect(doc._source.processor).toEqual({ + event: 'transaction', + name: 'transaction', + }); + }); + + it('formats all fields consistently', () => { + const doc = toElasticsearchOutput({ events: [event], writeTargets })[0] as any; + + expect(doc._source).toMatchInlineSnapshot(` + Object { + "@timestamp": "2020-12-31T23:00:00.000Z", + "ecs": Object { + "version": "1.4", + }, + "observer": Object { + "version": "7.16.0", + "version_major": 7, + }, + "processor": Object { + "event": "transaction", + "name": "transaction", + }, + "service": Object { + "node": Object { + "name": "instance-a", + }, + }, + "timestamp": Object { + "us": 1609455600000000, + }, + } + `); + }); +}); diff --git a/packages/elastic-apm-generator/tsconfig.json b/packages/elastic-apm-synthtrace/tsconfig.json similarity index 60% rename from packages/elastic-apm-generator/tsconfig.json rename to packages/elastic-apm-synthtrace/tsconfig.json index 534e8481dce9a..6ae9c20b4387b 100644 --- a/packages/elastic-apm-generator/tsconfig.json +++ b/packages/elastic-apm-synthtrace/tsconfig.json @@ -7,13 +7,8 @@ "outDir": "target_types", "rootDir": "./src", "sourceMap": true, - "sourceRoot": "../../../../packages/elastic-apm-generator/src", - "types": [ - "node", - "jest" - ] + "sourceRoot": "../../../../packages/elastic-apm-synthtrace/src", + "types": ["node", "jest"] }, - "include": [ - "./src/**/*.ts" - ] + "include": ["./src/**/*.ts"] } diff --git a/packages/elastic-eslint-config-kibana/package.json b/packages/elastic-eslint-config-kibana/package.json index 5fb485b86fd38..a5007de28584c 100644 --- a/packages/elastic-eslint-config-kibana/package.json +++ b/packages/elastic-eslint-config-kibana/package.json @@ -14,7 +14,7 @@ "author": "Spencer Alger ", "license": "Apache-2.0", "bugs": { - "url": "https://github.com/elastic/kibana/tree/master/packages/elastic-eslint-config-kibana" + "url": "https://github.com/elastic/kibana/tree/main/packages/elastic-eslint-config-kibana" }, - "homepage": "https://github.com/elastic/kibana/tree/master/packages/elastic-eslint-config-kibana" + "homepage": "https://github.com/elastic/kibana/tree/main/packages/elastic-eslint-config-kibana" } \ No newline at end of file diff --git a/packages/elastic-safer-lodash-set/LICENSE b/packages/elastic-safer-lodash-set/LICENSE index 049225c0b6647..ca79374b42cec 100644 --- a/packages/elastic-safer-lodash-set/LICENSE +++ b/packages/elastic-safer-lodash-set/LICENSE @@ -12,7 +12,7 @@ individuals. For exact contribution history, see the revision history available at the following locations: - https://github.com/lodash/lodash - https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/lodash - - https://github.com/elastic/kibana/tree/master/packages/elastic-safer-lodash-set + - https://github.com/elastic/kibana/tree/main/packages/elastic-safer-lodash-set Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/packages/elastic-safer-lodash-set/package.json b/packages/elastic-safer-lodash-set/package.json index bb27fd336d975..72b908911000d 100644 --- a/packages/elastic-safer-lodash-set/package.json +++ b/packages/elastic-safer-lodash-set/package.json @@ -28,7 +28,7 @@ "bugs": { "url": "https://github.com/elastic/kibana/issues" }, - "homepage": "https://github.com/elastic/kibana/tree/master/packages/safer-lodash-set#readme", + "homepage": "https://github.com/elastic/kibana/tree/main/packages/safer-lodash-set#readme", "standard": { "ignore": [ "/lodash/" diff --git a/packages/kbn-babel-code-parser/package.json b/packages/kbn-babel-code-parser/package.json index a4ad8d603a0cb..7018cb3f8815f 100755 --- a/packages/kbn-babel-code-parser/package.json +++ b/packages/kbn-babel-code-parser/package.json @@ -7,6 +7,6 @@ "license": "SSPL-1.0 OR Elastic License 2.0", "repository": { "type": "git", - "url": "https://github.com/elastic/kibana/tree/master/packages/kbn-babel-code-parser" + "url": "https://github.com/elastic/kibana/tree/main/packages/kbn-babel-code-parser" } } diff --git a/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts b/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts index f5bee0ce67fe4..32cc91ad74c50 100644 --- a/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts +++ b/packages/kbn-dev-utils/src/vscode_config/managed_config_keys.ts @@ -20,21 +20,23 @@ export const MANAGED_CONFIG_KEYS: ManagedConfigKey[] = [ { key: 'files.watcherExclude', value: { - ['**/.eslintcache']: true, + ['**/.chromium']: true, ['**/.es']: true, + ['**/.eslintcache']: true, ['**/.yarn-local-mirror']: true, - ['**/.chromium']: true, - ['**/packages/kbn-pm/dist/index.js']: true, + ['**/*.log']: true, + ['**/api_docs']: true, ['**/bazel-*']: true, ['**/node_modules']: true, + ['**/packages/kbn-pm/dist/index.js']: true, ['**/target']: true, - ['**/*.log']: true, }, }, { key: 'search.exclude', value: { ['**/packages/kbn-pm/dist/index.js']: true, + ['**/api_docs']: true, }, }, { diff --git a/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts b/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts index 4ef3039253e90..e483fde4ab506 100644 --- a/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts +++ b/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts @@ -145,7 +145,7 @@ export function runBuildApiDocsCli() { ]); const getLink = (d: ApiDeclaration) => - `https://github.com/elastic/kibana/tree/master/${d.path}#:~:text=${encodeURIComponent( + `https://github.com/elastic/kibana/tree/main/${d.path}#:~:text=${encodeURIComponent( d.label )}`; diff --git a/packages/kbn-docs-utils/src/api_docs/mdx/write_deprecations_doc_by_plugin.ts b/packages/kbn-docs-utils/src/api_docs/mdx/write_deprecations_doc_by_plugin.ts index 896dd806603e3..e5a8363e57f4f 100644 --- a/packages/kbn-docs-utils/src/api_docs/mdx/write_deprecations_doc_by_plugin.ts +++ b/packages/kbn-docs-utils/src/api_docs/mdx/write_deprecations_doc_by_plugin.ts @@ -52,7 +52,7 @@ export function writeDeprecationDocByPlugin( (ref) => `[${ref.path.substr( ref.path.lastIndexOf(Path.sep) + 1 - )}](https://github.com/elastic/kibana/tree/master/${ + )}](https://github.com/elastic/kibana/tree/main/${ ref.path }#:~:text=${encodeURIComponent(api.label)})` ) diff --git a/packages/kbn-eslint-import-resolver-kibana/package.json b/packages/kbn-eslint-import-resolver-kibana/package.json index 49700c67eec55..fcb3c2ffb84f6 100755 --- a/packages/kbn-eslint-import-resolver-kibana/package.json +++ b/packages/kbn-eslint-import-resolver-kibana/package.json @@ -10,6 +10,6 @@ }, "repository": { "type": "git", - "url": "https://github.com/elastic/kibana/tree/master/packages/kbn-eslint-import-resolver-kibana" + "url": "https://github.com/elastic/kibana/tree/main/packages/kbn-eslint-import-resolver-kibana" } } \ No newline at end of file diff --git a/packages/kbn-monaco/src/xjson/grammar.test.ts b/packages/kbn-monaco/src/xjson/grammar.test.ts new file mode 100644 index 0000000000000..29d338cd71b0c --- /dev/null +++ b/packages/kbn-monaco/src/xjson/grammar.test.ts @@ -0,0 +1,189 @@ +/* + * Copyright 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 { createParser } from './grammar'; + +describe('createParser', () => { + let parser: ReturnType; + + beforeEach(() => { + parser = createParser(); + }); + + test('should create a xjson grammar parser', () => { + expect(createParser()).toBeInstanceOf(Function); + }); + + test('should return no annotations in case of valid json', () => { + expect( + parser(` + {"menu": { + "id": "file", + "value": "File", + "quotes": "'\\"", + "popup": { + "actions": [ + "new", + "open", + "close" + ], + "menuitem": [ + {"value": "New"}, + {"value": "Open"}, + {"value": "Close"} + ] + } + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [], + } + `); + }); + + test('should support triple quotes', () => { + expect( + parser(` + {"menu": { + "id": """ + file + """, + "value": "File" + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [], + } + `); + }); + + test('triple quotes should be correctly closed', () => { + expect( + parser(` + {"menu": { + "id": """" + file + "", + "value": "File" + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [ + Object { + "at": 36, + "text": "Expected ',' instead of '\\"'", + "type": "error", + }, + ], + } + `); + }); + + test('an escaped quote can be appended to the end of triple quotes', () => { + expect( + parser(` + {"menu": { + "id": """ + file + \\"""", + "value": "File" + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [], + } + `); + }); + + test('text values should be wrapper into quotes', () => { + expect( + parser(` + {"menu": { + "id": id, + "value": "File" + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [ + Object { + "at": 36, + "text": "Unexpected 'i'", + "type": "error", + }, + ], + } + `); + }); + + test('check for close quotes', () => { + expect( + parser(` + {"menu": { + "id": "id, + "value": "File" + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [ + Object { + "at": 52, + "text": "Expected ',' instead of 'v'", + "type": "error", + }, + ], + } + `); + }); + test('no duplicate keys', () => { + expect( + parser(` + {"menu": { + "id": "id", + "id": "File" + }} + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [ + Object { + "at": 53, + "text": "Duplicate key \\"id\\"", + "type": "warning", + }, + ], + } + `); + }); + + test('all curly quotes should be closed', () => { + expect( + parser(` + {"menu": { + "id": "id", + "name": "File" + } + `) + ).toMatchInlineSnapshot(` + Object { + "annotations": Array [ + Object { + "at": 82, + "text": "Expected ',' instead of ''", + "type": "error", + }, + ], + } + `); + }); +}); diff --git a/packages/kbn-monaco/src/xjson/grammar.ts b/packages/kbn-monaco/src/xjson/grammar.ts index 32c958e66d594..5d26e92f005ba 100644 --- a/packages/kbn-monaco/src/xjson/grammar.ts +++ b/packages/kbn-monaco/src/xjson/grammar.ts @@ -57,10 +57,6 @@ export const createParser = () => { text: m, }); }, - reset = function (newAt: number) { - ch = text.charAt(newAt); - at = newAt + 1; - }, next = function (c?: string) { return ( c && c !== ch && error("Expected '" + c + "' instead of '" + ch + "'"), @@ -69,15 +65,6 @@ export const createParser = () => { ch ); }, - nextUpTo = function (upTo: any, errorMessage: string) { - let currentAt = at, - i = text.indexOf(upTo, currentAt); - if (i < 0) { - error(errorMessage || "Expected '" + upTo + "'"); - } - reset(i + upTo.length); - return text.substring(currentAt, i); - }, peek = function (c: string) { return text.substr(at, c.length) === c; // nocommit - double check }, @@ -96,37 +83,50 @@ export const createParser = () => { (string += ch), next(); return (number = +string), isNaN(number) ? (error('Bad number'), void 0) : number; }, + stringLiteral = function () { + let quotes = '"""'; + let end = text.indexOf('\\"' + quotes, at + quotes.length); + + if (end >= 0) { + quotes = '\\"' + quotes; + } else { + end = text.indexOf(quotes, at + quotes.length); + } + + if (end >= 0) { + for (let l = end - at + quotes.length; l > 0; l--) { + next(); + } + } + + return next(); + }, string = function () { let hex: any, i: any, uffff: any, string = ''; + if ('"' === ch) { - if (peek('""')) { - // literal - next('"'); - next('"'); - return nextUpTo('"""', 'failed to find closing \'"""\''); - } else { - for (; next(); ) { - if ('"' === ch) return next(), string; - if ('\\' === ch) - if ((next(), 'u' === ch)) { - for ( - uffff = 0, i = 0; - 4 > i && ((hex = parseInt(next(), 16)), isFinite(hex)); - i += 1 - ) - uffff = 16 * uffff + hex; - string += String.fromCharCode(uffff); - } else { - if ('string' != typeof escapee[ch]) break; - string += escapee[ch]; - } - else string += ch; - } + for (; next(); ) { + if ('"' === ch) return next(), string; + if ('\\' === ch) + if ((next(), 'u' === ch)) { + for ( + uffff = 0, i = 0; + 4 > i && ((hex = parseInt(next(), 16)), isFinite(hex)); + i += 1 + ) + uffff = 16 * uffff + hex; + string += String.fromCharCode(uffff); + } else { + if ('string' != typeof escapee[ch]) break; + string += escapee[ch]; + } + else string += ch; } } + error('Bad string'); }, white = function () { @@ -165,9 +165,9 @@ export const createParser = () => { ((key = string()), white(), next(':'), - Object.hasOwnProperty.call(object, key) && + Object.hasOwnProperty.call(object, key!) && warning('Duplicate key "' + key + '"', latchKeyStart), - (object[key] = value()), + (object[key!] = value()), white(), '}' === ch) ) @@ -179,6 +179,9 @@ export const createParser = () => { }; return ( (value = function () { + if (peek('"""')) { + return stringLiteral(); + } switch ((white(), ch)) { case '{': return object(); diff --git a/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts b/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts index 2c8186ac7fa4f..f2ab22f8c97df 100644 --- a/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts +++ b/packages/kbn-monaco/src/xjson/lexer_rules/xjson.ts @@ -103,6 +103,7 @@ export const lexerRules: monaco.languages.IMonarchLanguage = { string_literal: [ [/"""/, { token: 'punctuation.end_triple_quote', next: '@pop' }], + [/\\""""/, { token: 'punctuation.end_triple_quote', next: '@pop' }], [/./, { token: 'multi_string' }], ], }, diff --git a/packages/kbn-optimizer/BUILD.bazel b/packages/kbn-optimizer/BUILD.bazel index d56b6c6746139..485e5f1044aa3 100644 --- a/packages/kbn-optimizer/BUILD.bazel +++ b/packages/kbn-optimizer/BUILD.bazel @@ -32,6 +32,7 @@ NPM_MODULE_EXTRA_FILES = [ RUNTIME_DEPS = [ "//packages/kbn-config", + "//packages/kbn-config-schema", "//packages/kbn-dev-utils", "//packages/kbn-std", "//packages/kbn-ui-shared-deps-npm", @@ -62,6 +63,7 @@ RUNTIME_DEPS = [ TYPES_DEPS = [ "//packages/kbn-config", + "//packages/kbn-config-schema", "//packages/kbn-dev-utils", "//packages/kbn-std", "//packages/kbn-ui-shared-deps-npm", diff --git a/packages/kbn-optimizer/src/babel_runtime_helpers/find_babel_runtime_helpers_in_entry_bundles.ts b/packages/kbn-optimizer/src/babel_runtime_helpers/find_babel_runtime_helpers_in_entry_bundles.ts new file mode 100644 index 0000000000000..beff36023343d --- /dev/null +++ b/packages/kbn-optimizer/src/babel_runtime_helpers/find_babel_runtime_helpers_in_entry_bundles.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 Path from 'path'; + +import { run, REPO_ROOT } from '@kbn/dev-utils'; + +import { OptimizerConfig } from '../optimizer'; +import { parseStats, inAnyEntryChunk } from './parse_stats'; + +export async function runFindBabelHelpersInEntryBundlesCli() { + run(async ({ log }) => { + const config = OptimizerConfig.create({ + includeCoreBundle: true, + repoRoot: REPO_ROOT, + }); + + const paths = config.bundles.map((b) => Path.resolve(b.outputDir, 'stats.json')); + + log.info('analyzing', paths.length, 'stats files'); + log.verbose(paths); + + const imports = new Set(); + for (const path of paths) { + const stats = parseStats(path); + + for (const module of stats.modules) { + if (!inAnyEntryChunk(stats, module)) { + continue; + } + + for (const { userRequest } of module.reasons) { + if (userRequest.startsWith('@babel/runtime/')) { + imports.add(userRequest); + } + } + } + } + + log.success('found', imports.size, '@babel/register imports in entry bundles'); + log.write( + Array.from(imports, (i) => `'${i}',`) + .sort() + .join('\n') + ); + }); +} diff --git a/packages/kbn-optimizer/src/babel_runtime_helpers/index.ts b/packages/kbn-optimizer/src/babel_runtime_helpers/index.ts new file mode 100644 index 0000000000000..58a3ddf263a1d --- /dev/null +++ b/packages/kbn-optimizer/src/babel_runtime_helpers/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 './find_babel_runtime_helpers_in_entry_bundles'; diff --git a/packages/kbn-optimizer/src/babel_runtime_helpers/parse_stats.ts b/packages/kbn-optimizer/src/babel_runtime_helpers/parse_stats.ts new file mode 100644 index 0000000000000..fac0b099b5195 --- /dev/null +++ b/packages/kbn-optimizer/src/babel_runtime_helpers/parse_stats.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 dedent from 'dedent'; +import { schema, Props, TypeOf } from '@kbn/config-schema'; + +const partialObject =

(props: P) => { + return schema.object(props, { + unknowns: 'ignore', + }); +}; + +export type Module = TypeOf; +const moduleSchema = partialObject({ + identifier: schema.string(), + chunks: schema.arrayOf(schema.oneOf([schema.string(), schema.number()])), + reasons: schema.arrayOf( + partialObject({ + userRequest: schema.string(), + }) + ), +}); + +export type Chunk = TypeOf; +const chunkSchema = partialObject({ + id: schema.oneOf([schema.string(), schema.number()]), + entry: schema.boolean(), + initial: schema.boolean(), +}); + +const statsSchema = partialObject({ + chunks: schema.arrayOf(chunkSchema), + modules: schema.arrayOf(moduleSchema), +}); + +export interface Stats { + path: string; + modules: Module[]; + chunks: Chunk[]; +} +export function parseStats(path: string): Stats { + try { + return { + path, + ...statsSchema.validate(JSON.parse(Fs.readFileSync(path, 'utf-8'))), + }; + } catch (error) { + if (error.code === 'ENOENT') { + throw new Error(dedent` + unable to find stats file at [${path}]. Make sure you run the following + before running this script: + + node scripts/build_kibana_platform_plugins --dist --profile + `); + } + + throw error; + } +} + +export function inAnyEntryChunk(stats: Stats, module: Module): boolean { + return module.chunks.some((id) => { + const chunk = stats.chunks.find((c) => c.id === id); + if (!chunk) { + throw new Error( + `unable to find chunk ${id} for module ${module.identifier} in ${stats.path}` + ); + } + + return chunk.entry || chunk.initial; + }); +} diff --git a/packages/kbn-optimizer/src/index.ts b/packages/kbn-optimizer/src/index.ts index d5e810d584d29..d759a4aa02455 100644 --- a/packages/kbn-optimizer/src/index.ts +++ b/packages/kbn-optimizer/src/index.ts @@ -14,3 +14,4 @@ export * from './node'; export * from './limits'; export * from './cli'; export * from './report_optimizer_timings'; +export * from './babel_runtime_helpers'; diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index f7bf17f87cb78..722fb05de77f8 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -71,6 +71,10 @@ export function getWebpackConfig(bundle: Bundle, bundleRefs: BundleRefs, worker: new BundleRefsPlugin(bundle, bundleRefs), new PopulateBundleCachePlugin(worker, bundle), new BundleMetricsPlugin(bundle), + new webpack.DllReferencePlugin({ + context: worker.repoRoot, + manifest: require(UiSharedDepsNpm.dllManifestPath), + }), ...(worker.profileWebpack ? [new EmitStatsPlugin(bundle)] : []), ...(bundle.banner ? [new webpack.BannerPlugin({ banner: bundle.banner, raw: true })] : []), ], @@ -257,10 +261,6 @@ export function getWebpackConfig(bundle: Bundle, bundleRefs: BundleRefs, worker: test: /\.(js|css)$/, cache: false, }), - new webpack.DllReferencePlugin({ - context: worker.repoRoot, - manifest: require(UiSharedDepsNpm.dllManifestPath), - }), ], optimization: { diff --git a/packages/kbn-plugin-generator/template/README.md.ejs b/packages/kbn-plugin-generator/template/README.md.ejs index 2cd19c904263e..5627b5d19c531 100755 --- a/packages/kbn-plugin-generator/template/README.md.ejs +++ b/packages/kbn-plugin-generator/template/README.md.ejs @@ -6,7 +6,7 @@ A Kibana plugin ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. <% if (thirdPartyPlugin) { %> ## Scripts diff --git a/packages/kbn-securitysolution-es-utils/src/get_bootstrap_index_exists/index.ts b/packages/kbn-securitysolution-es-utils/src/get_bootstrap_index_exists/index.ts new file mode 100644 index 0000000000000..959e38b3f7ee4 --- /dev/null +++ b/packages/kbn-securitysolution-es-utils/src/get_bootstrap_index_exists/index.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ElasticsearchClient } from '../elasticsearch_client'; + +/** + * This function is similar to getIndexExists, but is limited to searching indices that match + * the index pattern used as concrete backing indices (e.g. .siem-signals-default-000001). + * This allows us to separate the indices that are actually .siem-signals indices from + * alerts as data indices that only share the .siem-signals alias. + * + * @param esClient Elasticsearch client to use to make the request + * @param index Index alias name to check for existence + */ +export const getBootstrapIndexExists = async ( + esClient: ElasticsearchClient, + index: string +): Promise => { + try { + const { body } = await esClient.indices.getAlias({ + index: `${index}-*`, + name: index, + }); + return Object.keys(body).length > 0; + } catch (err) { + if (err.body != null && err.body.status === 404) { + return false; + } else { + throw err.body ? err.body : err; + } + } +}; diff --git a/packages/kbn-securitysolution-es-utils/src/index.ts b/packages/kbn-securitysolution-es-utils/src/index.ts index f4b081ac1b0a0..a32cf8968967c 100644 --- a/packages/kbn-securitysolution-es-utils/src/index.ts +++ b/packages/kbn-securitysolution-es-utils/src/index.ts @@ -13,6 +13,7 @@ export * from './delete_all_index'; export * from './delete_policy'; export * from './delete_template'; export * from './encode_hit_version'; +export * from './get_bootstrap_index_exists'; export * from './get_index_aliases'; export * from './get_index_count'; export * from './get_index_exists'; diff --git a/packages/kbn-spec-to-console/README.md b/packages/kbn-spec-to-console/README.md index 60d9dde807ca9..ac06336bd72ef 100644 --- a/packages/kbn-spec-to-console/README.md +++ b/packages/kbn-spec-to-console/README.md @@ -31,6 +31,6 @@ yarn spec_to_console -g "/rest-api-spec/src/main/reso * Ad hoc additions ### Updating the script -When converting query params defined in the REST API specs to console autocompletion definitions, the script relies on a set of known conversion rules specified in [lib/convert/params.js](https://github.com/elastic/kibana/blob/master/packages/kbn-spec-to-console/lib/convert/params.js). +When converting query params defined in the REST API specs to console autocompletion definitions, the script relies on a set of known conversion rules specified in [lib/convert/params.js](https://github.com/elastic/kibana/blob/main/packages/kbn-spec-to-console/lib/convert/params.js). For example, `"keep_on_completion":{"type":"boolean"}` from REST API specs is converted to `"keep_on_completion": "__flag__"` in console autocomplete definitions. -When an unknown parameter type is encountered in REST API specs, the script will throw an `Unexpected type error` and the file [lib/convert/params.js](https://github.com/elastic/kibana/blob/master/packages/kbn-spec-to-console/lib/convert/params.js) needs to be updated by adding a new conversion rule. +When an unknown parameter type is encountered in REST API specs, the script will throw an `Unexpected type error` and the file [lib/convert/params.js](https://github.com/elastic/kibana/blob/main/packages/kbn-spec-to-console/lib/convert/params.js) needs to be updated by adding a new conversion rule. diff --git a/packages/kbn-storybook/src/lib/register.ts b/packages/kbn-storybook/src/lib/register.ts index 1e49606323422..f102e43c8c042 100644 --- a/packages/kbn-storybook/src/lib/register.ts +++ b/packages/kbn-storybook/src/lib/register.ts @@ -16,7 +16,7 @@ addons.setConfig({ theme: create({ base: 'light', brandTitle: 'Kibana Storybook', - brandUrl: 'https://github.com/elastic/kibana/tree/master/packages/kbn-storybook', + brandUrl: 'https://github.com/elastic/kibana/tree/main/packages/kbn-storybook', }), showPanel: false, isFullscreen: false, diff --git a/packages/kbn-test/src/functional_tests/lib/babel_register_for_test_plugins.js b/packages/kbn-test/src/functional_tests/lib/babel_register_for_test_plugins.js index 2ded0e509c253..09ed81b62a09d 100644 --- a/packages/kbn-test/src/functional_tests/lib/babel_register_for_test_plugins.js +++ b/packages/kbn-test/src/functional_tests/lib/babel_register_for_test_plugins.js @@ -6,23 +6,30 @@ * Side Public License, v 1. */ +const Fs = require('fs'); const Path = require('path'); -const { REPO_ROOT } = require('@kbn/dev-utils'); +const { REPO_ROOT: REPO_ROOT_FOLLOWING_SYMLINKS } = require('@kbn/dev-utils'); +const BASE_REPO_ROOT = Path.resolve( + Fs.realpathSync(Path.resolve(REPO_ROOT_FOLLOWING_SYMLINKS, 'package.json')), + '..' +); + +const transpileKbnPaths = [ + 'test', + 'x-pack/test', + 'examples', + 'x-pack/examples', + // TODO: should should probably remove this link back to the source + 'x-pack/plugins/task_manager/server/config.ts', + 'src/core/utils/default_app_categories.ts', +].map((path) => Path.resolve(BASE_REPO_ROOT, path)); // modifies all future calls to require() to automatically // compile the required source with babel require('@babel/register')({ ignore: [/[\/\\](node_modules|target|dist)[\/\\]/], - only: [ - Path.resolve(REPO_ROOT, 'test'), - Path.resolve(REPO_ROOT, 'x-pack/test'), - Path.resolve(REPO_ROOT, 'examples'), - Path.resolve(REPO_ROOT, 'x-pack/examples'), - // TODO: should should probably remove this link back to the source - Path.resolve(REPO_ROOT, 'x-pack/plugins/task_manager/server/config.ts'), - Path.resolve(REPO_ROOT, 'src/core/utils/default_app_categories.ts'), - ], + only: transpileKbnPaths, babelrc: false, presets: [require.resolve('@kbn/babel-preset/node_preset')], extensions: ['.js', '.ts', '.tsx'], diff --git a/packages/kbn-ui-shared-deps-npm/webpack.config.js b/packages/kbn-ui-shared-deps-npm/webpack.config.js index 6b572dc3ea208..2cad07aa59a27 100644 --- a/packages/kbn-ui-shared-deps-npm/webpack.config.js +++ b/packages/kbn-ui-shared-deps-npm/webpack.config.js @@ -38,6 +38,31 @@ module.exports = (_, argv) => { 'whatwg-fetch', 'symbol-observable', + /** + * babel runtime helpers referenced from entry chunks + * determined by running: + * + * node scripts/build_kibana_platform_plugins --dist --profile + * node scripts/find_babel_runtime_helpers_in_use.js + */ + '@babel/runtime/helpers/assertThisInitialized', + '@babel/runtime/helpers/classCallCheck', + '@babel/runtime/helpers/classPrivateFieldGet', + '@babel/runtime/helpers/classPrivateFieldSet', + '@babel/runtime/helpers/createSuper', + '@babel/runtime/helpers/defineProperty', + '@babel/runtime/helpers/extends', + '@babel/runtime/helpers/inherits', + '@babel/runtime/helpers/interopRequireDefault', + '@babel/runtime/helpers/interopRequireWildcard', + '@babel/runtime/helpers/objectSpread2', + '@babel/runtime/helpers/objectWithoutPropertiesLoose', + '@babel/runtime/helpers/slicedToArray', + '@babel/runtime/helpers/toArray', + '@babel/runtime/helpers/toConsumableArray', + '@babel/runtime/helpers/typeof', + '@babel/runtime/helpers/wrapNativeSuper', + // modules from npm '@elastic/charts', '@elastic/eui', diff --git a/rfcs/text/0014_api_documentation.md b/rfcs/text/0014_api_documentation.md index b70636c63aad3..0f934c2f09faf 100644 --- a/rfcs/text/0014_api_documentation.md +++ b/rfcs/text/0014_api_documentation.md @@ -14,7 +14,7 @@ plugin APIs. # Technology: ts-morph vs api-extractor -[Api-extractor](https://api-extractor.com/) is a utility built from microsoft that parses typescript code into json files that can then be used in a custom [api-documenter](https://api-extractor.com/pages/setup/generating_docs/) in order to build documentation. This is what we [have now](https://github.com/elastic/kibana/tree/master/docs/development), except we use the default api-documenter. +[Api-extractor](https://api-extractor.com/) is a utility built from microsoft that parses typescript code into json files that can then be used in a custom [api-documenter](https://api-extractor.com/pages/setup/generating_docs/) in order to build documentation. This is what we [have now](https://github.com/elastic/kibana/tree/main/docs/development), except we use the default api-documenter. ## Limitations with the current implementation using api-extractor & api-documenter diff --git a/scripts/find_babel_runtime_helpers_in_use.js b/scripts/find_babel_runtime_helpers_in_use.js new file mode 100644 index 0000000000000..a229c8e11a2ca --- /dev/null +++ b/scripts/find_babel_runtime_helpers_in_use.js @@ -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. + */ + +require('../src/setup_node_env/no_transpilation'); +require('@kbn/optimizer').runFindBabelHelpersInEntryBundlesCli(); diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 185439172b831..3b9a9857c81df 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -490,7 +490,9 @@ export class DocLinksService { settingsFleetServerHostSettings: `${FLEET_DOCS}fleet-settings.html#fleet-server-hosts-setting`, troubleshooting: `${FLEET_DOCS}fleet-troubleshooting.html`, elasticAgent: `${FLEET_DOCS}elastic-agent-installation.html`, + beatsAgentComparison: `${FLEET_DOCS}beats-agent-comparison.html`, datastreams: `${FLEET_DOCS}data-streams.html`, + datastreamsILM: `${FLEET_DOCS}data-streams.html#data-streams-ilm`, datastreamsNamingScheme: `${FLEET_DOCS}data-streams.html#data-streams-naming-scheme`, installElasticAgent: `${FLEET_DOCS}install-fleet-managed-elastic-agent.html`, upgradeElasticAgent: `${FLEET_DOCS}upgrade-elastic-agent.html`, @@ -507,10 +509,10 @@ export class DocLinksService { goOverview: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/go-api/${DOC_LINK_VERSION}/overview.html`, javaIndex: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/java-api-client/${DOC_LINK_VERSION}/index.html`, jsIntro: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/javascript-api/${DOC_LINK_VERSION}/introduction.html`, - netGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/net-api/${DOC_LINK_VERSION}/index.html`, + netGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/net-api/7.x/index.html`, perlGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/perl-api/current/index.html`, - phpGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/php-api/${DOC_LINK_VERSION}/index.html`, - pythonGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/net-api/${DOC_LINK_VERSION}/index.html`, + phpGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/php-api/7.x/index.html`, + pythonGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/python-api/${DOC_LINK_VERSION}/index.html`, rubyOverview: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/ruby-api/${DOC_LINK_VERSION}/ruby_client.html`, rustGuide: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/client/rust-api/current/index.html`, }, @@ -752,6 +754,8 @@ export interface DocLinksStart { readonly snapshotRestore: Record; readonly ingest: Record; readonly fleet: Readonly<{ + datastreamsILM: string; + beatsAgentComparison: string; guide: string; fleetServer: string; fleetServerAddFleetServer: string; diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 53cfa0765f9d0..0459600ef78f5 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -706,6 +706,8 @@ export interface DocLinksStart { readonly snapshotRestore: Record; readonly ingest: Record; readonly fleet: Readonly<{ + datastreamsILM: string; + beatsAgentComparison: string; guide: string; fleetServer: string; fleetServerAddFleetServer: string; diff --git a/src/core/public/rendering/_base.scss b/src/core/public/rendering/_base.scss index 32a297a4066d9..c97afbf14a8f6 100644 --- a/src/core/public/rendering/_base.scss +++ b/src/core/public/rendering/_base.scss @@ -43,10 +43,12 @@ top: $headerHeight; } - .kbnStickyMenu { - position: sticky; - max-height: calc(100vh - #{$headerHeight + $euiSize}); - top: $headerHeight + $euiSize; + @include euiBreakpoint('xl', 'l') { + .kbnStickyMenu { + position: sticky; + max-height: calc(100vh - #{$headerHeight + $euiSize}); + top: $headerHeight + $euiSize; + } } } diff --git a/src/core/server/metrics/integration_tests/server_collector.test.ts b/src/core/server/metrics/integration_tests/server_collector.test.ts index a16e0f2217add..05780e8965dc4 100644 --- a/src/core/server/metrics/integration_tests/server_collector.test.ts +++ b/src/core/server/metrics/integration_tests/server_collector.test.ts @@ -19,7 +19,9 @@ import { setTimeout as setTimeoutPromise } from 'timers/promises'; const requestWaitDelay = 25; -describe('ServerMetricsCollector', () => { +// FLAKY: https://github.com/elastic/kibana/issues/59234 +// FLAKY: https://github.com/elastic/kibana/issues/59235 +describe.skip('ServerMetricsCollector', () => { let server: HttpService; let collector: ServerMetricsCollector; let hapiServer: HapiServer; diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts index c397559b52570..9717afd1bfe32 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts @@ -45,15 +45,6 @@ describe('KibanaMigrator', () => { beforeEach(() => { (DocumentMigrator as jest.Mock).mockClear(); }); - describe('constructor', () => { - it('coerces the current Kibana version if it has a hyphen', () => { - const options = mockOptions(); - options.kibanaVersion = '3.2.1-SNAPSHOT'; - const migrator = new KibanaMigrator(options); - expect(migrator.kibanaVersion).toEqual('3.2.1'); - expect((DocumentMigrator as jest.Mock).mock.calls[0][0].kibanaVersion).toEqual('3.2.1'); - }); - }); describe('getActiveMappings', () => { it('returns full index mappings w/ core properties', () => { const options = mockOptions(); diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts index d3755f8c7e666..8d846f74a7c17 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts @@ -89,7 +89,7 @@ export class KibanaMigrator { this.serializer = new SavedObjectsSerializer(this.typeRegistry); this.mappingProperties = mergeTypes(this.typeRegistry.getAllTypes()); this.log = logger; - this.kibanaVersion = kibanaVersion.split('-')[0]; // coerce a semver-like string (x.y.z-SNAPSHOT) or prerelease version (x.y.z-alpha) to a regular semver (x.y.z); + this.kibanaVersion = kibanaVersion; this.documentMigrator = new DocumentMigrator({ kibanaVersion: this.kibanaVersion, typeRegistry, diff --git a/src/core/server/saved_objects/migrationsv2/README.md b/src/core/server/saved_objects/migrationsv2/README.md index a6b8e01a3dc6c..60bf84eef87a6 100644 --- a/src/core/server/saved_objects/migrationsv2/README.md +++ b/src/core/server/saved_objects/migrationsv2/README.md @@ -90,7 +90,7 @@ able to successfully complete the migration once the cluster has enough heap. For more background information on the problem see the [saved object migrations -RFC](https://github.com/elastic/kibana/blob/master/rfcs/text/0013_saved_object_migrations.md). +RFC](https://github.com/elastic/kibana/blob/main/rfcs/text/0013_saved_object_migrations.md). # Algorithm steps The design goals for the algorithm was to keep downtime below 10 minutes for diff --git a/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts b/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts index 707e92366871f..5dad0f7ff567d 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts @@ -55,8 +55,7 @@ const { startES } = kbnTestServer.createTestServers({ }); let esServer: kbnTestServer.TestElasticsearchUtils; -// Failing: See https://github.com/elastic/kibana/issues/113697 -describe.skip('migration actions', () => { +describe('migration actions', () => { let client: ElasticsearchClient; beforeAll(async () => { @@ -1159,7 +1158,7 @@ describe.skip('migration actions', () => { it('resolves left wait_for_task_completion_timeout when the task does not complete within the timeout', async () => { const res = (await pickupUpdatedMappings( client, - 'existing_index_with_docs' + '.kibana_1' )()) as Either.Right; const task = waitForPickupUpdatedMappingsTask({ @@ -1540,7 +1539,8 @@ describe.skip('migration actions', () => { } `); }); - it('resolves left request_entity_too_large_exception when the payload is too large', async () => { + // TODO: unskip after https://github.com/elastic/kibana/issues/116111 + it.skip('resolves left request_entity_too_large_exception when the payload is too large', async () => { const newDocs = new Array(10000).fill({ _source: { title: diff --git a/src/core/server/saved_objects/saved_objects_service.test.mocks.ts b/src/core/server/saved_objects/saved_objects_service.test.mocks.ts index d0ac98fa5e3c7..1faebcc5fcc97 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.mocks.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.mocks.ts @@ -25,3 +25,8 @@ export const typeRegistryInstanceMock = typeRegistryMock.create(); jest.doMock('./saved_objects_type_registry', () => ({ SavedObjectTypeRegistry: jest.fn().mockImplementation(() => typeRegistryInstanceMock), })); + +export const registerRoutesMock = jest.fn(); +jest.doMock('./routes', () => ({ + registerRoutes: registerRoutesMock, +})); diff --git a/src/core/server/saved_objects/saved_objects_service.test.ts b/src/core/server/saved_objects/saved_objects_service.test.ts index 1d860d2c5a695..d7938819601b8 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.ts @@ -6,17 +6,25 @@ * Side Public License, v 1. */ +import { join } from 'path'; +import loadJsonFile from 'load-json-file'; + import { - migratorInstanceMock, clientProviderInstanceMock, + KibanaMigratorMock, + migratorInstanceMock, + registerRoutesMock, typeRegistryInstanceMock, } from './saved_objects_service.test.mocks'; import { BehaviorSubject } from 'rxjs'; +import { RawPackageInfo } from '@kbn/config'; import { ByteSizeValue } from '@kbn/config-schema'; +import { REPO_ROOT } from '@kbn/dev-utils'; import { SavedObjectsService } from './saved_objects_service'; import { mockCoreContext } from '../core_context.mock'; import { Env } from '../config'; +import { getEnvOptions } from '../config/mocks'; import { configServiceMock } from '../mocks'; import { elasticsearchServiceMock } from '../elasticsearch/elasticsearch_service.mock'; import { coreUsageDataServiceMock } from '../core_usage_data/core_usage_data_service.mock'; @@ -108,6 +116,42 @@ describe('SavedObjectsService', () => { expect(mockRegistry.registerDeprecations).toHaveBeenCalledWith(deprecations); }); + it('registers the deprecation provider with the correct kibanaVersion', async () => { + const pkg = loadJsonFile.sync(join(REPO_ROOT, 'package.json')) as RawPackageInfo; + const kibanaVersion = pkg.version; + + const coreContext = createCoreContext({ + env: Env.createDefault(REPO_ROOT, getEnvOptions(), { + ...pkg, + version: `${kibanaVersion}-beta1`, // test behavior when release has a version qualifier + }), + }); + + const soService = new SavedObjectsService(coreContext); + await soService.setup(createSetupDeps()); + + expect(getSavedObjectsDeprecationsProvider).toHaveBeenCalledWith( + expect.objectContaining({ kibanaVersion }) + ); + }); + + it('calls registerRoutes with the correct kibanaVersion', async () => { + const pkg = loadJsonFile.sync(join(REPO_ROOT, 'package.json')) as RawPackageInfo; + const kibanaVersion = pkg.version; + + const coreContext = createCoreContext({ + env: Env.createDefault(REPO_ROOT, getEnvOptions(), { + ...pkg, + version: `${kibanaVersion}-beta1`, // test behavior when release has a version qualifier + }), + }); + + const soService = new SavedObjectsService(coreContext); + await soService.setup(createSetupDeps()); + + expect(registerRoutesMock).toHaveBeenCalledWith(expect.objectContaining({ kibanaVersion })); + }); + describe('#setClientFactoryProvider', () => { it('registers the factory to the clientProvider', async () => { const coreContext = createCoreContext(); @@ -218,6 +262,24 @@ describe('SavedObjectsService', () => { expect(migratorInstanceMock.runMigrations).not.toHaveBeenCalled(); }); + it('calls KibanaMigrator with correct version', async () => { + const pkg = loadJsonFile.sync(join(REPO_ROOT, 'package.json')) as RawPackageInfo; + const kibanaVersion = pkg.version; + + const coreContext = createCoreContext({ + env: Env.createDefault(REPO_ROOT, getEnvOptions(), { + ...pkg, + version: `${kibanaVersion}-beta1`, // test behavior when release has a version qualifier + }), + }); + + const soService = new SavedObjectsService(coreContext); + await soService.setup(createSetupDeps()); + await soService.start(createStartDeps()); + + expect(KibanaMigratorMock).toHaveBeenCalledWith(expect.objectContaining({ kibanaVersion })); + }); + it('waits for all es nodes to be compatible before running migrations', async (done) => { expect.assertions(2); const coreContext = createCoreContext({ skipMigration: false }); diff --git a/src/core/server/saved_objects/saved_objects_service.ts b/src/core/server/saved_objects/saved_objects_service.ts index ed19b08ce1871..6e797f90da1e2 100644 --- a/src/core/server/saved_objects/saved_objects_service.ts +++ b/src/core/server/saved_objects/saved_objects_service.ts @@ -272,6 +272,7 @@ export class SavedObjectsService implements CoreService { private logger: Logger; + private readonly kibanaVersion: string; private setupDeps?: SavedObjectsSetupDeps; private config?: SavedObjectConfig; @@ -284,6 +285,9 @@ export class SavedObjectsService constructor(private readonly coreContext: CoreContext) { this.logger = coreContext.logger.get('savedobjects-service'); + this.kibanaVersion = SavedObjectsService.stripVersionQualifier( + this.coreContext.env.packageInfo.version + ); } public async setup(setupDeps: SavedObjectsSetupDeps): Promise { @@ -311,7 +315,7 @@ export class SavedObjectsService getSavedObjectsDeprecationsProvider({ kibanaConfig, savedObjectsConfig: this.config, - kibanaVersion: this.coreContext.env.packageInfo.version, + kibanaVersion: this.kibanaVersion, typeRegistry: this.typeRegistry, }) ); @@ -325,7 +329,7 @@ export class SavedObjectsService config: this.config, migratorPromise: this.migrator$.pipe(first()).toPromise(), kibanaConfig, - kibanaVersion: this.coreContext.env.packageInfo.version, + kibanaVersion: this.kibanaVersion, }); registerCoreObjectTypes(this.typeRegistry); @@ -506,11 +510,19 @@ export class SavedObjectsService return new KibanaMigrator({ typeRegistry: this.typeRegistry, logger: this.logger, - kibanaVersion: this.coreContext.env.packageInfo.version, + kibanaVersion: this.kibanaVersion, soMigrationsConfig, kibanaConfig, client, migrationsRetryDelay, }); } + + /** + * Coerce a semver-like string (x.y.z-SNAPSHOT) or prerelease version (x.y.z-alpha) + * to regular semver (x.y.z). + */ + private static stripVersionQualifier(version: string) { + return version.split('-')[0]; + } } diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 26ebef4d12ea5..ed1ae4414f49c 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -1695,7 +1695,7 @@ export class SavedObjectsRepository { * * When using incrementCounter for collecting usage data, you need to ensure * that usage collection happens on a best-effort basis and doesn't - * negatively affect your plugin or users. See https://github.com/elastic/kibana/blob/master/src/plugins/usage_collection/README.mdx#tracking-interactions-with-incrementcounter) + * negatively affect your plugin or users. See https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#tracking-interactions-with-incrementcounter) * * @example * ```ts diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index efa54e74fdf2f..2bd5f72d96bb2 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -75,6 +75,6 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@7.16.0': ['Elastic License 2.0'], - '@elastic/eui@39.1.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@39.1.2': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry }; diff --git a/src/plugins/chart_expressions/expression_metric/README.md b/src/plugins/chart_expressions/expression_metric/README.md index ec2541ebf74d8..ea49c1b1131ab 100755 --- a/src/plugins/chart_expressions/expression_metric/README.md +++ b/src/plugins/chart_expressions/expression_metric/README.md @@ -6,4 +6,4 @@ Expression MetricVis plugin adds a `metric` renderer and function to the express ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/src/plugins/chart_expressions/expression_tagcloud/README.md b/src/plugins/chart_expressions/expression_tagcloud/README.md index ae7635ffe0173..2331d6bef8c29 100755 --- a/src/plugins/chart_expressions/expression_tagcloud/README.md +++ b/src/plugins/chart_expressions/expression_tagcloud/README.md @@ -6,4 +6,4 @@ Expression Tagcloud plugin adds a `tagcloud` renderer and function to the expres ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/src/plugins/console/README.md b/src/plugins/console/README.md index 3bb58d37d1684..6920ae8b944cf 100644 --- a/src/plugins/console/README.md +++ b/src/plugins/console/README.md @@ -18,17 +18,17 @@ GET _search ``` ## Architecture -Console uses Ace editor that is wrapped with [`CoreEditor`](https://github.com/elastic/kibana/blob/master/src/plugins/console/public/types/core_editor.ts), so that if needed it can easily be replaced with another editor, for example Monaco. -The autocomplete logic is located in [`autocomplete`](https://github.com/elastic/kibana/blob/master/src/plugins/console/public/lib/autocomplete) folder. Autocomplete rules are computed by classes in `components` sub-folder. +Console uses Ace editor that is wrapped with [`CoreEditor`](https://github.com/elastic/kibana/blob/main/src/plugins/console/public/types/core_editor.ts), so that if needed it can easily be replaced with another editor, for example Monaco. +The autocomplete logic is located in [`autocomplete`](https://github.com/elastic/kibana/blob/main/src/plugins/console/public/lib/autocomplete) folder. Autocomplete rules are computed by classes in `components` sub-folder. ## Autocomplete definitions Kibana users benefit greatly from autocomplete suggestions since not all Elasticsearch APIs can be provided with a corresponding UI. Autocomplete suggestions improve usability of Console for any Elasticsearch API endpoint. Autocomplete definitions are all created in the form of javascript objects loaded from `json` and `js` files. ### Creating definitions -The [`generated`](https://github.com/elastic/kibana/blob/master/src/plugins/console/server/lib/spec_definitions/json/generated) folder contains definitions created automatically from Elasticsearch REST API specifications. See this [README](https://github.com/elastic/kibana/blob/master/packages/kbn-spec-to-console/README.md) file for more information on the `spec-to-console` script. +The [`generated`](https://github.com/elastic/kibana/blob/main/src/plugins/console/server/lib/spec_definitions/json/generated) folder contains definitions created automatically from Elasticsearch REST API specifications. See this [README](https://github.com/elastic/kibana/blob/main/packages/kbn-spec-to-console/README.md) file for more information on the `spec-to-console` script. -Manually created override files in the [`overrides`](https://github.com/elastic/kibana/blob/master/src/plugins/console/server/lib/spec_definitions/json/overrides) folder contain fixes for generated files and additions for request body parameters. +Manually created override files in the [`overrides`](https://github.com/elastic/kibana/blob/main/src/plugins/console/server/lib/spec_definitions/json/overrides) folder contain fixes for generated files and additions for request body parameters. ### Top level keys Use following top level keys in the definitions objects. @@ -214,7 +214,7 @@ Use this type to copy a configuration object specified in a different endpoint d } ``` #### Global scope (`GLOBAL`) -Use `GLOBAL` keyword with `__scope_link` to refer to a reusable set of definitions created in the [`globals`](https://github.com/elastic/kibana/blob/master/src/plugins/console/server/lib/spec_definitions/js/globals.ts) file. +Use `GLOBAL` keyword with `__scope_link` to refer to a reusable set of definitions created in the [`globals`](https://github.com/elastic/kibana/blob/main/src/plugins/console/server/lib/spec_definitions/js/globals.ts) file. For example: ```json { @@ -226,11 +226,11 @@ For example: } ``` #### Conditional definition (`__condition: { lines_regex: ... }`) -To provide a different set of autocomplete suggestions based on the value configured in the request. For example, when creating a snapshot repository of different types (`fs`, `url` etc) different properties are displayed in the suggestions list based on the type. See [snapshot.create_repository.json](https://github.com/elastic/kibana/blob/master/src/plugins/console/server/lib/spec_definitions/json/overrides/snapshot.create_repository.json) for an example. +To provide a different set of autocomplete suggestions based on the value configured in the request. For example, when creating a snapshot repository of different types (`fs`, `url` etc) different properties are displayed in the suggestions list based on the type. See [snapshot.create_repository.json](https://github.com/elastic/kibana/blob/main/src/plugins/console/server/lib/spec_definitions/json/overrides/snapshot.create_repository.json) for an example. ### Variables Some autocomplete definitions need to be configured with dynamic values that can't be hard coded into a json or js file, for example a list of indices in the cluster. -A list of variables is defined in the `parametrizedComponentFactories` function in [`kb.js`](https://github.com/elastic/kibana/blob/master/src/plugins/console/public/lib/kb/kb.js) file. The values of these variables are assigned dynamically for every cluster. +A list of variables is defined in the `parametrizedComponentFactories` function in [`kb.js`](https://github.com/elastic/kibana/blob/main/src/plugins/console/public/lib/kb/kb.js) file. The values of these variables are assigned dynamically for every cluster. Use these variables with curly braces, for example `{indices}`, `{types}`, `{id}`, `{username}`, `{template}`, `{nodes}` etc. diff --git a/src/plugins/console/public/application/components/console_menu.tsx b/src/plugins/console/public/application/components/console_menu.tsx index 1abbcfc2fdeb6..270fc2f0751c0 100644 --- a/src/plugins/console/public/application/components/console_menu.tsx +++ b/src/plugins/console/public/application/components/console_menu.tsx @@ -10,7 +10,13 @@ import React, { Component } from 'react'; import { NotificationsSetup } from 'src/core/public'; -import { EuiIcon, EuiContextMenuPanel, EuiContextMenuItem, EuiPopover } from '@elastic/eui'; +import { + EuiIcon, + EuiContextMenuPanel, + EuiContextMenuItem, + EuiPopover, + EuiLink, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; @@ -98,8 +104,7 @@ export class ConsoleMenu extends Component { render() { const button = ( - + ); const items = [ diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx index 04b222257cd2a..f8995479c1416 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx @@ -63,7 +63,7 @@ describe('Legacy (Ace) Console Editor Component Smoke Test', () => { (sendRequestToES as jest.Mock).mockRejectedValue({}); const editor = doMount(); act(() => { - editor.find('[data-test-subj~="sendRequestButton"]').simulate('click'); + editor.find('button[data-test-subj~="sendRequestButton"]').simulate('click'); }); await nextTick(); expect(sendRequestToES).toBeCalledTimes(1); diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx index c7f6349a19075..4ad86e495831e 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx @@ -6,7 +6,14 @@ * Side Public License, v 1. */ -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiScreenReaderOnly, EuiToolTip } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiScreenReaderOnly, + EuiToolTip, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { debounce } from 'lodash'; import { decompressFromEncodedURIComponent } from 'lz-string'; @@ -240,16 +247,16 @@ function EditorUI({ initialTextValue }: EditorProps) { defaultMessage: 'Click to send request', })} > - + + diff --git a/src/plugins/console/public/styles/_app.scss b/src/plugins/console/public/styles/_app.scss index 3c7ab2c7c00b8..61dc31138c768 100644 --- a/src/plugins/console/public/styles/_app.scss +++ b/src/plugins/console/public/styles/_app.scss @@ -56,17 +56,6 @@ min-width: 40px; } -.conApp__editorActionButton { - padding: 0 $euiSizeXS; - appearance: none; - border: none; - background: none; -} - -.conApp__editorActionButton--success { - color: $euiColorSuccess; -} - .conApp__resizer { @include kbnResizer; // Give the aria selection border priority when the divider is selected on IE11 and Chrome diff --git a/src/plugins/custom_integrations/README.md b/src/plugins/custom_integrations/README.md index e7af518e21ec1..a94c7fc97a970 100755 --- a/src/plugins/custom_integrations/README.md +++ b/src/plugins/custom_integrations/README.md @@ -6,4 +6,4 @@ Register add-data cards ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/src/plugins/custom_integrations/storybook/manager.ts b/src/plugins/custom_integrations/storybook/manager.ts index 99c01efdddfdc..0b4454798d4e6 100644 --- a/src/plugins/custom_integrations/storybook/manager.ts +++ b/src/plugins/custom_integrations/storybook/manager.ts @@ -14,7 +14,7 @@ addons.setConfig({ theme: create({ base: 'light', brandTitle: 'Kibana Custom Integrations Storybook', - brandUrl: 'https://github.com/elastic/kibana/tree/master/src/plugins/custom_integrations', + brandUrl: 'https://github.com/elastic/kibana/tree/main/src/plugins/custom_integrations', }), showPanel: true.valueOf, selectedPanel: PANEL_ID, diff --git a/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.test.tsx b/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.test.tsx index c3b4075690261..3237eb106e4ec 100644 --- a/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.test.tsx +++ b/src/plugins/dashboard/public/application/hooks/use_dashboard_app_state.test.tsx @@ -206,7 +206,9 @@ describe('Dashboard container lifecycle', () => { }); }); -describe('Dashboard initial state', () => { +// FLAKY: https://github.com/elastic/kibana/issues/116050 +// FLAKY: https://github.com/elastic/kibana/issues/105018 +describe.skip('Dashboard initial state', () => { it('Extracts state from Dashboard Saved Object', async () => { const { renderHookResult, embeddableFactoryResult } = renderDashboardAppStateHook({}); const getResult = () => renderHookResult.result.current; @@ -276,7 +278,8 @@ describe('Dashboard initial state', () => { }); }); -describe('Dashboard state sync', () => { +// FLAKY: https://github.com/elastic/kibana/issues/116043 +describe.skip('Dashboard state sync', () => { let defaultDashboardAppStateHookResult: RenderDashboardStateHookReturn; const getResult = () => defaultDashboardAppStateHookResult.renderHookResult.result.current; diff --git a/src/plugins/dashboard/public/application/lib/convert_saved_panels_to_panel_map.ts b/src/plugins/dashboard/public/application/lib/convert_dashboard_panels.ts similarity index 66% rename from src/plugins/dashboard/public/application/lib/convert_saved_panels_to_panel_map.ts rename to src/plugins/dashboard/public/application/lib/convert_dashboard_panels.ts index b91940f45081b..4ff1278d9467e 100644 --- a/src/plugins/dashboard/public/application/lib/convert_saved_panels_to_panel_map.ts +++ b/src/plugins/dashboard/public/application/lib/convert_dashboard_panels.ts @@ -6,7 +6,10 @@ * Side Public License, v 1. */ -import { convertSavedDashboardPanelToPanelState } from '../../../common/embeddable/embeddable_saved_object_converters'; +import { + convertSavedDashboardPanelToPanelState, + convertPanelStateToSavedDashboardPanel, +} from '../../../common/embeddable/embeddable_saved_object_converters'; import type { SavedDashboardPanel, DashboardPanelMap } from '../../types'; export const convertSavedPanelsToPanelMap = (panels?: SavedDashboardPanel[]): DashboardPanelMap => { @@ -16,3 +19,9 @@ export const convertSavedPanelsToPanelMap = (panels?: SavedDashboardPanel[]): Da }); return panelsMap; }; + +export const convertPanelMapToSavedPanels = (panels: DashboardPanelMap, version: string) => { + return Object.values(panels).map((panel) => + convertPanelStateToSavedDashboardPanel(panel, version) + ); +}; diff --git a/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts b/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts index ef961d5783acc..3cd903cf80c1b 100644 --- a/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts +++ b/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts @@ -19,7 +19,7 @@ import { DashboardContainerInput, DashboardBuildContext, } from '../../types'; -import { convertSavedPanelsToPanelMap } from './convert_saved_panels_to_panel_map'; +import { convertSavedPanelsToPanelMap } from './convert_dashboard_panels'; interface SavedObjectToDashboardStateProps { version: string; diff --git a/src/plugins/dashboard/public/application/lib/load_dashboard_history_location_state.ts b/src/plugins/dashboard/public/application/lib/load_dashboard_history_location_state.ts index d20e14cea74b5..ce06ef443d69f 100644 --- a/src/plugins/dashboard/public/application/lib/load_dashboard_history_location_state.ts +++ b/src/plugins/dashboard/public/application/lib/load_dashboard_history_location_state.ts @@ -8,7 +8,7 @@ import { ForwardedDashboardState } from '../../locator'; import { DashboardState } from '../../types'; -import { convertSavedPanelsToPanelMap } from './convert_saved_panels_to_panel_map'; +import { convertSavedPanelsToPanelMap } from './convert_dashboard_panels'; export const loadDashboardHistoryLocationState = ( state?: ForwardedDashboardState diff --git a/src/plugins/dashboard/public/application/lib/sync_dashboard_url_state.ts b/src/plugins/dashboard/public/application/lib/sync_dashboard_url_state.ts index 00b8f8217e25f..d314dc631631d 100644 --- a/src/plugins/dashboard/public/application/lib/sync_dashboard_url_state.ts +++ b/src/plugins/dashboard/public/application/lib/sync_dashboard_url_state.ts @@ -21,7 +21,7 @@ import type { DashboardState, RawDashboardState, } from '../../types'; -import { convertSavedPanelsToPanelMap } from './convert_saved_panels_to_panel_map'; +import { convertSavedPanelsToPanelMap } from './convert_dashboard_panels'; type SyncDashboardUrlStateProps = DashboardBuildContext & { savedDashboard: DashboardSavedObject }; diff --git a/src/plugins/dashboard/public/application/top_nav/dashboard_top_nav.tsx b/src/plugins/dashboard/public/application/top_nav/dashboard_top_nav.tsx index bed8a5b0ea66e..e569b95c9a2c7 100644 --- a/src/plugins/dashboard/public/application/top_nav/dashboard_top_nav.tsx +++ b/src/plugins/dashboard/public/application/top_nav/dashboard_top_nav.tsx @@ -407,16 +407,24 @@ export function DashboardTopNav({ const timeRange = timefilter.getTime(); ShowShareModal({ share, + timeRange, kibanaVersion, anchorElement, dashboardCapabilities, + dashboardSessionStorage, currentDashboardState: currentState, savedDashboard: dashboardAppState.savedDashboard, isDirty: Boolean(dashboardAppState.hasUnsavedChanges), - timeRange, }); }, - [dashboardAppState, dashboardCapabilities, share, kibanaVersion, timefilter] + [ + share, + timefilter, + kibanaVersion, + dashboardAppState, + dashboardCapabilities, + dashboardSessionStorage, + ] ); const dashboardTopNavActions = useMemo(() => { diff --git a/src/plugins/dashboard/public/application/top_nav/show_share_modal.test.tsx b/src/plugins/dashboard/public/application/top_nav/show_share_modal.test.tsx index c684370c92062..184d25081d4fa 100644 --- a/src/plugins/dashboard/public/application/top_nav/show_share_modal.test.tsx +++ b/src/plugins/dashboard/public/application/top_nav/show_share_modal.test.tsx @@ -6,8 +6,13 @@ * Side Public License, v 1. */ -import { Capabilities } from 'src/core/public'; -import { showPublicUrlSwitch } from './show_share_modal'; +import { DashboardState } from '../../types'; +import { DashboardAppLocatorParams } from '../..'; +import { Capabilities } from '../../services/core'; +import { SharePluginStart } from '../../services/share'; +import { stateToRawDashboardState } from '../lib/convert_dashboard_state'; +import { getSavedDashboardMock, makeDefaultServices } from '../test_helpers'; +import { showPublicUrlSwitch, ShowShareModal, ShowShareModalProps } from './show_share_modal'; describe('showPublicUrlSwitch', () => { test('returns false if "dashboard" app is not available', () => { @@ -49,3 +54,100 @@ describe('showPublicUrlSwitch', () => { expect(result).toBe(true); }); }); + +describe('ShowShareModal', () => { + const unsavedStateKeys = ['query', 'filters', 'options', 'savedQuery', 'panels'] as Array< + keyof DashboardAppLocatorParams + >; + + const getPropsAndShare = ( + unsavedState?: Partial + ): { share: SharePluginStart; showModalProps: ShowShareModalProps } => { + const services = makeDefaultServices(); + const share = {} as unknown as SharePluginStart; + share.toggleShareContextMenu = jest.fn(); + services.dashboardSessionStorage.getState = jest.fn().mockReturnValue(unsavedState); + return { + showModalProps: { + share, + isDirty: true, + kibanaVersion: 'testKibanaVersion', + savedDashboard: getSavedDashboardMock(), + anchorElement: document.createElement('div'), + dashboardCapabilities: services.dashboardCapabilities, + currentDashboardState: { panels: {} } as unknown as DashboardState, + dashboardSessionStorage: services.dashboardSessionStorage, + timeRange: { + from: '2021-10-07T00:00:00.000Z', + to: '2021-10-10T00:00:00.000Z', + }, + }, + share, + }; + }; + + it('locatorParams is missing all unsaved state when none is given', () => { + const { share, showModalProps } = getPropsAndShare(); + const toggleShareMenuSpy = jest.spyOn(share, 'toggleShareContextMenu'); + ShowShareModal(showModalProps); + expect(share.toggleShareContextMenu).toHaveBeenCalledTimes(1); + const shareLocatorParams = ( + toggleShareMenuSpy.mock.calls[0][0].sharingData as { + locatorParams: { params: DashboardAppLocatorParams }; + } + ).locatorParams.params; + unsavedStateKeys.forEach((key) => { + expect(shareLocatorParams[key]).toBeUndefined(); + }); + }); + + it('locatorParams unsaved state is properly propagated to locator', () => { + const unsavedDashboardState: DashboardState = { + panels: { + panel_1: { + type: 'panel_type', + gridData: { w: 0, h: 0, x: 0, y: 0, i: '0' }, + panelRefName: 'superPanel', + explicitInput: { + id: 'superPanel', + }, + }, + }, + options: { + hidePanelTitles: true, + useMargins: true, + syncColors: true, + }, + filters: [ + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'hi' }, + }, + ], + query: { query: 'bye', language: 'kuery' }, + savedQuery: 'amazingSavedQuery', + } as unknown as DashboardState; + const { share, showModalProps } = getPropsAndShare(unsavedDashboardState); + const toggleShareMenuSpy = jest.spyOn(share, 'toggleShareContextMenu'); + ShowShareModal(showModalProps); + expect(share.toggleShareContextMenu).toHaveBeenCalledTimes(1); + const shareLocatorParams = ( + toggleShareMenuSpy.mock.calls[0][0].sharingData as { + locatorParams: { params: DashboardAppLocatorParams }; + } + ).locatorParams.params; + const rawDashboardState = stateToRawDashboardState({ + state: unsavedDashboardState, + version: 'testKibanaVersion', + }); + unsavedStateKeys.forEach((key) => { + expect(shareLocatorParams[key]).toStrictEqual( + (rawDashboardState as Partial)[key] + ); + }); + }); +}); diff --git a/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx b/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx index 879afd4b9d305..3bfac12a6b500 100644 --- a/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx +++ b/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx @@ -21,18 +21,21 @@ import { SharePluginStart } from '../../services/share'; import { DashboardAppCapabilities, DashboardState } from '../../types'; import { dashboardUrlParams } from '../dashboard_router'; import { stateToRawDashboardState } from '../lib/convert_dashboard_state'; +import { convertPanelMapToSavedPanels } from '../lib/convert_dashboard_panels'; +import { DashboardSessionStorage } from '../lib'; const showFilterBarId = 'showFilterBar'; -interface ShowShareModalProps { +export interface ShowShareModalProps { isDirty: boolean; + timeRange: TimeRange; kibanaVersion: string; share: SharePluginStart; anchorElement: HTMLElement; savedDashboard: DashboardSavedObject; currentDashboardState: DashboardState; dashboardCapabilities: DashboardAppCapabilities; - timeRange: TimeRange; + dashboardSessionStorage: DashboardSessionStorage; } export const showPublicUrlSwitch = (anonymousUserCapabilities: Capabilities) => { @@ -46,12 +49,13 @@ export const showPublicUrlSwitch = (anonymousUserCapabilities: Capabilities) => export function ShowShareModal({ share, isDirty, + timeRange, kibanaVersion, anchorElement, savedDashboard, dashboardCapabilities, currentDashboardState, - timeRange, + dashboardSessionStorage, }: ShowShareModalProps) { const EmbedUrlParamExtension = ({ setParamValue, @@ -110,23 +114,31 @@ export function ShowShareModal({ ); }; - const rawDashboardState = stateToRawDashboardState({ - state: currentDashboardState, - version: kibanaVersion, - }); + let unsavedStateForLocator: Pick< + DashboardAppLocatorParams, + 'options' | 'query' | 'savedQuery' | 'filters' | 'panels' + > = {}; + const unsavedDashboardState = dashboardSessionStorage.getState(savedDashboard.id); + if (unsavedDashboardState) { + unsavedStateForLocator = { + query: unsavedDashboardState.query, + filters: unsavedDashboardState.filters, + options: unsavedDashboardState.options, + savedQuery: unsavedDashboardState.savedQuery, + panels: unsavedDashboardState.panels + ? convertPanelMapToSavedPanels(unsavedDashboardState.panels, kibanaVersion) + : undefined, + }; + } const locatorParams: DashboardAppLocatorParams = { dashboardId: savedDashboard.id, - filters: rawDashboardState.filters, preserveSavedFilters: true, - query: rawDashboardState.query, - savedQuery: rawDashboardState.savedQuery, + refreshInterval: undefined, // We don't share refresh interval externally + viewMode: ViewMode.VIEW, // For share locators we always load the dashboard in view mode useHash: false, - panels: rawDashboardState.panels, timeRange, - viewMode: ViewMode.VIEW, // For share locators we always load the dashboard in view mode - refreshInterval: undefined, // We don't share refresh interval externally - options: rawDashboardState.options, + ...unsavedStateForLocator, }; share.toggleShareContextMenu({ @@ -136,7 +148,10 @@ export function ShowShareModal({ allowShortUrl: dashboardCapabilities.createShortUrl, shareableUrl: setStateToKbnUrl( '_a', - rawDashboardState, + stateToRawDashboardState({ + state: currentDashboardState, + version: kibanaVersion, + }), { useHash: false, storeInHashQuery: true }, unhashUrl(window.location.href) ), diff --git a/src/plugins/dashboard/public/services/core.ts b/src/plugins/dashboard/public/services/core.ts index 75461729841e9..e805c6cd706a9 100644 --- a/src/plugins/dashboard/public/services/core.ts +++ b/src/plugins/dashboard/public/services/core.ts @@ -9,6 +9,7 @@ export { AppMountParameters, CoreSetup, + Capabilities, PluginInitializerContext, ScopedHistory, NotificationsStart, diff --git a/src/plugins/data/common/constants.ts b/src/plugins/data/common/constants.ts index da5124549dc30..f5c7415e74643 100644 --- a/src/plugins/data/common/constants.ts +++ b/src/plugins/data/common/constants.ts @@ -36,4 +36,5 @@ export const UI_SETTINGS = { AUTOCOMPLETE_USE_TIMERANGE: 'autocomplete:useTimeRange', AUTOCOMPLETE_VALUE_SUGGESTION_METHOD: 'autocomplete:valueSuggestionMethod', DATE_FORMAT: 'dateFormat', + DATEFORMAT_TZ: 'dateFormat:tz', } as const; diff --git a/src/plugins/data/common/query/persistable_state.test.ts b/src/plugins/data/common/query/persistable_state.test.ts index 807cc72a071be..93f14a0fc2e08 100644 --- a/src/plugins/data/common/query/persistable_state.test.ts +++ b/src/plugins/data/common/query/persistable_state.test.ts @@ -8,6 +8,7 @@ import { extract, inject } from './persistable_state'; import { Filter } from '@kbn/es-query'; +import { DATA_VIEW_SAVED_OBJECT_TYPE } from '../../common'; describe('filter manager persistable state tests', () => { const filters: Filter[] = [ @@ -15,13 +16,15 @@ describe('filter manager persistable state tests', () => { ]; describe('reference injection', () => { test('correctly inserts reference to filter', () => { - const updatedFilters = inject(filters, [{ type: 'index_pattern', name: 'test', id: '123' }]); + const updatedFilters = inject(filters, [ + { type: DATA_VIEW_SAVED_OBJECT_TYPE, name: 'test', id: '123' }, + ]); expect(updatedFilters[0]).toHaveProperty('meta.index', '123'); }); test('drops index setting if reference is missing', () => { const updatedFilters = inject(filters, [ - { type: 'index_pattern', name: 'test123', id: '123' }, + { type: DATA_VIEW_SAVED_OBJECT_TYPE, name: 'test123', id: '123' }, ]); expect(updatedFilters[0]).toHaveProperty('meta.index', undefined); }); diff --git a/src/plugins/data/common/query/persistable_state.ts b/src/plugins/data/common/query/persistable_state.ts index 367234e9ff4f0..177aae391c4fb 100644 --- a/src/plugins/data/common/query/persistable_state.ts +++ b/src/plugins/data/common/query/persistable_state.ts @@ -8,8 +8,9 @@ import uuid from 'uuid'; import { Filter } from '@kbn/es-query'; -import type { SerializableRecord } from '@kbn/utility-types'; +import { DATA_VIEW_SAVED_OBJECT_TYPE } from '../../common'; import { SavedObjectReference } from '../../../../core/types'; +import { MigrateFunctionsObject } from '../../../kibana_utils/common'; export const extract = (filters: Filter[]) => { const references: SavedObjectReference[] = []; @@ -17,7 +18,7 @@ export const extract = (filters: Filter[]) => { if (filter.meta?.index) { const id = uuid(); references.push({ - type: 'index_pattern', + type: DATA_VIEW_SAVED_OBJECT_TYPE, name: id, id: filter.meta.index, }); @@ -51,7 +52,7 @@ export const inject = (filters: Filter[], references: SavedObjectReference[]) => }); }; -export const telemetry = (filters: SerializableRecord, collector: unknown) => { +export const telemetry = (filters: Filter[], collector: unknown) => { return {}; }; @@ -59,6 +60,6 @@ export const migrateToLatest = (filters: Filter[], version: string) => { return filters; }; -export const getAllMigrations = () => { +export const getAllMigrations = (): MigrateFunctionsObject => { return {}; }; diff --git a/src/plugins/data/common/query/types.ts b/src/plugins/data/common/query/types.ts index c1861beb1ed90..fea59ea558a35 100644 --- a/src/plugins/data/common/query/types.ts +++ b/src/plugins/data/common/query/types.ts @@ -6,6 +6,25 @@ * Side Public License, v 1. */ -export * from './timefilter/types'; +import type { Query, Filter } from '@kbn/es-query'; +import type { RefreshInterval, TimeRange } from './timefilter/types'; -export { Query } from '@kbn/es-query'; +export type { RefreshInterval, TimeRange, TimeRangeBounds } from './timefilter/types'; +export type { Query } from '@kbn/es-query'; + +export type SavedQueryTimeFilter = TimeRange & { + refreshInterval: RefreshInterval; +}; + +export interface SavedQuery { + id: string; + attributes: SavedQueryAttributes; +} + +export interface SavedQueryAttributes { + title: string; + description: string; + query: Query; + filters?: Filter[]; + timefilter?: SavedQueryTimeFilter; +} diff --git a/src/plugins/data/common/search/aggs/param_types/json.test.ts b/src/plugins/data/common/search/aggs/param_types/json.test.ts index 1b3af5b92c26b..8e71cf4657e1f 100644 --- a/src/plugins/data/common/search/aggs/param_types/json.test.ts +++ b/src/plugins/data/common/search/aggs/param_types/json.test.ts @@ -67,10 +67,34 @@ describe('JSON', function () { aggParam.write(aggConfig, output); expect(aggConfig.params).toHaveProperty(paramName); - expect(output.params).toEqual({ - existing: 'true', - new_param: 'should exist in output', - }); + expect(output.params).toMatchInlineSnapshot(` + Object { + "existing": "true", + "new_param": "should exist in output", + } + `); + }); + + it('should append param when valid JSON with triple quotes', () => { + const aggParam = initAggParam(); + const jsonData = `{ + "a": """ + multiline string - line 1 + """ + }`; + + aggConfig.params[paramName] = jsonData; + + aggParam.write(aggConfig, output); + expect(aggConfig.params).toHaveProperty(paramName); + + expect(output.params).toMatchInlineSnapshot(` + Object { + "a": " + multiline string - line 1 + ", + } + `); }); it('should not overwrite existing params', () => { diff --git a/src/plugins/data/common/search/aggs/param_types/json.ts b/src/plugins/data/common/search/aggs/param_types/json.ts index 1678b6586ce80..f499286140af1 100644 --- a/src/plugins/data/common/search/aggs/param_types/json.ts +++ b/src/plugins/data/common/search/aggs/param_types/json.ts @@ -11,6 +11,17 @@ import _ from 'lodash'; import { IAggConfig } from '../agg_config'; import { BaseParamType } from './base'; +function collapseLiteralStrings(xjson: string) { + const tripleQuotes = '"""'; + const splitData = xjson.split(tripleQuotes); + + for (let idx = 1; idx < splitData.length - 1; idx += 2) { + splitData[idx] = JSON.stringify(splitData[idx]); + } + + return splitData.join(''); +} + export class JsonParamType extends BaseParamType { constructor(config: Record) { super(config); @@ -26,9 +37,8 @@ export class JsonParamType extends BaseParamType { return; } - // handle invalid Json input try { - paramJson = JSON.parse(param); + paramJson = JSON.parse(collapseLiteralStrings(param)); } catch (err) { return; } diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 4a55cc2a0d511..25f649f69a052 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -130,7 +130,7 @@ export class DataPublicPlugin core: CoreStart, { uiActions, fieldFormats, dataViews }: DataStartDependencies ): DataPublicPluginStart { - const { uiSettings, notifications, savedObjects, overlays } = core; + const { uiSettings, notifications, overlays } = core; setNotifications(notifications); setOverlays(overlays); setUiSettings(uiSettings); @@ -138,7 +138,7 @@ export class DataPublicPlugin const query = this.queryService.start({ storage: this.storage, - savedObjectsClient: savedObjects.client, + http: core.http, uiSettings, }); diff --git a/src/plugins/data/public/query/filter_manager/filter_manager.ts b/src/plugins/data/public/query/filter_manager/filter_manager.ts index 34af80a483e6b..f076a2c591fb1 100644 --- a/src/plugins/data/public/query/filter_manager/filter_manager.ts +++ b/src/plugins/data/public/query/filter_manager/filter_manager.ts @@ -26,13 +26,12 @@ import { import { PersistableStateService } from '../../../../kibana_utils/common/persistable_state'; import { getAllMigrations, - migrateToLatest, inject, extract, telemetry, } from '../../../common/query/persistable_state'; -export class FilterManager implements PersistableStateService { +export class FilterManager implements PersistableStateService { private filters: Filter[] = []; private updated$: Subject = new Subject(); private fetch$: Subject = new Subject(); @@ -228,16 +227,11 @@ export class FilterManager implements PersistableStateService { }); } - // Filter needs to implement SerializableRecord - public extract = extract as any; + public extract = extract; - // Filter needs to implement SerializableRecord - public inject = inject as any; + public inject = inject; public telemetry = telemetry; - // Filter needs to implement SerializableRecord - public migrateToLatest = migrateToLatest as any; - public getAllMigrations = getAllMigrations; } diff --git a/src/plugins/data/public/query/query_service.ts b/src/plugins/data/public/query/query_service.ts index 5104a934fdec8..314f13e3524db 100644 --- a/src/plugins/data/public/query/query_service.ts +++ b/src/plugins/data/public/query/query_service.ts @@ -7,7 +7,7 @@ */ import { share } from 'rxjs/operators'; -import { IUiSettingsClient, SavedObjectsClientContract } from 'src/core/public'; +import { HttpStart, IUiSettingsClient } from 'src/core/public'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { buildEsQuery } from '@kbn/es-query'; import { FilterManager } from './filter_manager'; @@ -15,7 +15,7 @@ import { createAddToQueryLog } from './lib'; import { TimefilterService, TimefilterSetup } from './timefilter'; import { createSavedQueryService } from './saved_query/saved_query_service'; import { createQueryStateObservable } from './state_sync/create_global_query_observable'; -import { QueryStringManager, QueryStringContract } from './query_string'; +import { QueryStringContract, QueryStringManager } from './query_string'; import { getEsQueryConfig, TimeRange } from '../../common'; import { getUiSettings } from '../services'; import { NowProviderInternalContract } from '../now_provider'; @@ -33,9 +33,9 @@ interface QueryServiceSetupDependencies { } interface QueryServiceStartDependencies { - savedObjectsClient: SavedObjectsClientContract; storage: IStorageWrapper; uiSettings: IUiSettingsClient; + http: HttpStart; } export class QueryService { @@ -70,7 +70,7 @@ export class QueryService { }; } - public start({ savedObjectsClient, storage, uiSettings }: QueryServiceStartDependencies) { + public start({ storage, uiSettings, http }: QueryServiceStartDependencies) { return { addToQueryLog: createAddToQueryLog({ storage, @@ -78,7 +78,7 @@ export class QueryService { }), filterManager: this.filterManager, queryString: this.queryStringManager, - savedQueries: createSavedQueryService(savedObjectsClient), + savedQueries: createSavedQueryService(http), state$: this.state$, timefilter: this.timefilter, getEsQuery: (indexPattern: IndexPattern, timeRange?: TimeRange) => { diff --git a/src/plugins/data/public/query/saved_query/saved_query_service.test.ts b/src/plugins/data/public/query/saved_query/saved_query_service.test.ts index 673a86df98881..047051c302083 100644 --- a/src/plugins/data/public/query/saved_query/saved_query_service.test.ts +++ b/src/plugins/data/public/query/saved_query/saved_query_service.test.ts @@ -7,8 +7,20 @@ */ import { createSavedQueryService } from './saved_query_service'; -import { FilterStateStore } from '../../../common'; -import { SavedQueryAttributes } from './types'; +import { httpServiceMock } from '../../../../../core/public/mocks'; +import { SavedQueryAttributes } from '../../../common'; + +const http = httpServiceMock.createStartContract(); + +const { + deleteSavedQuery, + getSavedQuery, + findSavedQueries, + createQuery, + updateQuery, + getAllSavedQueries, + getSavedQueryCount, +} = createSavedQueryService(http); const savedQueryAttributes: SavedQueryAttributes = { title: 'foo', @@ -17,416 +29,90 @@ const savedQueryAttributes: SavedQueryAttributes = { language: 'kuery', query: 'response:200', }, -}; -const savedQueryAttributesBar: SavedQueryAttributes = { - title: 'bar', - description: 'baz', - query: { - language: 'kuery', - query: 'response:200', - }, -}; - -const savedQueryAttributesWithFilters: SavedQueryAttributes = { - ...savedQueryAttributes, - filters: [ - { - query: { match_all: {} }, - $state: { store: FilterStateStore.APP_STATE }, - meta: { - disabled: false, - negate: false, - alias: null, - }, - }, - ], - timefilter: { - to: 'now', - from: 'now-15m', - refreshInterval: { - pause: false, - value: 0, - }, - }, + filters: [], }; -const mockSavedObjectsClient = { - create: jest.fn(), - error: jest.fn(), - find: jest.fn(), - resolve: jest.fn(), - delete: jest.fn(), -}; - -const { - deleteSavedQuery, - getSavedQuery, - findSavedQueries, - saveQuery, - getAllSavedQueries, - getSavedQueryCount, -} = createSavedQueryService( - // @ts-ignore - mockSavedObjectsClient -); - describe('saved query service', () => { afterEach(() => { - mockSavedObjectsClient.create.mockReset(); - mockSavedObjectsClient.find.mockReset(); - mockSavedObjectsClient.resolve.mockReset(); - mockSavedObjectsClient.delete.mockReset(); + http.post.mockReset(); + http.get.mockReset(); + http.delete.mockReset(); }); - describe('saveQuery', function () { - it('should create a saved object for the given attributes', async () => { - mockSavedObjectsClient.create.mockReturnValue({ - id: 'foo', - attributes: savedQueryAttributes, + describe('createQuery', function () { + it('should post the stringified given attributes', async () => { + await createQuery(savedQueryAttributes); + expect(http.post).toBeCalled(); + expect(http.post).toHaveBeenCalledWith('/api/saved_query/_create', { + body: '{"title":"foo","description":"bar","query":{"language":"kuery","query":"response:200"},"filters":[]}', }); - - const response = await saveQuery(savedQueryAttributes); - expect(mockSavedObjectsClient.create).toHaveBeenCalledWith('query', savedQueryAttributes, { - id: 'foo', - }); - expect(response).toEqual({ id: 'foo', attributes: savedQueryAttributes }); }); + }); - it('should allow overwriting an existing saved query', async () => { - mockSavedObjectsClient.create.mockReturnValue({ - id: 'foo', - attributes: savedQueryAttributes, - }); - - const response = await saveQuery(savedQueryAttributes, { overwrite: true }); - expect(mockSavedObjectsClient.create).toHaveBeenCalledWith('query', savedQueryAttributes, { - id: 'foo', - overwrite: true, + describe('updateQuery', function () { + it('should put the ID & stringified given attributes', async () => { + await updateQuery('foo', savedQueryAttributes); + expect(http.put).toBeCalled(); + expect(http.put).toHaveBeenCalledWith('/api/saved_query/foo', { + body: '{"title":"foo","description":"bar","query":{"language":"kuery","query":"response:200"},"filters":[]}', }); - expect(response).toEqual({ id: 'foo', attributes: savedQueryAttributes }); }); + }); - it('should optionally accept filters and timefilters in object format', async () => { - const serializedSavedQueryAttributesWithFilters = { - ...savedQueryAttributesWithFilters, - filters: savedQueryAttributesWithFilters.filters, - timefilter: savedQueryAttributesWithFilters.timefilter, - }; - - mockSavedObjectsClient.create.mockReturnValue({ - id: 'foo', - attributes: serializedSavedQueryAttributesWithFilters, + describe('getAllSavedQueries', function () { + it('should post and extract the saved queries from the response', async () => { + http.post.mockResolvedValue({ + total: 0, + savedQueries: [{ attributes: savedQueryAttributes }], }); - - const response = await saveQuery(savedQueryAttributesWithFilters); - - expect(mockSavedObjectsClient.create).toHaveBeenCalledWith( - 'query', - serializedSavedQueryAttributesWithFilters, - { id: 'foo' } - ); - expect(response).toEqual({ id: 'foo', attributes: savedQueryAttributesWithFilters }); - }); - - it('should throw an error when saved objects client returns error', async () => { - mockSavedObjectsClient.create.mockReturnValue({ - error: { - error: '123', - message: 'An Error', - }, + const result = await getAllSavedQueries(); + expect(http.post).toBeCalled(); + expect(http.post).toHaveBeenCalledWith('/api/saved_query/_find', { + body: '{"perPage":10000}', }); - - let error = null; - try { - await saveQuery(savedQueryAttributes); - } catch (e) { - error = e; - } - expect(error).not.toBe(null); - }); - it('should throw an error if the saved query does not have a title', async () => { - let error = null; - try { - await saveQuery({ ...savedQueryAttributes, title: '' }); - } catch (e) { - error = e; - } - expect(error).not.toBe(null); + expect(result).toEqual([{ attributes: savedQueryAttributes }]); }); }); - describe('findSavedQueries', function () { - it('should find and return saved queries without search text or pagination parameters', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [{ id: 'foo', attributes: savedQueryAttributes }], - total: 5, - }); - - const response = await findSavedQueries(); - expect(response.queries).toEqual([{ id: 'foo', attributes: savedQueryAttributes }]); - }); - it('should return the total count along with the requested queries', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [{ id: 'foo', attributes: savedQueryAttributes }], - total: 5, - }); - - const response = await findSavedQueries(); - expect(response.total).toEqual(5); - }); - - it('should find and return saved queries with search text matching the title field', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [{ id: 'foo', attributes: savedQueryAttributes }], - total: 5, - }); - const response = await findSavedQueries('foo'); - expect(mockSavedObjectsClient.find).toHaveBeenCalledWith({ - page: 1, - perPage: 50, - search: 'foo', - searchFields: ['title^5', 'description'], - sortField: '_score', - type: 'query', - }); - expect(response.queries).toEqual([{ id: 'foo', attributes: savedQueryAttributes }]); - }); - it('should find and return parsed filters and timefilters items', async () => { - const serializedSavedQueryAttributesWithFilters = { - ...savedQueryAttributesWithFilters, - filters: savedQueryAttributesWithFilters.filters, - timefilter: savedQueryAttributesWithFilters.timefilter, - }; - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [{ id: 'foo', attributes: serializedSavedQueryAttributesWithFilters }], - total: 5, - }); - const response = await findSavedQueries('bar'); - expect(response.queries).toEqual([ - { id: 'foo', attributes: savedQueryAttributesWithFilters }, - ]); - }); - it('should return an array of saved queries', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [{ id: 'foo', attributes: savedQueryAttributes }], - total: 5, + describe('findSavedQueries', function () { + it('should post and return the total & saved queries', async () => { + http.post.mockResolvedValue({ + total: 0, + savedQueries: [{ attributes: savedQueryAttributes }], }); - const response = await findSavedQueries(); - expect(response.queries).toEqual( - expect.objectContaining([ - { - attributes: { - description: 'bar', - query: { language: 'kuery', query: 'response:200' }, - title: 'foo', - }, - id: 'foo', - }, - ]) - ); - }); - it('should accept perPage and page properties', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [ - { id: 'foo', attributes: savedQueryAttributes }, - { id: 'bar', attributes: savedQueryAttributesBar }, - ], - total: 5, + const result = await findSavedQueries(); + expect(http.post).toBeCalled(); + expect(http.post).toHaveBeenCalledWith('/api/saved_query/_find', { + body: '{"page":1,"perPage":50,"search":""}', }); - const response = await findSavedQueries(undefined, 2, 1); - expect(mockSavedObjectsClient.find).toHaveBeenCalledWith({ - page: 1, - perPage: 2, - search: '', - searchFields: ['title^5', 'description'], - sortField: '_score', - type: 'query', + expect(result).toEqual({ + queries: [{ attributes: savedQueryAttributes }], + total: 0, }); - expect(response.queries).toEqual( - expect.objectContaining([ - { - attributes: { - description: 'bar', - query: { language: 'kuery', query: 'response:200' }, - title: 'foo', - }, - id: 'foo', - }, - { - attributes: { - description: 'baz', - query: { language: 'kuery', query: 'response:200' }, - title: 'bar', - }, - id: 'bar', - }, - ]) - ); }); }); describe('getSavedQuery', function () { - it('should retrieve a saved query by id', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'foo', - attributes: savedQueryAttributes, - }, - outcome: 'exactMatch', - }); - - const response = await getSavedQuery('foo'); - expect(response).toEqual({ id: 'foo', attributes: savedQueryAttributes }); - }); - it('should only return saved queries', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'foo', - attributes: savedQueryAttributes, - }, - outcome: 'exactMatch', - }); - - await getSavedQuery('foo'); - expect(mockSavedObjectsClient.resolve).toHaveBeenCalledWith('query', 'foo'); - }); - - it('should parse a json query', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'food', - attributes: { - title: 'food', - description: 'bar', - query: { - language: 'kuery', - query: '{"x": "y"}', - }, - }, - }, - outcome: 'exactMatch', - }); - - const response = await getSavedQuery('food'); - expect(response.attributes.query.query).toEqual({ x: 'y' }); - }); - - it('should handle null string', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'food', - attributes: { - title: 'food', - description: 'bar', - query: { - language: 'kuery', - query: 'null', - }, - }, - }, - outcome: 'exactMatch', - }); - - const response = await getSavedQuery('food'); - expect(response.attributes.query.query).toEqual('null'); - }); - - it('should handle null quoted string', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'food', - attributes: { - title: 'food', - description: 'bar', - query: { - language: 'kuery', - query: '"null"', - }, - }, - }, - outcome: 'exactMatch', - }); - - const response = await getSavedQuery('food'); - expect(response.attributes.query.query).toEqual('"null"'); - }); - - it('should not lose quotes', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'food', - attributes: { - title: 'food', - description: 'bar', - query: { - language: 'kuery', - query: '"Bob"', - }, - }, - }, - outcome: 'exactMatch', - }); - - const response = await getSavedQuery('food'); - expect(response.attributes.query.query).toEqual('"Bob"'); - }); - - it('should throw if conflict', async () => { - mockSavedObjectsClient.resolve.mockReturnValue({ - saved_object: { - id: 'foo', - attributes: savedQueryAttributes, - }, - outcome: 'conflict', - }); - - const result = getSavedQuery('food'); - expect(result).rejects.toMatchInlineSnapshot( - `[Error: Multiple saved queries found with ID: food (legacy URL alias conflict)]` - ); + it('should get the given ID', async () => { + await getSavedQuery('my_id'); + expect(http.get).toBeCalled(); + expect(http.get).toHaveBeenCalledWith('/api/saved_query/my_id'); }); }); describe('deleteSavedQuery', function () { - it('should delete the saved query for the given ID', async () => { - await deleteSavedQuery('foo'); - expect(mockSavedObjectsClient.delete).toHaveBeenCalledWith('query', 'foo'); - }); - }); - - describe('getAllSavedQueries', function () { - it('should return all the saved queries', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - savedObjects: [{ id: 'foo', attributes: savedQueryAttributes }], - }); - const response = await getAllSavedQueries(); - expect(response).toEqual( - expect.objectContaining([ - { - attributes: { - description: 'bar', - query: { language: 'kuery', query: 'response:200' }, - title: 'foo', - }, - id: 'foo', - }, - ]) - ); - expect(mockSavedObjectsClient.find).toHaveBeenCalledWith({ - page: 1, - perPage: 0, - type: 'query', - }); + it('should delete the given ID', async () => { + await deleteSavedQuery('my_id'); + expect(http.delete).toBeCalled(); + expect(http.delete).toHaveBeenCalledWith('/api/saved_query/my_id'); }); }); describe('getSavedQueryCount', function () { - it('should return the total number of saved queries', async () => { - mockSavedObjectsClient.find.mockReturnValue({ - total: 1, - }); - const response = await getSavedQueryCount(); - expect(response).toEqual(1); + it('should get the total', async () => { + await getSavedQueryCount(); + expect(http.get).toBeCalled(); + expect(http.get).toHaveBeenCalledWith('/api/saved_query/_count'); }); }); }); diff --git a/src/plugins/data/public/query/saved_query/saved_query_service.ts b/src/plugins/data/public/query/saved_query/saved_query_service.ts index 89a357a66d370..8ec9167a3a0c2 100644 --- a/src/plugins/data/public/query/saved_query/saved_query_service.ts +++ b/src/plugins/data/public/query/saved_query/saved_query_service.ts @@ -6,163 +6,61 @@ * Side Public License, v 1. */ -import { isObject } from 'lodash'; -import { SavedObjectsClientContract, SavedObjectAttributes } from 'src/core/public'; -import { SavedQueryAttributes, SavedQuery, SavedQueryService } from './types'; - -type SerializedSavedQueryAttributes = SavedObjectAttributes & - SavedQueryAttributes & { - query: { - query: string; - language: string; - }; +import { HttpStart } from 'src/core/public'; +import { SavedQuery } from './types'; +import { SavedQueryAttributes } from '../../../common'; + +export const createSavedQueryService = (http: HttpStart) => { + const createQuery = async (attributes: SavedQueryAttributes, { overwrite = false } = {}) => { + const savedQuery = await http.post('/api/saved_query/_create', { + body: JSON.stringify(attributes), + }); + return savedQuery; }; -export const createSavedQueryService = ( - savedObjectsClient: SavedObjectsClientContract -): SavedQueryService => { - const saveQuery = async (attributes: SavedQueryAttributes, { overwrite = false } = {}) => { - if (!attributes.title.length) { - // title is required extra check against circumventing the front end - throw new Error('Cannot create saved query without a title'); - } - - const query = { - query: - typeof attributes.query.query === 'string' - ? attributes.query.query - : JSON.stringify(attributes.query.query), - language: attributes.query.language, - }; - - const queryObject: SerializedSavedQueryAttributes = { - title: attributes.title.trim(), // trim whitespace before save as an extra precaution against circumventing the front end - description: attributes.description, - query, - }; - - if (attributes.filters) { - queryObject.filters = attributes.filters; - } - - if (attributes.timefilter) { - queryObject.timefilter = attributes.timefilter; - } - - let rawQueryResponse; - if (!overwrite) { - rawQueryResponse = await savedObjectsClient.create('query', queryObject, { - id: attributes.title, - }); - } else { - rawQueryResponse = await savedObjectsClient.create('query', queryObject, { - id: attributes.title, - overwrite: true, - }); - } - - if (rawQueryResponse.error) { - throw new Error(rawQueryResponse.error.message); - } - - return parseSavedQueryObject(rawQueryResponse); + const updateQuery = async (id: string, attributes: SavedQueryAttributes) => { + const savedQuery = await http.put(`/api/saved_query/${id}`, { + body: JSON.stringify(attributes), + }); + return savedQuery; }; + // we have to tell the saved objects client how many to fetch, otherwise it defaults to fetching 20 per page const getAllSavedQueries = async (): Promise => { - const count = await getSavedQueryCount(); - const response = await savedObjectsClient.find({ - type: 'query', - perPage: count, - page: 1, + const { savedQueries } = await http.post('/api/saved_query/_find', { + body: JSON.stringify({ perPage: 10000 }), }); - return response.savedObjects.map( - (savedObject: { id: string; attributes: SerializedSavedQueryAttributes }) => - parseSavedQueryObject(savedObject) - ); + return savedQueries; }; + // findSavedQueries will do a 'match_all' if no search string is passed in const findSavedQueries = async ( - searchText: string = '', + search: string = '', perPage: number = 50, - activePage: number = 1 + page: number = 1 ): Promise<{ total: number; queries: SavedQuery[] }> => { - const response = await savedObjectsClient.find({ - type: 'query', - search: searchText, - searchFields: ['title^5', 'description'], - sortField: '_score', - perPage, - page: activePage, + const { total, savedQueries: queries } = await http.post('/api/saved_query/_find', { + body: JSON.stringify({ page, perPage, search }), }); - return { - total: response.total, - queries: response.savedObjects.map( - (savedObject: { id: string; attributes: SerializedSavedQueryAttributes }) => - parseSavedQueryObject(savedObject) - ), - }; - }; - - const getSavedQuery = async (id: string): Promise => { - const { saved_object: savedObject, outcome } = - await savedObjectsClient.resolve('query', id); - if (outcome === 'conflict') { - throw new Error(`Multiple saved queries found with ID: ${id} (legacy URL alias conflict)`); - } else if (savedObject.error) { - throw new Error(savedObject.error.message); - } - return parseSavedQueryObject(savedObject); + return { total, queries }; }; - const deleteSavedQuery = async (id: string) => { - return await savedObjectsClient.delete('query', id); + const getSavedQuery = (id: string): Promise => { + return http.get(`/api/saved_query/${id}`); }; - const parseSavedQueryObject = (savedQuery: { - id: string; - attributes: SerializedSavedQueryAttributes; - }) => { - let queryString: string | object = savedQuery.attributes.query.query; - - try { - const parsedQueryString: object = JSON.parse(savedQuery.attributes.query.query); - if (isObject(parsedQueryString)) { - queryString = parsedQueryString; - } - } catch (e) {} // eslint-disable-line no-empty - - const savedQueryItems: SavedQueryAttributes = { - title: savedQuery.attributes.title || '', - description: savedQuery.attributes.description || '', - query: { - query: queryString, - language: savedQuery.attributes.query.language, - }, - }; - if (savedQuery.attributes.filters) { - savedQueryItems.filters = savedQuery.attributes.filters; - } - if (savedQuery.attributes.timefilter) { - savedQueryItems.timefilter = savedQuery.attributes.timefilter; - } - return { - id: savedQuery.id, - attributes: savedQueryItems, - }; + const deleteSavedQuery = (id: string) => { + return http.delete(`/api/saved_query/${id}`); }; const getSavedQueryCount = async (): Promise => { - const response = await savedObjectsClient.find({ - type: 'query', - perPage: 0, - page: 1, - }); - return response.total; + return http.get('/api/saved_query/_count'); }; return { - saveQuery, + createQuery, + updateQuery, getAllSavedQueries, findSavedQueries, getSavedQuery, diff --git a/src/plugins/data/public/query/saved_query/types.ts b/src/plugins/data/public/query/saved_query/types.ts index bd53bb7d77b30..0f1763433e72a 100644 --- a/src/plugins/data/public/query/saved_query/types.ts +++ b/src/plugins/data/public/query/saved_query/types.ts @@ -26,10 +26,8 @@ export interface SavedQueryAttributes { } export interface SavedQueryService { - saveQuery: ( - attributes: SavedQueryAttributes, - config?: { overwrite: boolean } - ) => Promise; + createQuery: (attributes: SavedQueryAttributes) => Promise; + updateQuery: (id: string, attributes: SavedQueryAttributes) => Promise; getAllSavedQueries: () => Promise; findSavedQueries: ( searchText?: string, diff --git a/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts b/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts index b4ec4934233d0..857a932d9157b 100644 --- a/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts +++ b/src/plugins/data/public/query/state_sync/connect_to_query_state.test.ts @@ -74,7 +74,7 @@ describe('connect_to_global_state', () => { queryServiceStart = queryService.start({ uiSettings: setupMock.uiSettings, storage: new Storage(new StubBrowserStorage()), - savedObjectsClient: startMock.savedObjects.client, + http: startMock.http, }); filterManager = queryServiceStart.filterManager; timeFilter = queryServiceStart.timefilter.timefilter; @@ -308,7 +308,7 @@ describe('connect_to_app_state', () => { queryServiceStart = queryService.start({ uiSettings: setupMock.uiSettings, storage: new Storage(new StubBrowserStorage()), - savedObjectsClient: startMock.savedObjects.client, + http: startMock.http, }); filterManager = queryServiceStart.filterManager; @@ -487,7 +487,7 @@ describe('filters with different state', () => { queryServiceStart = queryService.start({ uiSettings: setupMock.uiSettings, storage: new Storage(new StubBrowserStorage()), - savedObjectsClient: startMock.savedObjects.client, + http: startMock.http, }); filterManager = queryServiceStart.filterManager; diff --git a/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts b/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts index 73f78eb98968d..2e48a11efd69c 100644 --- a/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts +++ b/src/plugins/data/public/query/state_sync/sync_state_with_url.test.ts @@ -68,7 +68,7 @@ describe('sync_query_state_with_url', () => { queryServiceStart = queryService.start({ uiSettings: startMock.uiSettings, storage: new Storage(new StubBrowserStorage()), - savedObjectsClient: startMock.savedObjects.client, + http: startMock.http, }); filterManager = queryServiceStart.filterManager; timefilter = queryServiceStart.timefilter.timefilter; diff --git a/src/plugins/data/public/search/fetch/handle_response.test.ts b/src/plugins/data/public/search/fetch/handle_response.test.ts index 1a430f860f438..aca3d3e35073c 100644 --- a/src/plugins/data/public/search/fetch/handle_response.test.ts +++ b/src/plugins/data/public/search/fetch/handle_response.test.ts @@ -14,14 +14,6 @@ import { notificationServiceMock } from '../../../../../core/public/notification import { setNotifications } from '../../services'; import { IKibanaSearchResponse } from 'src/plugins/data/common'; -jest.mock('@kbn/i18n', () => { - return { - i18n: { - translate: (id: string, { defaultMessage }: { defaultMessage: string }) => defaultMessage, - }, - }; -}); - describe('handleResponse', () => { const notifications = notificationServiceMock.createStartContract(); @@ -73,4 +65,29 @@ describe('handleResponse', () => { const result = handleResponse(request, response); expect(result).toBe(response); }); + + test('should notify if has warning', () => { + const request = { body: {} }; + const response = { + rawResponse: {}, + warning: 'a warning', + } as IKibanaSearchResponse; + const result = handleResponse(request, response); + expect(result).toBe(response); + expect(notifications.toasts.addWarning).toBeCalledWith( + expect.objectContaining({ title: expect.stringContaining(response.warning!) }) + ); + }); + + test("shouldn't notify on warning about disabled security", () => { + const request = { body: {} }; + const response = { + rawResponse: {}, + warning: + '299 Elasticsearch-7.16.0-SNAPSHOT-3e6393bc4ec8f0000b1bcd4371b2e607eb02a1d7 "Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.16/security-minimal-setup.html to enable security."', + } as IKibanaSearchResponse; + const result = handleResponse(request, response); + expect(result).toBe(response); + expect(notifications.toasts.addWarning).not.toBeCalled(); + }); }); diff --git a/src/plugins/data/public/search/fetch/handle_response.tsx b/src/plugins/data/public/search/fetch/handle_response.tsx index f4acebfb36060..c82479bcbfea9 100644 --- a/src/plugins/data/public/search/fetch/handle_response.tsx +++ b/src/plugins/data/public/search/fetch/handle_response.tsx @@ -17,7 +17,7 @@ import { SearchRequest } from '..'; export function handleResponse(request: SearchRequest, response: IKibanaSearchResponse) { const { rawResponse, warning } = response; - if (warning) { + if (warning && !shouldIgnoreWarning(warning)) { getNotifications().toasts.addWarning({ title: i18n.translate('data.search.searchSource.fetch.warningMessage', { defaultMessage: 'Warning: {warning}', @@ -64,3 +64,10 @@ export function handleResponse(request: SearchRequest, response: IKibanaSearchRe return response; } + +function shouldIgnoreWarning(warning: string): boolean { + // https://github.com/elastic/kibana/issues/115632 + if (warning.includes('Elasticsearch built-in security features are not enabled')) return true; + + return false; +} diff --git a/src/plugins/data/public/ui/saved_query_form/save_query_form.tsx b/src/plugins/data/public/ui/saved_query_form/save_query_form.tsx index d0221658f3e08..c7a79658fac88 100644 --- a/src/plugins/data/public/ui/saved_query_form/save_query_form.tsx +++ b/src/plugins/data/public/ui/saved_query_form/save_query_form.tsx @@ -24,10 +24,9 @@ import { import { i18n } from '@kbn/i18n'; import { sortBy, isEqual } from 'lodash'; import { SavedQuery, SavedQueryService } from '../..'; -import { SavedQueryAttributes } from '../../query'; interface Props { - savedQuery?: SavedQueryAttributes; + savedQuery?: SavedQuery; savedQueryService: SavedQueryService; onSave: (savedQueryMeta: SavedQueryMeta) => void; onClose: () => void; @@ -36,6 +35,7 @@ interface Props { } export interface SavedQueryMeta { + id?: string; title: string; description: string; shouldIncludeFilters: boolean; @@ -50,18 +50,18 @@ export function SaveQueryForm({ showFilterOption = true, showTimeFilterOption = true, }: Props) { - const [title, setTitle] = useState(savedQuery ? savedQuery.title : ''); + const [title, setTitle] = useState(savedQuery?.attributes.title ?? ''); const [enabledSaveButton, setEnabledSaveButton] = useState(Boolean(savedQuery)); - const [description, setDescription] = useState(savedQuery ? savedQuery.description : ''); + const [description, setDescription] = useState(savedQuery?.attributes.description ?? ''); const [savedQueries, setSavedQueries] = useState([]); const [shouldIncludeFilters, setShouldIncludeFilters] = useState( - savedQuery ? !!savedQuery.filters : true + Boolean(savedQuery?.attributes.filters ?? true) ); // Defaults to false because saved queries are meant to be as portable as possible and loading // a saved query with a time filter will override whatever the current value of the global timepicker // is. We expect this option to be used rarely and only when the user knows they want this behavior. const [shouldIncludeTimefilter, setIncludeTimefilter] = useState( - savedQuery ? !!savedQuery.timefilter : false + Boolean(savedQuery?.attributes.timefilter ?? false) ); const [formErrors, setFormErrors] = useState([]); @@ -82,7 +82,7 @@ export function SaveQueryForm({ useEffect(() => { const fetchQueries = async () => { const allSavedQueries = await savedQueryService.getAllSavedQueries(); - const sortedAllSavedQueries = sortBy(allSavedQueries, 'attributes.title') as SavedQuery[]; + const sortedAllSavedQueries = sortBy(allSavedQueries, 'attributes.title'); setSavedQueries(sortedAllSavedQueries); }; fetchQueries(); @@ -109,13 +109,22 @@ export function SaveQueryForm({ const onClickSave = useCallback(() => { if (validate()) { onSave({ + id: savedQuery?.id, title, description, shouldIncludeFilters, shouldIncludeTimefilter, }); } - }, [validate, onSave, title, description, shouldIncludeFilters, shouldIncludeTimefilter]); + }, [ + validate, + onSave, + savedQuery?.id, + title, + description, + shouldIncludeFilters, + shouldIncludeTimefilter, + ]); const onInputChange = useCallback((event) => { setEnabledSaveButton(Boolean(event.target.value)); diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index db0bebf97578b..bd48dcd6cd34c 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -245,11 +245,12 @@ class SearchBarUI extends Component { try { let response; if (this.props.savedQuery && !saveAsNew) { - response = await this.savedQueryService.saveQuery(savedQueryAttributes, { - overwrite: true, - }); + response = await this.savedQueryService.updateQuery( + savedQueryMeta.id!, + savedQueryAttributes + ); } else { - response = await this.savedQueryService.saveQuery(savedQueryAttributes); + response = await this.savedQueryService.createQuery(savedQueryAttributes); } this.services.notifications.toasts.addSuccess( @@ -423,7 +424,7 @@ class SearchBarUI extends Component { {this.state.showSaveQueryModal ? ( this.setState({ showSaveQueryModal: false })} diff --git a/src/plugins/data/server/query/query_service.ts b/src/plugins/data/server/query/query_service.ts index 9e67f0ab825df..173abeda0c951 100644 --- a/src/plugins/data/server/query/query_service.ts +++ b/src/plugins/data/server/query/query_service.ts @@ -8,24 +8,27 @@ import { CoreSetup, Plugin } from 'kibana/server'; import { querySavedObjectType } from '../saved_objects'; +import { extract, getAllMigrations, inject, telemetry } from '../../common/query/persistable_state'; +import { registerSavedQueryRoutes } from './routes'; import { - extract, - inject, - telemetry, - migrateToLatest, - getAllMigrations, -} from '../../common/query/persistable_state'; + registerSavedQueryRouteHandlerContext, + SavedQueryRouteHandlerContext, +} from './route_handler_context'; export class QueryService implements Plugin { public setup(core: CoreSetup) { core.savedObjects.registerType(querySavedObjectType); + core.http.registerRouteHandlerContext( + 'savedQuery', + registerSavedQueryRouteHandlerContext + ); + registerSavedQueryRoutes(core); return { filterManager: { extract, inject, telemetry, - migrateToLatest, getAllMigrations, }, }; diff --git a/src/plugins/data/server/query/route_handler_context.test.ts b/src/plugins/data/server/query/route_handler_context.test.ts new file mode 100644 index 0000000000000..cc7686a06cb67 --- /dev/null +++ b/src/plugins/data/server/query/route_handler_context.test.ts @@ -0,0 +1,566 @@ +/* + * Copyright 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 { coreMock } from '../../../../core/server/mocks'; +import { + DATA_VIEW_SAVED_OBJECT_TYPE, + FilterStateStore, + SavedObject, + SavedQueryAttributes, +} from '../../common'; +import { registerSavedQueryRouteHandlerContext } from './route_handler_context'; +import { SavedObjectsFindResponse, SavedObjectsUpdateResponse } from 'kibana/server'; + +const mockContext = { + core: coreMock.createRequestHandlerContext(), +}; +const { + core: { + savedObjects: { client: mockSavedObjectsClient }, + }, +} = mockContext; +const context = registerSavedQueryRouteHandlerContext(mockContext); + +const savedQueryAttributes: SavedQueryAttributes = { + title: 'foo', + description: 'bar', + query: { + language: 'kuery', + query: 'response:200', + }, + filters: [], +}; +const savedQueryAttributesBar: SavedQueryAttributes = { + title: 'bar', + description: 'baz', + query: { + language: 'kuery', + query: 'response:200', + }, +}; + +const savedQueryAttributesWithFilters: SavedQueryAttributes = { + ...savedQueryAttributes, + filters: [ + { + query: { match_all: {} }, + $state: { store: FilterStateStore.APP_STATE }, + meta: { + index: 'my-index', + disabled: false, + negate: false, + alias: null, + }, + }, + ], + timefilter: { + to: 'now', + from: 'now-15m', + refreshInterval: { + pause: false, + value: 0, + }, + }, +}; + +const savedQueryReferences = [ + { + type: DATA_VIEW_SAVED_OBJECT_TYPE, + name: 'my-index', + id: 'my-index', + }, +]; + +describe('saved query route handler context', () => { + beforeEach(() => { + mockSavedObjectsClient.create.mockClear(); + mockSavedObjectsClient.resolve.mockClear(); + mockSavedObjectsClient.find.mockClear(); + mockSavedObjectsClient.delete.mockClear(); + }); + + describe('create', function () { + it('should create a saved object for the given attributes', async () => { + const mockResponse: SavedObject = { + id: 'foo', + type: 'query', + attributes: savedQueryAttributes, + references: [], + }; + mockSavedObjectsClient.create.mockResolvedValue(mockResponse); + + const response = await context.create(savedQueryAttributes); + + expect(mockSavedObjectsClient.create).toHaveBeenCalledWith('query', savedQueryAttributes, { + references: [], + }); + expect(response).toEqual({ + id: 'foo', + attributes: savedQueryAttributes, + }); + }); + + it('should optionally accept query in object format', async () => { + const savedQueryAttributesWithQueryObject: SavedQueryAttributes = { + ...savedQueryAttributes, + query: { + language: 'lucene', + query: { match_all: {} }, + }, + }; + const mockResponse: SavedObject = { + id: 'foo', + type: 'query', + attributes: savedQueryAttributesWithQueryObject, + references: [], + }; + mockSavedObjectsClient.create.mockResolvedValue(mockResponse); + + const { attributes } = await context.create(savedQueryAttributesWithQueryObject); + + expect(attributes).toEqual(savedQueryAttributesWithQueryObject); + }); + + it('should optionally accept filters and timefilters in object format', async () => { + const serializedSavedQueryAttributesWithFilters = { + ...savedQueryAttributesWithFilters, + filters: savedQueryAttributesWithFilters.filters, + timefilter: savedQueryAttributesWithFilters.timefilter, + }; + const mockResponse: SavedObject = { + id: 'foo', + type: 'query', + attributes: serializedSavedQueryAttributesWithFilters, + references: [], + }; + mockSavedObjectsClient.create.mockResolvedValue(mockResponse); + + await context.create(savedQueryAttributesWithFilters); + + const [[type, attributes]] = mockSavedObjectsClient.create.mock.calls; + const { filters = [], timefilter } = attributes as SavedQueryAttributes; + expect(type).toEqual('query'); + expect(filters.length).toBe(1); + expect(timefilter).toEqual(savedQueryAttributesWithFilters.timefilter); + }); + + it('should throw an error when saved objects client returns error', async () => { + mockSavedObjectsClient.create.mockResolvedValue({ + error: { + error: '123', + message: 'An Error', + }, + } as SavedObject); + + const response = context.create(savedQueryAttributes); + + expect(response).rejects.toMatchInlineSnapshot(`[Error: An Error]`); + }); + + it('should throw an error if the saved query does not have a title', async () => { + const response = context.create({ ...savedQueryAttributes, title: '' }); + expect(response).rejects.toMatchInlineSnapshot( + `[Error: Cannot create saved query without a title]` + ); + }); + }); + + describe('update', function () { + it('should update a saved object for the given attributes', async () => { + const mockResponse: SavedObject = { + id: 'foo', + type: 'query', + attributes: savedQueryAttributes, + references: [], + }; + mockSavedObjectsClient.update.mockResolvedValue(mockResponse); + + const response = await context.update('foo', savedQueryAttributes); + + expect(mockSavedObjectsClient.update).toHaveBeenCalledWith( + 'query', + 'foo', + savedQueryAttributes, + { + references: [], + } + ); + expect(response).toEqual({ + id: 'foo', + attributes: savedQueryAttributes, + }); + }); + + it('should throw an error when saved objects client returns error', async () => { + mockSavedObjectsClient.update.mockResolvedValue({ + error: { + error: '123', + message: 'An Error', + }, + } as SavedObjectsUpdateResponse); + + const response = context.update('foo', savedQueryAttributes); + + expect(response).rejects.toMatchInlineSnapshot(`[Error: An Error]`); + }); + + it('should throw an error if the saved query does not have a title', async () => { + const response = context.create({ ...savedQueryAttributes, title: '' }); + expect(response).rejects.toMatchInlineSnapshot( + `[Error: Cannot create saved query without a title]` + ); + }); + }); + + describe('find', function () { + it('should find and return saved queries without search text or pagination parameters', async () => { + const mockResponse: SavedObjectsFindResponse = { + page: 0, + per_page: 0, + saved_objects: [ + { + id: 'foo', + type: 'query', + score: 0, + attributes: savedQueryAttributes, + references: [], + }, + ], + total: 5, + }; + mockSavedObjectsClient.find.mockResolvedValue(mockResponse); + + const response = await context.find(); + + expect(response.savedQueries).toEqual([{ id: 'foo', attributes: savedQueryAttributes }]); + }); + + it('should return the total count along with the requested queries', async () => { + const mockResponse: SavedObjectsFindResponse = { + page: 0, + per_page: 0, + saved_objects: [ + { id: 'foo', type: 'query', score: 0, attributes: savedQueryAttributes, references: [] }, + ], + total: 5, + }; + mockSavedObjectsClient.find.mockResolvedValue(mockResponse); + + const response = await context.find(); + + expect(response.total).toEqual(5); + }); + + it('should find and return saved queries with search text matching the title field', async () => { + const mockResponse: SavedObjectsFindResponse = { + page: 0, + per_page: 0, + saved_objects: [ + { id: 'foo', type: 'query', score: 0, attributes: savedQueryAttributes, references: [] }, + ], + total: 5, + }; + mockSavedObjectsClient.find.mockResolvedValue(mockResponse); + + const response = await context.find({ search: 'foo' }); + + expect(mockSavedObjectsClient.find).toHaveBeenCalledWith({ + page: 1, + perPage: 50, + search: 'foo', + type: 'query', + }); + expect(response.savedQueries).toEqual([{ id: 'foo', attributes: savedQueryAttributes }]); + }); + + it('should find and return parsed filters and timefilters items', async () => { + const mockResponse: SavedObjectsFindResponse = { + page: 0, + per_page: 0, + saved_objects: [ + { + id: 'foo', + type: 'query', + score: 0, + attributes: savedQueryAttributesWithFilters, + references: savedQueryReferences, + }, + ], + total: 5, + }; + mockSavedObjectsClient.find.mockResolvedValue(mockResponse); + + const response = await context.find({ search: 'bar' }); + + expect(response.savedQueries).toEqual([ + { id: 'foo', attributes: savedQueryAttributesWithFilters }, + ]); + }); + + it('should return an array of saved queries', async () => { + const mockResponse: SavedObjectsFindResponse = { + page: 0, + per_page: 0, + saved_objects: [ + { id: 'foo', type: 'query', score: 0, attributes: savedQueryAttributes, references: [] }, + ], + total: 5, + }; + mockSavedObjectsClient.find.mockResolvedValue(mockResponse); + + const response = await context.find(); + + expect(response.savedQueries).toEqual( + expect.objectContaining([ + { + attributes: { + description: 'bar', + query: { language: 'kuery', query: 'response:200' }, + filters: [], + title: 'foo', + }, + id: 'foo', + }, + ]) + ); + }); + + it('should accept perPage and page properties', async () => { + const mockResponse: SavedObjectsFindResponse = { + page: 0, + per_page: 0, + saved_objects: [ + { id: 'foo', type: 'query', score: 0, attributes: savedQueryAttributes, references: [] }, + { + id: 'bar', + type: 'query', + score: 0, + attributes: savedQueryAttributesBar, + references: [], + }, + ], + total: 5, + }; + mockSavedObjectsClient.find.mockResolvedValue(mockResponse); + + const response = await context.find({ + page: 1, + perPage: 2, + }); + + expect(mockSavedObjectsClient.find).toHaveBeenCalledWith({ + page: 1, + perPage: 2, + search: '', + type: 'query', + }); + expect(response.savedQueries).toEqual( + expect.objectContaining([ + { + attributes: { + description: 'bar', + query: { language: 'kuery', query: 'response:200' }, + filters: [], + title: 'foo', + }, + id: 'foo', + }, + { + attributes: { + description: 'baz', + query: { language: 'kuery', query: 'response:200' }, + filters: [], + title: 'bar', + }, + id: 'bar', + }, + ]) + ); + }); + }); + + describe('get', function () { + it('should retrieve a saved query by id', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'foo', + type: 'query', + attributes: savedQueryAttributes, + references: [], + }, + outcome: 'exactMatch', + }); + + const response = await context.get('foo'); + expect(response).toEqual({ id: 'foo', attributes: savedQueryAttributes }); + }); + + it('should only return saved queries', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'foo', + type: 'query', + attributes: savedQueryAttributes, + references: [], + }, + outcome: 'exactMatch', + }); + + await context.get('foo'); + expect(mockSavedObjectsClient.resolve).toHaveBeenCalledWith('query', 'foo'); + }); + + it('should parse a json query', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'food', + type: 'query', + attributes: { + title: 'food', + description: 'bar', + query: { + language: 'kuery', + query: '{"x": "y"}', + }, + }, + references: [], + }, + outcome: 'exactMatch', + }); + + const response = await context.get('food'); + expect(response.attributes.query.query).toEqual({ x: 'y' }); + }); + + it('should handle null string', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'food', + type: 'query', + attributes: { + title: 'food', + description: 'bar', + query: { + language: 'kuery', + query: 'null', + }, + }, + references: [], + }, + outcome: 'exactMatch', + }); + + const response = await context.get('food'); + expect(response.attributes.query.query).toEqual('null'); + }); + + it('should handle null quoted string', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'food', + type: 'query', + attributes: { + title: 'food', + description: 'bar', + query: { + language: 'kuery', + query: '"null"', + }, + }, + references: [], + }, + outcome: 'exactMatch', + }); + + const response = await context.get('food'); + expect(response.attributes.query.query).toEqual('"null"'); + }); + + it('should not lose quotes', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'food', + type: 'query', + attributes: { + title: 'food', + description: 'bar', + query: { + language: 'kuery', + query: '"Bob"', + }, + }, + references: [], + }, + outcome: 'exactMatch', + }); + + const response = await context.get('food'); + expect(response.attributes.query.query).toEqual('"Bob"'); + }); + + it('should inject references', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'food', + type: 'query', + attributes: savedQueryAttributesWithFilters, + references: [ + { + id: 'my-new-index', + type: DATA_VIEW_SAVED_OBJECT_TYPE, + name: 'my-index', + }, + ], + }, + outcome: 'exactMatch', + }); + + const response = await context.get('food'); + expect(response.attributes.filters[0].meta.index).toBe('my-new-index'); + }); + + it('should throw if conflict', async () => { + mockSavedObjectsClient.resolve.mockResolvedValue({ + saved_object: { + id: 'foo', + type: 'query', + attributes: savedQueryAttributes, + references: [], + }, + outcome: 'conflict', + }); + + const result = context.get('food'); + expect(result).rejects.toMatchInlineSnapshot( + `[Error: Multiple saved queries found with ID: food (legacy URL alias conflict)]` + ); + }); + }); + + describe('delete', function () { + it('should delete the saved query for the given ID', async () => { + await context.delete('foo'); + expect(mockSavedObjectsClient.delete).toHaveBeenCalledWith('query', 'foo'); + }); + }); + + describe('count', function () { + it('should return the total number of saved queries', async () => { + mockSavedObjectsClient.find.mockResolvedValue({ + total: 1, + page: 0, + per_page: 0, + saved_objects: [], + }); + + const response = await context.count(); + + expect(response).toEqual(1); + }); + }); +}); diff --git a/src/plugins/data/server/query/route_handler_context.ts b/src/plugins/data/server/query/route_handler_context.ts new file mode 100644 index 0000000000000..3c60b33559b72 --- /dev/null +++ b/src/plugins/data/server/query/route_handler_context.ts @@ -0,0 +1,155 @@ +/* + * Copyright 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 { RequestHandlerContext, SavedObject } from 'kibana/server'; +import { isFilters } from '@kbn/es-query'; +import { isQuery, SavedQueryAttributes } from '../../common'; +import { extract, inject } from '../../common/query/persistable_state'; + +function injectReferences({ + id, + attributes, + references, +}: Pick, 'id' | 'attributes' | 'references'>) { + const { query } = attributes; + if (typeof query.query === 'string') { + try { + const parsed = JSON.parse(query.query); + query.query = parsed instanceof Object ? parsed : query.query; + } catch (e) { + // Just keep it as a string + } + } + const filters = inject(attributes.filters ?? [], references); + return { id, attributes: { ...attributes, filters } }; +} + +function extractReferences({ + title, + description, + query, + filters = [], + timefilter, +}: SavedQueryAttributes) { + const { state: extractedFilters, references } = extract(filters); + + const attributes: SavedQueryAttributes = { + title: title.trim(), + description: description.trim(), + query: { + ...query, + query: typeof query.query === 'string' ? query.query : JSON.stringify(query.query), + }, + filters: extractedFilters, + ...(timefilter && { timefilter }), + }; + + return { attributes, references }; +} + +function verifySavedQuery({ title, query, filters = [] }: SavedQueryAttributes) { + if (!isQuery(query)) { + throw new Error(`Invalid query: ${query}`); + } + + if (!isFilters(filters)) { + throw new Error(`Invalid filters: ${filters}`); + } + + if (!title.trim().length) { + throw new Error('Cannot create saved query without a title'); + } +} + +export function registerSavedQueryRouteHandlerContext(context: RequestHandlerContext) { + const createSavedQuery = async (attrs: SavedQueryAttributes) => { + verifySavedQuery(attrs); + const { attributes, references } = extractReferences(attrs); + + const savedObject = await context.core.savedObjects.client.create( + 'query', + attributes, + { + references, + } + ); + + // TODO: Handle properly + if (savedObject.error) throw new Error(savedObject.error.message); + + return injectReferences(savedObject); + }; + + const updateSavedQuery = async (id: string, attrs: SavedQueryAttributes) => { + verifySavedQuery(attrs); + const { attributes, references } = extractReferences(attrs); + + const savedObject = await context.core.savedObjects.client.update( + 'query', + id, + attributes, + { + references, + } + ); + + // TODO: Handle properly + if (savedObject.error) throw new Error(savedObject.error.message); + + return injectReferences({ id, attributes, references }); + }; + + const getSavedQuery = async (id: string) => { + const { saved_object: savedObject, outcome } = + await context.core.savedObjects.client.resolve('query', id); + if (outcome === 'conflict') { + throw new Error(`Multiple saved queries found with ID: ${id} (legacy URL alias conflict)`); + } else if (savedObject.error) { + throw new Error(savedObject.error.message); + } + return injectReferences(savedObject); + }; + + const getSavedQueriesCount = async () => { + const { total } = await context.core.savedObjects.client.find({ + type: 'query', + }); + return total; + }; + + const findSavedQueries = async ({ page = 1, perPage = 50, search = '' } = {}) => { + const { total, saved_objects: savedObjects } = + await context.core.savedObjects.client.find({ + type: 'query', + page, + perPage, + search, + }); + + const savedQueries = savedObjects.map(injectReferences); + + return { total, savedQueries }; + }; + + const deleteSavedQuery = (id: string) => { + return context.core.savedObjects.client.delete('query', id); + }; + + return { + create: createSavedQuery, + update: updateSavedQuery, + get: getSavedQuery, + count: getSavedQueriesCount, + find: findSavedQueries, + delete: deleteSavedQuery, + }; +} + +export interface SavedQueryRouteHandlerContext extends RequestHandlerContext { + savedQuery: ReturnType; +} diff --git a/src/plugins/data/server/query/routes.ts b/src/plugins/data/server/query/routes.ts new file mode 100644 index 0000000000000..cdf9e6f43dccc --- /dev/null +++ b/src/plugins/data/server/query/routes.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { schema } from '@kbn/config-schema'; +import { CoreSetup } from 'kibana/server'; +import { SavedQueryRouteHandlerContext } from './route_handler_context'; + +const SAVED_QUERY_PATH = '/api/saved_query'; +const SAVED_QUERY_ID_CONFIG = schema.object({ + id: schema.string(), +}); +const SAVED_QUERY_ATTRS_CONFIG = schema.object({ + title: schema.string(), + description: schema.string(), + query: schema.object({ + query: schema.oneOf([schema.string(), schema.object({}, { unknowns: 'allow' })]), + language: schema.string(), + }), + filters: schema.maybe(schema.arrayOf(schema.any())), + timefilter: schema.maybe(schema.any()), +}); + +export function registerSavedQueryRoutes({ http }: CoreSetup): void { + const router = http.createRouter(); + + router.post( + { + path: `${SAVED_QUERY_PATH}/_create`, + validate: { + body: SAVED_QUERY_ATTRS_CONFIG, + }, + }, + async (context, request, response) => { + try { + const body = await context.savedQuery.create(request.body); + return response.ok({ body }); + } catch (e) { + // TODO: Handle properly + return response.customError(e); + } + } + ); + + router.put( + { + path: `${SAVED_QUERY_PATH}/{id}`, + validate: { + params: SAVED_QUERY_ID_CONFIG, + body: SAVED_QUERY_ATTRS_CONFIG, + }, + }, + async (context, request, response) => { + const { id } = request.params; + try { + const body = await context.savedQuery.update(id, request.body); + return response.ok({ body }); + } catch (e) { + // TODO: Handle properly + return response.customError(e); + } + } + ); + + router.get( + { + path: `${SAVED_QUERY_PATH}/{id}`, + validate: { + params: SAVED_QUERY_ID_CONFIG, + }, + }, + async (context, request, response) => { + const { id } = request.params; + try { + const body = await context.savedQuery.get(id); + return response.ok({ body }); + } catch (e) { + // TODO: Handle properly + return response.customError(e); + } + } + ); + + router.get( + { + path: `${SAVED_QUERY_PATH}/_count`, + validate: {}, + }, + async (context, request, response) => { + try { + const count = await context.savedQuery.count(); + return response.ok({ body: `${count}` }); + } catch (e) { + // TODO: Handle properly + return response.customError(e); + } + } + ); + + router.post( + { + path: `${SAVED_QUERY_PATH}/_find`, + validate: { + body: schema.object({ + search: schema.string({ defaultValue: '' }), + perPage: schema.number({ defaultValue: 50 }), + page: schema.number({ defaultValue: 1 }), + }), + }, + }, + async (context, request, response) => { + try { + const body = await context.savedQuery.find(request.body); + return response.ok({ body }); + } catch (e) { + // TODO: Handle properly + return response.customError(e); + } + } + ); + + router.delete( + { + path: `${SAVED_QUERY_PATH}/{id}`, + validate: { + params: SAVED_QUERY_ID_CONFIG, + }, + }, + async (context, request, response) => { + const { id } = request.params; + try { + const body = await context.savedQuery.delete(id); + return response.ok({ body }); + } catch (e) { + // TODO: Handle properly + return response.customError(e); + } + } + ); +} diff --git a/src/plugins/data/server/saved_objects/migrations/query.ts b/src/plugins/data/server/saved_objects/migrations/query.ts new file mode 100644 index 0000000000000..9640725e3edd4 --- /dev/null +++ b/src/plugins/data/server/saved_objects/migrations/query.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 { mapValues } from 'lodash'; +import { SavedObject } from 'kibana/server'; +import { SavedQueryAttributes } from '../../../common'; +import { extract, getAllMigrations } from '../../../common/query/persistable_state'; +import { mergeMigrationFunctionMaps } from '../../../../kibana_utils/common'; + +const extractFilterReferences = (doc: SavedObject) => { + const { state: filters, references } = extract(doc.attributes.filters ?? []); + return { + ...doc, + attributes: { + ...doc.attributes, + filters, + }, + references, + }; +}; + +const filterMigrations = mapValues(getAllMigrations(), (migrate) => { + return (doc: SavedObject) => ({ + ...doc, + attributes: { + ...doc.attributes, + filters: migrate(doc.attributes.filters), + }, + }); +}); + +export const savedQueryMigrations = mergeMigrationFunctionMaps( + { + '7.16.0': extractFilterReferences, + }, + filterMigrations +); diff --git a/src/plugins/data/server/saved_objects/query.ts b/src/plugins/data/server/saved_objects/query.ts index 2e8b80cf3f080..604dd671cfd85 100644 --- a/src/plugins/data/server/saved_objects/query.ts +++ b/src/plugins/data/server/saved_objects/query.ts @@ -7,6 +7,7 @@ */ import { SavedObjectsType } from 'kibana/server'; +import { savedQueryMigrations } from './migrations/query'; export const querySavedObjectType: SavedObjectsType = { name: 'query', @@ -37,5 +38,5 @@ export const querySavedObjectType: SavedObjectsType = { timefilter: { type: 'object', enabled: false }, }, }, - migrations: {}, + migrations: savedQueryMigrations, }; diff --git a/src/plugins/dev_tools/public/application.tsx b/src/plugins/dev_tools/public/application.tsx index ef8357a5b2a56..510dabf3b32d4 100644 --- a/src/plugins/dev_tools/public/application.tsx +++ b/src/plugins/dev_tools/public/application.tsx @@ -12,6 +12,7 @@ import { HashRouter as Router, Switch, Route, Redirect } from 'react-router-dom' import { EuiTab, EuiTabs, EuiToolTip } from '@elastic/eui'; import { I18nProvider } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { euiThemeVars } from '@kbn/ui-shared-deps-src/theme'; import { ApplicationStart, ChromeStart, ScopedHistory } from 'src/core/public'; @@ -43,21 +44,22 @@ function DevToolsWrapper({ devTools, activeDevTool, updateRoute }: DevToolsWrapp return (

- + {devTools.map((currentDevTool) => ( - - { - if (!currentDevTool.isDisabled()) { - updateRoute(`/${currentDevTool.id}`); - } - }} - > - {currentDevTool.title} - - + { + if (!currentDevTool.isDisabled()) { + updateRoute(`/${currentDevTool.id}`); + } + }} + > + + {currentDevTool.title} + + ))}
+ ), + description: ( + + + + ), + }} /> ), tabs, diff --git a/src/plugins/home/server/services/sample_data/lib/register_with_integrations.ts b/src/plugins/home/server/services/sample_data/lib/register_with_integrations.ts index e33cd58910fd6..d06dcacff18d9 100644 --- a/src/plugins/home/server/services/sample_data/lib/register_with_integrations.ts +++ b/src/plugins/home/server/services/sample_data/lib/register_with_integrations.ts @@ -22,7 +22,7 @@ export function registerSampleDatasetWithIntegration( defaultMessage: 'Sample Data', }), description: i18n.translate('home.sampleData.customIntegrationsDescription', { - defaultMessage: 'Add sample data and assets to Elasticsearch and Kibana.', + defaultMessage: 'Explore data in Kibana with these one-click data sets.', }), uiInternalPath: `${HOME_APP_BASE_PATH}#/tutorial_directory/sampleData`, isBeta: false, diff --git a/src/plugins/home/server/tutorials/activemq_logs/index.ts b/src/plugins/home/server/tutorials/activemq_logs/index.ts index 64a6fa575f5b6..a277b37838562 100644 --- a/src/plugins/home/server/tutorials/activemq_logs/index.ts +++ b/src/plugins/home/server/tutorials/activemq_logs/index.ts @@ -24,12 +24,12 @@ export function activemqLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'activemqLogs', name: i18n.translate('home.tutorials.activemqLogs.nameTitle', { - defaultMessage: 'ActiveMQ logs', + defaultMessage: 'ActiveMQ Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.activemqLogs.shortDescription', { - defaultMessage: 'Collect ActiveMQ logs with Filebeat.', + defaultMessage: 'Collect and parse logs from ActiveMQ instances with Filebeat.', }), longDescription: i18n.translate('home.tutorials.activemqLogs.longDescription', { defaultMessage: 'Collect ActiveMQ logs with Filebeat. \ diff --git a/src/plugins/home/server/tutorials/activemq_metrics/index.ts b/src/plugins/home/server/tutorials/activemq_metrics/index.ts index 7a59d6d4b70d1..9a001c149cda0 100644 --- a/src/plugins/home/server/tutorials/activemq_metrics/index.ts +++ b/src/plugins/home/server/tutorials/activemq_metrics/index.ts @@ -23,16 +23,16 @@ export function activemqMetricsSpecProvider(context: TutorialContext): TutorialS return { id: 'activemqMetrics', name: i18n.translate('home.tutorials.activemqMetrics.nameTitle', { - defaultMessage: 'ActiveMQ metrics', + defaultMessage: 'ActiveMQ Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.activemqMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from ActiveMQ instances.', + defaultMessage: 'Collect metrics from ActiveMQ instances with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.activemqMetrics.longDescription', { defaultMessage: - 'The `activemq` Metricbeat module fetches monitoring metrics from ActiveMQ instances \ + 'The `activemq` Metricbeat module fetches metrics from ActiveMQ instances \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-activemq.html', diff --git a/src/plugins/home/server/tutorials/aerospike_metrics/index.ts b/src/plugins/home/server/tutorials/aerospike_metrics/index.ts index 75dd45272db69..3e574f2c75496 100644 --- a/src/plugins/home/server/tutorials/aerospike_metrics/index.ts +++ b/src/plugins/home/server/tutorials/aerospike_metrics/index.ts @@ -23,17 +23,17 @@ export function aerospikeMetricsSpecProvider(context: TutorialContext): Tutorial return { id: 'aerospikeMetrics', name: i18n.translate('home.tutorials.aerospikeMetrics.nameTitle', { - defaultMessage: 'Aerospike metrics', + defaultMessage: 'Aerospike Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.aerospikeMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Aerospike server.', + defaultMessage: 'Collect metrics from Aerospike servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.aerospikeMetrics.longDescription', { defaultMessage: - 'The `aerospike` Metricbeat module fetches internal metrics from Aerospike. \ + 'The `aerospike` Metricbeat module fetches metrics from Aerospike. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-aerospike.html', diff --git a/src/plugins/home/server/tutorials/apache_logs/index.ts b/src/plugins/home/server/tutorials/apache_logs/index.ts index 8606a40fe0a23..6e588fd86588d 100644 --- a/src/plugins/home/server/tutorials/apache_logs/index.ts +++ b/src/plugins/home/server/tutorials/apache_logs/index.ts @@ -24,12 +24,12 @@ export function apacheLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'apacheLogs', name: i18n.translate('home.tutorials.apacheLogs.nameTitle', { - defaultMessage: 'Apache logs', + defaultMessage: 'Apache HTTP Server Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.apacheLogs.shortDescription', { - defaultMessage: 'Collect and parse access and error logs created by the Apache HTTP server.', + defaultMessage: 'Collect and parse logs from Apache HTTP servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.apacheLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/apache_metrics/index.ts b/src/plugins/home/server/tutorials/apache_metrics/index.ts index f013f3da737f0..17b495d1460c5 100644 --- a/src/plugins/home/server/tutorials/apache_metrics/index.ts +++ b/src/plugins/home/server/tutorials/apache_metrics/index.ts @@ -23,16 +23,16 @@ export function apacheMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'apacheMetrics', name: i18n.translate('home.tutorials.apacheMetrics.nameTitle', { - defaultMessage: 'Apache metrics', + defaultMessage: 'Apache HTTP Server Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.apacheMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Apache 2 HTTP server.', + defaultMessage: 'Collect metrics from Apache HTTP servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.apacheMetrics.longDescription', { defaultMessage: - 'The `apache` Metricbeat module fetches internal metrics from the Apache 2 HTTP server. \ + 'The `apache` Metricbeat module fetches metrics from Apache 2 HTTP server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-apache.html', diff --git a/src/plugins/home/server/tutorials/auditbeat/index.ts b/src/plugins/home/server/tutorials/auditbeat/index.ts index 8bd6450b1daa4..96e5d4bcda393 100644 --- a/src/plugins/home/server/tutorials/auditbeat/index.ts +++ b/src/plugins/home/server/tutorials/auditbeat/index.ts @@ -24,12 +24,12 @@ export function auditbeatSpecProvider(context: TutorialContext): TutorialSchema return { id: 'auditbeat', name: i18n.translate('home.tutorials.auditbeat.nameTitle', { - defaultMessage: 'Auditbeat', + defaultMessage: 'Auditbeat Events', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.auditbeat.shortDescription', { - defaultMessage: 'Collect audit data from your hosts.', + defaultMessage: 'Collect events from your servers with Auditbeat.', }), longDescription: i18n.translate('home.tutorials.auditbeat.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/auditd_logs/index.ts b/src/plugins/home/server/tutorials/auditd_logs/index.ts index a0d6f5f683e2c..6993196d93417 100644 --- a/src/plugins/home/server/tutorials/auditd_logs/index.ts +++ b/src/plugins/home/server/tutorials/auditd_logs/index.ts @@ -24,16 +24,16 @@ export function auditdLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'auditdLogs', name: i18n.translate('home.tutorials.auditdLogs.nameTitle', { - defaultMessage: 'Auditd logs', + defaultMessage: 'Auditd Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.auditdLogs.shortDescription', { - defaultMessage: 'Collect logs from the Linux auditd daemon.', + defaultMessage: 'Collect and parse logs from Linux audit daemon with Filebeat.', }), longDescription: i18n.translate('home.tutorials.auditdLogs.longDescription', { defaultMessage: - 'The module collects and parses logs from the audit daemon ( `auditd`). \ + 'The module collects and parses logs from audit daemon ( `auditd`). \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-auditd.html', diff --git a/src/plugins/home/server/tutorials/aws_logs/index.ts b/src/plugins/home/server/tutorials/aws_logs/index.ts index 3458800b33f0a..62fbcc4eebc18 100644 --- a/src/plugins/home/server/tutorials/aws_logs/index.ts +++ b/src/plugins/home/server/tutorials/aws_logs/index.ts @@ -24,12 +24,12 @@ export function awsLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'awsLogs', name: i18n.translate('home.tutorials.awsLogs.nameTitle', { - defaultMessage: 'AWS S3 based logs', + defaultMessage: 'AWS S3 based Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.awsLogs.shortDescription', { - defaultMessage: 'Collect AWS logs from S3 bucket with Filebeat.', + defaultMessage: 'Collect and parse logs from AWS S3 buckets with Filebeat.', }), longDescription: i18n.translate('home.tutorials.awsLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/aws_metrics/index.ts b/src/plugins/home/server/tutorials/aws_metrics/index.ts index 7c3a15a47d784..6bf1bf64bff9f 100644 --- a/src/plugins/home/server/tutorials/aws_metrics/index.ts +++ b/src/plugins/home/server/tutorials/aws_metrics/index.ts @@ -23,17 +23,17 @@ export function awsMetricsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'awsMetrics', name: i18n.translate('home.tutorials.awsMetrics.nameTitle', { - defaultMessage: 'AWS metrics', + defaultMessage: 'AWS Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.awsMetrics.shortDescription', { defaultMessage: - 'Fetch monitoring metrics for EC2 instances from the AWS APIs and Cloudwatch.', + 'Collect metrics for EC2 instances from AWS APIs and Cloudwatch with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.awsMetrics.longDescription', { defaultMessage: - 'The `aws` Metricbeat module fetches monitoring metrics from the AWS APIs and Cloudwatch. \ + 'The `aws` Metricbeat module fetches metrics from AWS APIs and Cloudwatch. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-aws.html', diff --git a/src/plugins/home/server/tutorials/azure_logs/index.ts b/src/plugins/home/server/tutorials/azure_logs/index.ts index 2bf1527a79c40..3c9438d9a6298 100644 --- a/src/plugins/home/server/tutorials/azure_logs/index.ts +++ b/src/plugins/home/server/tutorials/azure_logs/index.ts @@ -24,13 +24,13 @@ export function azureLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'azureLogs', name: i18n.translate('home.tutorials.azureLogs.nameTitle', { - defaultMessage: 'Azure logs', + defaultMessage: 'Azure Logs', }), moduleName, isBeta: true, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.azureLogs.shortDescription', { - defaultMessage: 'Collects Azure activity and audit related logs.', + defaultMessage: 'Collect and parse logs from Azure with Filebeat.', }), longDescription: i18n.translate('home.tutorials.azureLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/azure_metrics/index.ts b/src/plugins/home/server/tutorials/azure_metrics/index.ts index 4a6112510b333..310f954104634 100644 --- a/src/plugins/home/server/tutorials/azure_metrics/index.ts +++ b/src/plugins/home/server/tutorials/azure_metrics/index.ts @@ -23,13 +23,13 @@ export function azureMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'azureMetrics', name: i18n.translate('home.tutorials.azureMetrics.nameTitle', { - defaultMessage: 'Azure metrics', + defaultMessage: 'Azure Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.azureMetrics.shortDescription', { - defaultMessage: 'Fetch Azure Monitor metrics.', + defaultMessage: 'Collect metrics from Azure with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.azureMetrics.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/barracuda_logs/index.ts b/src/plugins/home/server/tutorials/barracuda_logs/index.ts index 35ce10e00892e..cdfd75b9728b9 100644 --- a/src/plugins/home/server/tutorials/barracuda_logs/index.ts +++ b/src/plugins/home/server/tutorials/barracuda_logs/index.ts @@ -24,12 +24,13 @@ export function barracudaLogsSpecProvider(context: TutorialContext): TutorialSch return { id: 'barracudaLogs', name: i18n.translate('home.tutorials.barracudaLogs.nameTitle', { - defaultMessage: 'Barracuda logs', + defaultMessage: 'Barracuda Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.barracudaLogs.shortDescription', { - defaultMessage: 'Collect Barracuda Web Application Firewall logs over syslog or from a file.', + defaultMessage: + 'Collect and parse logs from Barracuda Web Application Firewall with Filebeat.', }), longDescription: i18n.translate('home.tutorials.barracudaLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/bluecoat_logs/index.ts b/src/plugins/home/server/tutorials/bluecoat_logs/index.ts index 85c7dff85d3e6..a7db5b04ee40d 100644 --- a/src/plugins/home/server/tutorials/bluecoat_logs/index.ts +++ b/src/plugins/home/server/tutorials/bluecoat_logs/index.ts @@ -24,12 +24,12 @@ export function bluecoatLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'bluecoatLogs', name: i18n.translate('home.tutorials.bluecoatLogs.nameTitle', { - defaultMessage: 'Bluecoat logs', + defaultMessage: 'Bluecoat Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.bluecoatLogs.shortDescription', { - defaultMessage: 'Collect Blue Coat Director logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Blue Coat Director with Filebeat.', }), longDescription: i18n.translate('home.tutorials.bluecoatLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/cef_logs/index.ts b/src/plugins/home/server/tutorials/cef_logs/index.ts index cfd267f661d2a..1366198d610d7 100644 --- a/src/plugins/home/server/tutorials/cef_logs/index.ts +++ b/src/plugins/home/server/tutorials/cef_logs/index.ts @@ -24,12 +24,12 @@ export function cefLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'cefLogs', name: i18n.translate('home.tutorials.cefLogs.nameTitle', { - defaultMessage: 'CEF logs', + defaultMessage: 'CEF Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.cefLogs.shortDescription', { - defaultMessage: 'Collect Common Event Format (CEF) log data over syslog.', + defaultMessage: 'Collect and parse logs from Common Event Format (CEF) with Filebeat.', }), longDescription: i18n.translate('home.tutorials.cefLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/ceph_metrics/index.ts b/src/plugins/home/server/tutorials/ceph_metrics/index.ts index 821067d87c905..6a53789d26f7c 100644 --- a/src/plugins/home/server/tutorials/ceph_metrics/index.ts +++ b/src/plugins/home/server/tutorials/ceph_metrics/index.ts @@ -23,17 +23,17 @@ export function cephMetricsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'cephMetrics', name: i18n.translate('home.tutorials.cephMetrics.nameTitle', { - defaultMessage: 'Ceph metrics', + defaultMessage: 'Ceph Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.cephMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Ceph server.', + defaultMessage: 'Collect metrics from Ceph servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.cephMetrics.longDescription', { defaultMessage: - 'The `ceph` Metricbeat module fetches internal metrics from Ceph. \ + 'The `ceph` Metricbeat module fetches metrics from Ceph. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-ceph.html', diff --git a/src/plugins/home/server/tutorials/checkpoint_logs/index.ts b/src/plugins/home/server/tutorials/checkpoint_logs/index.ts index 9c0d5591ae35b..b5ea6be42403b 100644 --- a/src/plugins/home/server/tutorials/checkpoint_logs/index.ts +++ b/src/plugins/home/server/tutorials/checkpoint_logs/index.ts @@ -24,12 +24,12 @@ export function checkpointLogsSpecProvider(context: TutorialContext): TutorialSc return { id: 'checkpointLogs', name: i18n.translate('home.tutorials.checkpointLogs.nameTitle', { - defaultMessage: 'Check Point logs', + defaultMessage: 'Check Point Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.checkpointLogs.shortDescription', { - defaultMessage: 'Collect Check Point firewall logs.', + defaultMessage: 'Collect and parse logs from Check Point firewalls with Filebeat.', }), longDescription: i18n.translate('home.tutorials.checkpointLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/cisco_logs/index.ts b/src/plugins/home/server/tutorials/cisco_logs/index.ts index 50b79f448b316..922cfbf1e23ee 100644 --- a/src/plugins/home/server/tutorials/cisco_logs/index.ts +++ b/src/plugins/home/server/tutorials/cisco_logs/index.ts @@ -24,12 +24,12 @@ export function ciscoLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'ciscoLogs', name: i18n.translate('home.tutorials.ciscoLogs.nameTitle', { - defaultMessage: 'Cisco logs', + defaultMessage: 'Cisco Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.ciscoLogs.shortDescription', { - defaultMessage: 'Collect Cisco network device logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Cisco network devices with Filebeat.', }), longDescription: i18n.translate('home.tutorials.ciscoLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/cloudwatch_logs/index.ts b/src/plugins/home/server/tutorials/cloudwatch_logs/index.ts index cf0c27ed9be73..5564d11be4d19 100644 --- a/src/plugins/home/server/tutorials/cloudwatch_logs/index.ts +++ b/src/plugins/home/server/tutorials/cloudwatch_logs/index.ts @@ -23,12 +23,12 @@ export function cloudwatchLogsSpecProvider(context: TutorialContext): TutorialSc return { id: 'cloudwatchLogs', name: i18n.translate('home.tutorials.cloudwatchLogs.nameTitle', { - defaultMessage: 'AWS Cloudwatch logs', + defaultMessage: 'AWS Cloudwatch Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.cloudwatchLogs.shortDescription', { - defaultMessage: 'Collect Cloudwatch logs with Functionbeat.', + defaultMessage: 'Collect and parse logs from AWS Cloudwatch with Functionbeat.', }), longDescription: i18n.translate('home.tutorials.cloudwatchLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts b/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts index e43d05a0a098f..535c8aaa90768 100644 --- a/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts +++ b/src/plugins/home/server/tutorials/cockroachdb_metrics/index.ts @@ -23,16 +23,16 @@ export function cockroachdbMetricsSpecProvider(context: TutorialContext): Tutori return { id: 'cockroachdbMetrics', name: i18n.translate('home.tutorials.cockroachdbMetrics.nameTitle', { - defaultMessage: 'CockroachDB metrics', + defaultMessage: 'CockroachDB Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.cockroachdbMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from the CockroachDB server.', + defaultMessage: 'Collect metrics from CockroachDB servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.cockroachdbMetrics.longDescription', { defaultMessage: - 'The `cockroachdb` Metricbeat module fetches monitoring metrics from CockroachDB. \ + 'The `cockroachdb` Metricbeat module fetches metrics from CockroachDB. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-cockroachdb.html', diff --git a/src/plugins/home/server/tutorials/consul_metrics/index.ts b/src/plugins/home/server/tutorials/consul_metrics/index.ts index 915920db5882c..ca7179d55fd89 100644 --- a/src/plugins/home/server/tutorials/consul_metrics/index.ts +++ b/src/plugins/home/server/tutorials/consul_metrics/index.ts @@ -23,16 +23,16 @@ export function consulMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'consulMetrics', name: i18n.translate('home.tutorials.consulMetrics.nameTitle', { - defaultMessage: 'Consul metrics', + defaultMessage: 'Consul Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.consulMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from the Consul server.', + defaultMessage: 'Collect metrics from Consul servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.consulMetrics.longDescription', { defaultMessage: - 'The `consul` Metricbeat module fetches monitoring metrics from Consul. \ + 'The `consul` Metricbeat module fetches metrics from Consul. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-consul.html', diff --git a/src/plugins/home/server/tutorials/coredns_logs/index.ts b/src/plugins/home/server/tutorials/coredns_logs/index.ts index 298464651f7fc..1261c67135001 100644 --- a/src/plugins/home/server/tutorials/coredns_logs/index.ts +++ b/src/plugins/home/server/tutorials/coredns_logs/index.ts @@ -24,12 +24,12 @@ export function corednsLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'corednsLogs', name: i18n.translate('home.tutorials.corednsLogs.nameTitle', { - defaultMessage: 'CoreDNS logs', + defaultMessage: 'CoreDNS Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.corednsLogs.shortDescription', { - defaultMessage: 'Collect CoreDNS logs.', + defaultMessage: 'Collect and parse logs from CoreDNS servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.corednsLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/coredns_metrics/index.ts b/src/plugins/home/server/tutorials/coredns_metrics/index.ts index 34912efb31a81..3abc14314a6ba 100644 --- a/src/plugins/home/server/tutorials/coredns_metrics/index.ts +++ b/src/plugins/home/server/tutorials/coredns_metrics/index.ts @@ -23,16 +23,16 @@ export function corednsMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'corednsMetrics', name: i18n.translate('home.tutorials.corednsMetrics.nameTitle', { - defaultMessage: 'CoreDNS metrics', + defaultMessage: 'CoreDNS Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.corednsMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from the CoreDNS server.', + defaultMessage: 'Collect metrics from CoreDNS servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.corednsMetrics.longDescription', { defaultMessage: - 'The `coredns` Metricbeat module fetches monitoring metrics from CoreDNS. \ + 'The `coredns` Metricbeat module fetches metrics from CoreDNS. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-coredns.html', diff --git a/src/plugins/home/server/tutorials/couchbase_metrics/index.ts b/src/plugins/home/server/tutorials/couchbase_metrics/index.ts index 1860991fd17b2..5c29aa2d9a524 100644 --- a/src/plugins/home/server/tutorials/couchbase_metrics/index.ts +++ b/src/plugins/home/server/tutorials/couchbase_metrics/index.ts @@ -23,17 +23,17 @@ export function couchbaseMetricsSpecProvider(context: TutorialContext): Tutorial return { id: 'couchbaseMetrics', name: i18n.translate('home.tutorials.couchbaseMetrics.nameTitle', { - defaultMessage: 'Couchbase metrics', + defaultMessage: 'Couchbase Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.couchbaseMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from Couchbase.', + defaultMessage: 'Collect metrics from Couchbase databases with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.couchbaseMetrics.longDescription', { defaultMessage: - 'The `couchbase` Metricbeat module fetches internal metrics from Couchbase. \ + 'The `couchbase` Metricbeat module fetches metrics from Couchbase. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-couchbase.html', diff --git a/src/plugins/home/server/tutorials/couchdb_metrics/index.ts b/src/plugins/home/server/tutorials/couchdb_metrics/index.ts index a6c57f56cf2e1..00bea11d13d99 100644 --- a/src/plugins/home/server/tutorials/couchdb_metrics/index.ts +++ b/src/plugins/home/server/tutorials/couchdb_metrics/index.ts @@ -23,16 +23,16 @@ export function couchdbMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'couchdbMetrics', name: i18n.translate('home.tutorials.couchdbMetrics.nameTitle', { - defaultMessage: 'CouchDB metrics', + defaultMessage: 'CouchDB Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.couchdbMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from the CouchdB server.', + defaultMessage: 'Collect metrics from CouchDB servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.couchdbMetrics.longDescription', { defaultMessage: - 'The `couchdb` Metricbeat module fetches monitoring metrics from CouchDB. \ + 'The `couchdb` Metricbeat module fetches metrics from CouchDB. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-couchdb.html', diff --git a/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts b/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts index baaaef50a641f..a48ed4288210b 100644 --- a/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts +++ b/src/plugins/home/server/tutorials/crowdstrike_logs/index.ts @@ -24,12 +24,13 @@ export function crowdstrikeLogsSpecProvider(context: TutorialContext): TutorialS return { id: 'crowdstrikeLogs', name: i18n.translate('home.tutorials.crowdstrikeLogs.nameTitle', { - defaultMessage: 'CrowdStrike logs', + defaultMessage: 'CrowdStrike Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.crowdstrikeLogs.shortDescription', { - defaultMessage: 'Collect CrowdStrike Falcon logs using the Falcon SIEM Connector.', + defaultMessage: + 'Collect and parse logs from CrowdStrike Falcon using the Falcon SIEM Connector with Filebeat.', }), longDescription: i18n.translate('home.tutorials.crowdstrikeLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/cylance_logs/index.ts b/src/plugins/home/server/tutorials/cylance_logs/index.ts index 9766f417b8870..64b79a41cd2e0 100644 --- a/src/plugins/home/server/tutorials/cylance_logs/index.ts +++ b/src/plugins/home/server/tutorials/cylance_logs/index.ts @@ -24,12 +24,12 @@ export function cylanceLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'cylanceLogs', name: i18n.translate('home.tutorials.cylanceLogs.nameTitle', { - defaultMessage: 'CylancePROTECT logs', + defaultMessage: 'CylancePROTECT Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.cylanceLogs.shortDescription', { - defaultMessage: 'Collect CylancePROTECT logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from CylancePROTECT with Filebeat.', }), longDescription: i18n.translate('home.tutorials.cylanceLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/docker_metrics/index.ts b/src/plugins/home/server/tutorials/docker_metrics/index.ts index 6a8687ef5d66e..ab80e6d644dbc 100644 --- a/src/plugins/home/server/tutorials/docker_metrics/index.ts +++ b/src/plugins/home/server/tutorials/docker_metrics/index.ts @@ -23,16 +23,16 @@ export function dockerMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'dockerMetrics', name: i18n.translate('home.tutorials.dockerMetrics.nameTitle', { - defaultMessage: 'Docker metrics', + defaultMessage: 'Docker Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.dockerMetrics.shortDescription', { - defaultMessage: 'Fetch metrics about your Docker containers.', + defaultMessage: 'Collect metrics from Docker containers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.dockerMetrics.longDescription', { defaultMessage: - 'The `docker` Metricbeat module fetches metrics from the Docker server. \ + 'The `docker` Metricbeat module fetches metrics from Docker server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-docker.html', diff --git a/src/plugins/home/server/tutorials/dropwizard_metrics/index.ts b/src/plugins/home/server/tutorials/dropwizard_metrics/index.ts index 86be26dd12ca7..9864d376966bb 100644 --- a/src/plugins/home/server/tutorials/dropwizard_metrics/index.ts +++ b/src/plugins/home/server/tutorials/dropwizard_metrics/index.ts @@ -23,17 +23,17 @@ export function dropwizardMetricsSpecProvider(context: TutorialContext): Tutoria return { id: 'dropwizardMetrics', name: i18n.translate('home.tutorials.dropwizardMetrics.nameTitle', { - defaultMessage: 'Dropwizard metrics', + defaultMessage: 'Dropwizard Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.dropwizardMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from Dropwizard Java application.', + defaultMessage: 'Collect metrics from Dropwizard Java applciations with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.dropwizardMetrics.longDescription', { defaultMessage: - 'The `dropwizard` Metricbeat module fetches internal metrics from Dropwizard Java Application. \ + 'The `dropwizard` Metricbeat module fetches metrics from Dropwizard Java Application. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-dropwizard.html', diff --git a/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts b/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts index 1886a912fdcd2..6415781d02c06 100644 --- a/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts +++ b/src/plugins/home/server/tutorials/elasticsearch_logs/index.ts @@ -24,13 +24,13 @@ export function elasticsearchLogsSpecProvider(context: TutorialContext): Tutoria return { id: 'elasticsearchLogs', name: i18n.translate('home.tutorials.elasticsearchLogs.nameTitle', { - defaultMessage: 'Elasticsearch logs', + defaultMessage: 'Elasticsearch Logs', }), moduleName, category: TutorialsCategory.LOGGING, isBeta: true, shortDescription: i18n.translate('home.tutorials.elasticsearchLogs.shortDescription', { - defaultMessage: 'Collect and parse logs created by Elasticsearch.', + defaultMessage: 'Collect and parse logs from Elasticsearch clusters with Filebeat.', }), longDescription: i18n.translate('home.tutorials.elasticsearchLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/elasticsearch_metrics/index.ts b/src/plugins/home/server/tutorials/elasticsearch_metrics/index.ts index 2adc2fd90fa70..3961d7f78c86c 100644 --- a/src/plugins/home/server/tutorials/elasticsearch_metrics/index.ts +++ b/src/plugins/home/server/tutorials/elasticsearch_metrics/index.ts @@ -23,17 +23,17 @@ export function elasticsearchMetricsSpecProvider(context: TutorialContext): Tuto return { id: 'elasticsearchMetrics', name: i18n.translate('home.tutorials.elasticsearchMetrics.nameTitle', { - defaultMessage: 'Elasticsearch metrics', + defaultMessage: 'Elasticsearch Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.elasticsearchMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from Elasticsearch.', + defaultMessage: 'Collect metrics from Elasticsearch clusters with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.elasticsearchMetrics.longDescription', { defaultMessage: - 'The `elasticsearch` Metricbeat module fetches internal metrics from Elasticsearch. \ + 'The `elasticsearch` Metricbeat module fetches metrics from Elasticsearch. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-elasticsearch.html', diff --git a/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts b/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts index fda69a2467b25..55c85a5bdd2a4 100644 --- a/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts +++ b/src/plugins/home/server/tutorials/envoyproxy_logs/index.ts @@ -24,12 +24,12 @@ export function envoyproxyLogsSpecProvider(context: TutorialContext): TutorialSc return { id: 'envoyproxyLogs', name: i18n.translate('home.tutorials.envoyproxyLogs.nameTitle', { - defaultMessage: 'Envoy Proxy logs', + defaultMessage: 'Envoy Proxy Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.envoyproxyLogs.shortDescription', { - defaultMessage: 'Collect Envoy Proxy logs.', + defaultMessage: 'Collect and parse logs from Envoy Proxy with Filebeat.', }), longDescription: i18n.translate('home.tutorials.envoyproxyLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts b/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts index 263d1a2036fd0..e2f3b84739685 100644 --- a/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts +++ b/src/plugins/home/server/tutorials/envoyproxy_metrics/index.ts @@ -23,16 +23,16 @@ export function envoyproxyMetricsSpecProvider(context: TutorialContext): Tutoria return { id: 'envoyproxyMetrics', name: i18n.translate('home.tutorials.envoyproxyMetrics.nameTitle', { - defaultMessage: 'Envoy Proxy metrics', + defaultMessage: 'Envoy Proxy Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.envoyproxyMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from Envoy Proxy.', + defaultMessage: 'Collect metrics from Envoy Proxy with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.envoyproxyMetrics.longDescription', { defaultMessage: - 'The `envoyproxy` Metricbeat module fetches monitoring metrics from Envoy Proxy. \ + 'The `envoyproxy` Metricbeat module fetches metrics from Envoy Proxy. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-envoyproxy.html', diff --git a/src/plugins/home/server/tutorials/etcd_metrics/index.ts b/src/plugins/home/server/tutorials/etcd_metrics/index.ts index cda16ecf68e34..9ed153c21c257 100644 --- a/src/plugins/home/server/tutorials/etcd_metrics/index.ts +++ b/src/plugins/home/server/tutorials/etcd_metrics/index.ts @@ -23,17 +23,17 @@ export function etcdMetricsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'etcdMetrics', name: i18n.translate('home.tutorials.etcdMetrics.nameTitle', { - defaultMessage: 'Etcd metrics', + defaultMessage: 'Etcd Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.etcdMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Etcd server.', + defaultMessage: 'Collect metrics from Etcd servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.etcdMetrics.longDescription', { defaultMessage: - 'The `etcd` Metricbeat module fetches internal metrics from Etcd. \ + 'The `etcd` Metricbeat module fetches metrics from Etcd. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-etcd.html', diff --git a/src/plugins/home/server/tutorials/f5_logs/index.ts b/src/plugins/home/server/tutorials/f5_logs/index.ts index ebcdd4ece7f45..a407d1d3d5142 100644 --- a/src/plugins/home/server/tutorials/f5_logs/index.ts +++ b/src/plugins/home/server/tutorials/f5_logs/index.ts @@ -24,12 +24,12 @@ export function f5LogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'f5Logs', name: i18n.translate('home.tutorials.f5Logs.nameTitle', { - defaultMessage: 'F5 logs', + defaultMessage: 'F5 Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.f5Logs.shortDescription', { - defaultMessage: 'Collect F5 Big-IP Access Policy Manager logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from F5 Big-IP Access Policy Manager with Filebeat.', }), longDescription: i18n.translate('home.tutorials.f5Logs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/fortinet_logs/index.ts b/src/plugins/home/server/tutorials/fortinet_logs/index.ts index 3e7923b680c6e..2f6af3ba47280 100644 --- a/src/plugins/home/server/tutorials/fortinet_logs/index.ts +++ b/src/plugins/home/server/tutorials/fortinet_logs/index.ts @@ -24,12 +24,12 @@ export function fortinetLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'fortinetLogs', name: i18n.translate('home.tutorials.fortinetLogs.nameTitle', { - defaultMessage: 'Fortinet logs', + defaultMessage: 'Fortinet Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.fortinetLogs.shortDescription', { - defaultMessage: 'Collect Fortinet FortiOS logs over syslog.', + defaultMessage: 'Collect and parse logs from Fortinet FortiOS with Filebeat.', }), longDescription: i18n.translate('home.tutorials.fortinetLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/gcp_logs/index.ts b/src/plugins/home/server/tutorials/gcp_logs/index.ts index feef7d673c5d9..23d8e3364eb69 100644 --- a/src/plugins/home/server/tutorials/gcp_logs/index.ts +++ b/src/plugins/home/server/tutorials/gcp_logs/index.ts @@ -24,12 +24,12 @@ export function gcpLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'gcpLogs', name: i18n.translate('home.tutorials.gcpLogs.nameTitle', { - defaultMessage: 'Google Cloud logs', + defaultMessage: 'Google Cloud Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.gcpLogs.shortDescription', { - defaultMessage: 'Collect Google Cloud audit, firewall, and VPC flow logs.', + defaultMessage: 'Collect and parse logs from Google Cloud Platform with Filebeat.', }), longDescription: i18n.translate('home.tutorials.gcpLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/gcp_metrics/index.ts b/src/plugins/home/server/tutorials/gcp_metrics/index.ts index 5f198ed5f3cf2..7f397c1e1be7b 100644 --- a/src/plugins/home/server/tutorials/gcp_metrics/index.ts +++ b/src/plugins/home/server/tutorials/gcp_metrics/index.ts @@ -23,17 +23,16 @@ export function gcpMetricsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'gcpMetrics', name: i18n.translate('home.tutorials.gcpMetrics.nameTitle', { - defaultMessage: 'Google Cloud metrics', + defaultMessage: 'Google Cloud Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.gcpMetrics.shortDescription', { - defaultMessage: - 'Fetch monitoring metrics from Google Cloud Platform using Stackdriver Monitoring API.', + defaultMessage: 'Collect metrics from Google Cloud Platform with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.gcpMetrics.longDescription', { defaultMessage: - 'The `gcp` Metricbeat module fetches monitoring metrics from Google Cloud Platform using Stackdriver Monitoring API. \ + 'The `gcp` Metricbeat module fetches metrics from Google Cloud Platform using Stackdriver Monitoring API. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-gcp.html', diff --git a/src/plugins/home/server/tutorials/golang_metrics/index.ts b/src/plugins/home/server/tutorials/golang_metrics/index.ts index 85937e0dda0e0..50d09e42e8791 100644 --- a/src/plugins/home/server/tutorials/golang_metrics/index.ts +++ b/src/plugins/home/server/tutorials/golang_metrics/index.ts @@ -23,17 +23,17 @@ export function golangMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: moduleName + 'Metrics', name: i18n.translate('home.tutorials.golangMetrics.nameTitle', { - defaultMessage: 'Golang metrics', + defaultMessage: 'Golang Metrics', }), moduleName, isBeta: true, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.golangMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from a Golang app.', + defaultMessage: 'Collect metrics from Golang applications with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.golangMetrics.longDescription', { defaultMessage: - 'The `{moduleName}` Metricbeat module fetches internal metrics from a Golang app. \ + 'The `{moduleName}` Metricbeat module fetches metrics from a Golang app. \ [Learn more]({learnMoreLink}).', values: { moduleName, diff --git a/src/plugins/home/server/tutorials/gsuite_logs/index.ts b/src/plugins/home/server/tutorials/gsuite_logs/index.ts index 4d23c6b1cfdce..718558321cf78 100644 --- a/src/plugins/home/server/tutorials/gsuite_logs/index.ts +++ b/src/plugins/home/server/tutorials/gsuite_logs/index.ts @@ -24,16 +24,16 @@ export function gsuiteLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'gsuiteLogs', name: i18n.translate('home.tutorials.gsuiteLogs.nameTitle', { - defaultMessage: 'GSuite logs', + defaultMessage: 'GSuite Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.gsuiteLogs.shortDescription', { - defaultMessage: 'Collect GSuite activity reports.', + defaultMessage: 'Collect and parse activity reports from GSuite with Filebeat.', }), longDescription: i18n.translate('home.tutorials.gsuiteLogs.longDescription', { defaultMessage: - 'This is a module for ingesting data from the different GSuite audit reports APIs. \ + 'This is a module for ingesting data from different GSuite audit reports APIs. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.filebeat}/filebeat-module-gsuite.html', diff --git a/src/plugins/home/server/tutorials/haproxy_logs/index.ts b/src/plugins/home/server/tutorials/haproxy_logs/index.ts index 0b0fd35f07058..c3765317ecbe0 100644 --- a/src/plugins/home/server/tutorials/haproxy_logs/index.ts +++ b/src/plugins/home/server/tutorials/haproxy_logs/index.ts @@ -24,12 +24,12 @@ export function haproxyLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'haproxyLogs', name: i18n.translate('home.tutorials.haproxyLogs.nameTitle', { - defaultMessage: 'HAProxy logs', + defaultMessage: 'HAProxy Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.haproxyLogs.shortDescription', { - defaultMessage: 'Collect HAProxy logs.', + defaultMessage: 'Collect and parse logs from HAProxy servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.haproxyLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/haproxy_metrics/index.ts b/src/plugins/home/server/tutorials/haproxy_metrics/index.ts index e37f0ffc4b916..49f1d32dc4c82 100644 --- a/src/plugins/home/server/tutorials/haproxy_metrics/index.ts +++ b/src/plugins/home/server/tutorials/haproxy_metrics/index.ts @@ -23,17 +23,17 @@ export function haproxyMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'haproxyMetrics', name: i18n.translate('home.tutorials.haproxyMetrics.nameTitle', { - defaultMessage: 'HAProxy metrics', + defaultMessage: 'HAProxy Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.haproxyMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the HAProxy server.', + defaultMessage: 'Collect metrics from HAProxy servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.haproxyMetrics.longDescription', { defaultMessage: - 'The `haproxy` Metricbeat module fetches internal metrics from HAProxy. \ + 'The `haproxy` Metricbeat module fetches metrics from HAProxy. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-haproxy.html', diff --git a/src/plugins/home/server/tutorials/ibmmq_logs/index.ts b/src/plugins/home/server/tutorials/ibmmq_logs/index.ts index 646747d1a49f8..21b60a9ab5a5c 100644 --- a/src/plugins/home/server/tutorials/ibmmq_logs/index.ts +++ b/src/plugins/home/server/tutorials/ibmmq_logs/index.ts @@ -24,12 +24,12 @@ export function ibmmqLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'ibmmqLogs', name: i18n.translate('home.tutorials.ibmmqLogs.nameTitle', { - defaultMessage: 'IBM MQ logs', + defaultMessage: 'IBM MQ Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.ibmmqLogs.shortDescription', { - defaultMessage: 'Collect IBM MQ logs with Filebeat.', + defaultMessage: 'Collect and parse logs from IBM MQ with Filebeat.', }), longDescription: i18n.translate('home.tutorials.ibmmqLogs.longDescription', { defaultMessage: 'Collect IBM MQ logs with Filebeat. \ diff --git a/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts b/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts index 3862bd9ca85eb..706003f0eab48 100644 --- a/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts +++ b/src/plugins/home/server/tutorials/ibmmq_metrics/index.ts @@ -23,16 +23,16 @@ export function ibmmqMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'ibmmqMetrics', name: i18n.translate('home.tutorials.ibmmqMetrics.nameTitle', { - defaultMessage: 'IBM MQ metrics', + defaultMessage: 'IBM MQ Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.ibmmqMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from IBM MQ instances.', + defaultMessage: 'Collect metrics from IBM MQ instances with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.ibmmqMetrics.longDescription', { defaultMessage: - 'The `ibmmq` Metricbeat module fetches monitoring metrics from IBM MQ instances \ + 'The `ibmmq` Metricbeat module fetches metrics from IBM MQ instances \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-ibmmq.html', diff --git a/src/plugins/home/server/tutorials/icinga_logs/index.ts b/src/plugins/home/server/tutorials/icinga_logs/index.ts index 0dae93b70343b..dc730022262c2 100644 --- a/src/plugins/home/server/tutorials/icinga_logs/index.ts +++ b/src/plugins/home/server/tutorials/icinga_logs/index.ts @@ -24,12 +24,12 @@ export function icingaLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'icingaLogs', name: i18n.translate('home.tutorials.icingaLogs.nameTitle', { - defaultMessage: 'Icinga logs', + defaultMessage: 'Icinga Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.icingaLogs.shortDescription', { - defaultMessage: 'Collect Icinga main, debug, and startup logs.', + defaultMessage: 'Collect and parse main, debug, and startup logs from Icinga with Filebeat.', }), longDescription: i18n.translate('home.tutorials.icingaLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/iis_logs/index.ts b/src/plugins/home/server/tutorials/iis_logs/index.ts index 5393edf6ab148..0dbc5bbdc75b8 100644 --- a/src/plugins/home/server/tutorials/iis_logs/index.ts +++ b/src/plugins/home/server/tutorials/iis_logs/index.ts @@ -24,12 +24,13 @@ export function iisLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'iisLogs', name: i18n.translate('home.tutorials.iisLogs.nameTitle', { - defaultMessage: 'IIS logs', + defaultMessage: 'IIS Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.iisLogs.shortDescription', { - defaultMessage: 'Collect and parse access and error logs created by the IIS HTTP server.', + defaultMessage: + 'Collect and parse access and error logs from IIS HTTP servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.iisLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/iis_metrics/index.ts b/src/plugins/home/server/tutorials/iis_metrics/index.ts index dbfa474dc9c89..d57e4688ba753 100644 --- a/src/plugins/home/server/tutorials/iis_metrics/index.ts +++ b/src/plugins/home/server/tutorials/iis_metrics/index.ts @@ -28,7 +28,7 @@ export function iisMetricsSpecProvider(context: TutorialContext): TutorialSchema moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.iisMetrics.shortDescription', { - defaultMessage: 'Collect IIS server related metrics.', + defaultMessage: 'Collect metrics from IIS HTTP servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.iisMetrics.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/imperva_logs/index.ts b/src/plugins/home/server/tutorials/imperva_logs/index.ts index 71c3af3809e2e..1cbe707f813ee 100644 --- a/src/plugins/home/server/tutorials/imperva_logs/index.ts +++ b/src/plugins/home/server/tutorials/imperva_logs/index.ts @@ -24,12 +24,12 @@ export function impervaLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'impervaLogs', name: i18n.translate('home.tutorials.impervaLogs.nameTitle', { - defaultMessage: 'Imperva logs', + defaultMessage: 'Imperva Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.impervaLogs.shortDescription', { - defaultMessage: 'Collect Imperva SecureSphere logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Imperva SecureSphere with Filebeat.', }), longDescription: i18n.translate('home.tutorials.impervaLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/infoblox_logs/index.ts b/src/plugins/home/server/tutorials/infoblox_logs/index.ts index 5329444dfa85f..8dce2bf00b2e2 100644 --- a/src/plugins/home/server/tutorials/infoblox_logs/index.ts +++ b/src/plugins/home/server/tutorials/infoblox_logs/index.ts @@ -24,12 +24,12 @@ export function infobloxLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'infobloxLogs', name: i18n.translate('home.tutorials.infobloxLogs.nameTitle', { - defaultMessage: 'Infoblox logs', + defaultMessage: 'Infoblox Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.infobloxLogs.shortDescription', { - defaultMessage: 'Collect Infoblox NIOS logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Infoblox NIOS with Filebeat.', }), longDescription: i18n.translate('home.tutorials.infobloxLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/iptables_logs/index.ts b/src/plugins/home/server/tutorials/iptables_logs/index.ts index 85faf169f8714..6d298e88a2dfb 100644 --- a/src/plugins/home/server/tutorials/iptables_logs/index.ts +++ b/src/plugins/home/server/tutorials/iptables_logs/index.ts @@ -24,12 +24,12 @@ export function iptablesLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'iptablesLogs', name: i18n.translate('home.tutorials.iptablesLogs.nameTitle', { - defaultMessage: 'Iptables logs', + defaultMessage: 'Iptables Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.iptablesLogs.shortDescription', { - defaultMessage: 'Collect iptables and ip6tables logs.', + defaultMessage: 'Collect and parse logs from iptables and ip6tables with Filebeat.', }), longDescription: i18n.translate('home.tutorials.iptablesLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/juniper_logs/index.ts b/src/plugins/home/server/tutorials/juniper_logs/index.ts index f9174d8a089e0..7430e4705a5f4 100644 --- a/src/plugins/home/server/tutorials/juniper_logs/index.ts +++ b/src/plugins/home/server/tutorials/juniper_logs/index.ts @@ -29,7 +29,7 @@ export function juniperLogsSpecProvider(context: TutorialContext): TutorialSchem moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.juniperLogs.shortDescription', { - defaultMessage: 'Collect Juniper JUNOS logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Juniper JUNOS with Filebeat.', }), longDescription: i18n.translate('home.tutorials.juniperLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/kafka_logs/index.ts b/src/plugins/home/server/tutorials/kafka_logs/index.ts index 5b877cadcbec6..9ccc06eb222c7 100644 --- a/src/plugins/home/server/tutorials/kafka_logs/index.ts +++ b/src/plugins/home/server/tutorials/kafka_logs/index.ts @@ -24,12 +24,12 @@ export function kafkaLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'kafkaLogs', name: i18n.translate('home.tutorials.kafkaLogs.nameTitle', { - defaultMessage: 'Kafka logs', + defaultMessage: 'Kafka Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.kafkaLogs.shortDescription', { - defaultMessage: 'Collect and parse logs created by Kafka.', + defaultMessage: 'Collect and parse logs from Kafka servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.kafkaLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/kafka_metrics/index.ts b/src/plugins/home/server/tutorials/kafka_metrics/index.ts index 92f6744b91cbe..973ec06b58fdf 100644 --- a/src/plugins/home/server/tutorials/kafka_metrics/index.ts +++ b/src/plugins/home/server/tutorials/kafka_metrics/index.ts @@ -23,17 +23,17 @@ export function kafkaMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'kafkaMetrics', name: i18n.translate('home.tutorials.kafkaMetrics.nameTitle', { - defaultMessage: 'Kafka metrics', + defaultMessage: 'Kafka Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.kafkaMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Kafka server.', + defaultMessage: 'Collect metrics from Kafka servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.kafkaMetrics.longDescription', { defaultMessage: - 'The `kafka` Metricbeat module fetches internal metrics from Kafka. \ + 'The `kafka` Metricbeat module fetches metrics from Kafka. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-kafka.html', diff --git a/src/plugins/home/server/tutorials/kibana_logs/index.ts b/src/plugins/home/server/tutorials/kibana_logs/index.ts index 988af821ef9e3..9863a53700a55 100644 --- a/src/plugins/home/server/tutorials/kibana_logs/index.ts +++ b/src/plugins/home/server/tutorials/kibana_logs/index.ts @@ -29,7 +29,7 @@ export function kibanaLogsSpecProvider(context: TutorialContext): TutorialSchema moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.kibanaLogs.shortDescription', { - defaultMessage: 'Collect Kibana logs.', + defaultMessage: 'Collect and parse logs from Kibana with Filebeat.', }), longDescription: i18n.translate('home.tutorials.kibanaLogs.longDescription', { defaultMessage: 'This is the Kibana module. \ diff --git a/src/plugins/home/server/tutorials/kibana_metrics/index.ts b/src/plugins/home/server/tutorials/kibana_metrics/index.ts index dfe4efe4f7337..3d0eb691ede51 100644 --- a/src/plugins/home/server/tutorials/kibana_metrics/index.ts +++ b/src/plugins/home/server/tutorials/kibana_metrics/index.ts @@ -23,17 +23,17 @@ export function kibanaMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'kibanaMetrics', name: i18n.translate('home.tutorials.kibanaMetrics.nameTitle', { - defaultMessage: 'Kibana metrics', + defaultMessage: 'Kibana Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.kibanaMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from Kibana.', + defaultMessage: 'Collect metrics from Kibana with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.kibanaMetrics.longDescription', { defaultMessage: - 'The `kibana` Metricbeat module fetches internal metrics from Kibana. \ + 'The `kibana` Metricbeat module fetches metrics from Kibana. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-kibana.html', diff --git a/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts b/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts index 4a694560f5c28..9c66125ee0cfe 100644 --- a/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts +++ b/src/plugins/home/server/tutorials/kubernetes_metrics/index.ts @@ -23,16 +23,16 @@ export function kubernetesMetricsSpecProvider(context: TutorialContext): Tutoria return { id: 'kubernetesMetrics', name: i18n.translate('home.tutorials.kubernetesMetrics.nameTitle', { - defaultMessage: 'Kubernetes metrics', + defaultMessage: 'Kubernetes Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.kubernetesMetrics.shortDescription', { - defaultMessage: 'Fetch metrics from your Kubernetes installation.', + defaultMessage: 'Collect metrics from Kubernetes installations with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.kubernetesMetrics.longDescription', { defaultMessage: - 'The `kubernetes` Metricbeat module fetches metrics from the Kubernetes APIs. \ + 'The `kubernetes` Metricbeat module fetches metrics from Kubernetes APIs. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-kubernetes.html', diff --git a/src/plugins/home/server/tutorials/logstash_logs/index.ts b/src/plugins/home/server/tutorials/logstash_logs/index.ts index 55491d45df28c..688ad8245b78d 100644 --- a/src/plugins/home/server/tutorials/logstash_logs/index.ts +++ b/src/plugins/home/server/tutorials/logstash_logs/index.ts @@ -24,12 +24,12 @@ export function logstashLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'logstashLogs', name: i18n.translate('home.tutorials.logstashLogs.nameTitle', { - defaultMessage: 'Logstash logs', + defaultMessage: 'Logstash Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.logstashLogs.shortDescription', { - defaultMessage: 'Collect Logstash main and slow logs.', + defaultMessage: 'Collect and parse main and slow logs from Logstash with Filebeat.', }), longDescription: i18n.translate('home.tutorials.logstashLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/logstash_metrics/index.ts b/src/plugins/home/server/tutorials/logstash_metrics/index.ts index e7d3fae011bd2..9ae4bcdcecbf1 100644 --- a/src/plugins/home/server/tutorials/logstash_metrics/index.ts +++ b/src/plugins/home/server/tutorials/logstash_metrics/index.ts @@ -23,17 +23,17 @@ export function logstashMetricsSpecProvider(context: TutorialContext): TutorialS return { id: moduleName + 'Metrics', name: i18n.translate('home.tutorials.logstashMetrics.nameTitle', { - defaultMessage: 'Logstash metrics', + defaultMessage: 'Logstash Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.logstashMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from a Logstash server.', + defaultMessage: 'Collect metrics from Logstash servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.logstashMetrics.longDescription', { defaultMessage: - 'The `{moduleName}` Metricbeat module fetches internal metrics from a Logstash server. \ + 'The `{moduleName}` Metricbeat module fetches metrics from a Logstash server. \ [Learn more]({learnMoreLink}).', values: { moduleName, diff --git a/src/plugins/home/server/tutorials/memcached_metrics/index.ts b/src/plugins/home/server/tutorials/memcached_metrics/index.ts index 15df179b44a9e..891567f72ca7c 100644 --- a/src/plugins/home/server/tutorials/memcached_metrics/index.ts +++ b/src/plugins/home/server/tutorials/memcached_metrics/index.ts @@ -23,17 +23,17 @@ export function memcachedMetricsSpecProvider(context: TutorialContext): Tutorial return { id: 'memcachedMetrics', name: i18n.translate('home.tutorials.memcachedMetrics.nameTitle', { - defaultMessage: 'Memcached metrics', + defaultMessage: 'Memcached Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.memcachedMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Memcached server.', + defaultMessage: 'Collect metrics from Memcached servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.memcachedMetrics.longDescription', { defaultMessage: - 'The `memcached` Metricbeat module fetches internal metrics from Memcached. \ + 'The `memcached` Metricbeat module fetches metrics from Memcached. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-memcached.html', diff --git a/src/plugins/home/server/tutorials/microsoft_logs/index.ts b/src/plugins/home/server/tutorials/microsoft_logs/index.ts index 52401df1f9eb7..88893e22bc9ff 100644 --- a/src/plugins/home/server/tutorials/microsoft_logs/index.ts +++ b/src/plugins/home/server/tutorials/microsoft_logs/index.ts @@ -24,12 +24,12 @@ export function microsoftLogsSpecProvider(context: TutorialContext): TutorialSch return { id: 'microsoftLogs', name: i18n.translate('home.tutorials.microsoftLogs.nameTitle', { - defaultMessage: 'Microsoft Defender ATP logs', + defaultMessage: 'Microsoft Defender ATP Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.microsoftLogs.shortDescription', { - defaultMessage: 'Collect Microsoft Defender ATP alerts.', + defaultMessage: 'Collect and parse alerts from Microsoft Defender ATP with Filebeat.', }), longDescription: i18n.translate('home.tutorials.microsoftLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/misp_logs/index.ts b/src/plugins/home/server/tutorials/misp_logs/index.ts index b7611b543bab1..ea2147a296534 100644 --- a/src/plugins/home/server/tutorials/misp_logs/index.ts +++ b/src/plugins/home/server/tutorials/misp_logs/index.ts @@ -24,12 +24,12 @@ export function mispLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'mispLogs', name: i18n.translate('home.tutorials.mispLogs.nameTitle', { - defaultMessage: 'MISP threat intel logs', + defaultMessage: 'MISP threat intel Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.mispLogs.shortDescription', { - defaultMessage: 'Collect MISP threat intelligence data with Filebeat.', + defaultMessage: 'Collect and parse logs from MISP threat intelligence with Filebeat.', }), longDescription: i18n.translate('home.tutorials.mispLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/mongodb_logs/index.ts b/src/plugins/home/server/tutorials/mongodb_logs/index.ts index 3c189c04da43b..a7f9869d440ed 100644 --- a/src/plugins/home/server/tutorials/mongodb_logs/index.ts +++ b/src/plugins/home/server/tutorials/mongodb_logs/index.ts @@ -24,12 +24,12 @@ export function mongodbLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'mongodbLogs', name: i18n.translate('home.tutorials.mongodbLogs.nameTitle', { - defaultMessage: 'MongoDB logs', + defaultMessage: 'MongoDB Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.mongodbLogs.shortDescription', { - defaultMessage: 'Collect MongoDB logs.', + defaultMessage: 'Collect and parse logs from MongoDB servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.mongodbLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/mongodb_metrics/index.ts b/src/plugins/home/server/tutorials/mongodb_metrics/index.ts index 121310fba6f3a..cc0ecc0574fa9 100644 --- a/src/plugins/home/server/tutorials/mongodb_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mongodb_metrics/index.ts @@ -23,16 +23,16 @@ export function mongodbMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'mongodbMetrics', name: i18n.translate('home.tutorials.mongodbMetrics.nameTitle', { - defaultMessage: 'MongoDB metrics', + defaultMessage: 'MongoDB Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.mongodbMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from MongoDB.', + defaultMessage: 'Collect metrics from MongoDB servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.mongodbMetrics.longDescription', { defaultMessage: - 'The `mongodb` Metricbeat module fetches internal metrics from the MongoDB server. \ + 'The `mongodb` Metricbeat module fetches metrics from MongoDB server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-mongodb.html', diff --git a/src/plugins/home/server/tutorials/mssql_logs/index.ts b/src/plugins/home/server/tutorials/mssql_logs/index.ts index 567080910b7fe..06cafd95283c8 100644 --- a/src/plugins/home/server/tutorials/mssql_logs/index.ts +++ b/src/plugins/home/server/tutorials/mssql_logs/index.ts @@ -24,12 +24,12 @@ export function mssqlLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'mssqlLogs', name: i18n.translate('home.tutorials.mssqlLogs.nameTitle', { - defaultMessage: 'MSSQL logs', + defaultMessage: 'Microsoft SQL Server Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.mssqlLogs.shortDescription', { - defaultMessage: 'Collect MSSQL logs.', + defaultMessage: 'Collect and parse logs from Microsoft SQL Server instances with Filebeat.', }), longDescription: i18n.translate('home.tutorials.mssqlLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/mssql_metrics/index.ts b/src/plugins/home/server/tutorials/mssql_metrics/index.ts index 998cefe2de004..e3c9e3c338209 100644 --- a/src/plugins/home/server/tutorials/mssql_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mssql_metrics/index.ts @@ -28,7 +28,7 @@ export function mssqlMetricsSpecProvider(context: TutorialContext): TutorialSche moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.mssqlMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from a Microsoft SQL Server instance', + defaultMessage: 'Collect metrics from Microsoft SQL Server instances with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.mssqlMetrics.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/munin_metrics/index.ts b/src/plugins/home/server/tutorials/munin_metrics/index.ts index 1abd321e4c738..12621d05d0766 100644 --- a/src/plugins/home/server/tutorials/munin_metrics/index.ts +++ b/src/plugins/home/server/tutorials/munin_metrics/index.ts @@ -23,18 +23,18 @@ export function muninMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'muninMetrics', name: i18n.translate('home.tutorials.muninMetrics.nameTitle', { - defaultMessage: 'Munin metrics', + defaultMessage: 'Munin Metrics', }), moduleName, euiIconType: '/plugins/home/assets/logos/munin.svg', isBeta: true, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.muninMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Munin server.', + defaultMessage: 'Collect metrics from Munin servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.muninMetrics.longDescription', { defaultMessage: - 'The `munin` Metricbeat module fetches internal metrics from Munin. \ + 'The `munin` Metricbeat module fetches metrics from Munin. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-munin.html', diff --git a/src/plugins/home/server/tutorials/mysql_logs/index.ts b/src/plugins/home/server/tutorials/mysql_logs/index.ts index a788e736d2964..b0c6f0e69dcfb 100644 --- a/src/plugins/home/server/tutorials/mysql_logs/index.ts +++ b/src/plugins/home/server/tutorials/mysql_logs/index.ts @@ -24,12 +24,12 @@ export function mysqlLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'mysqlLogs', name: i18n.translate('home.tutorials.mysqlLogs.nameTitle', { - defaultMessage: 'MySQL logs', + defaultMessage: 'MySQL Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.mysqlLogs.shortDescription', { - defaultMessage: 'Collect and parse error and slow logs created by MySQL.', + defaultMessage: 'Collect and parse logs from MySQL servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.mysqlLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/mysql_metrics/index.ts b/src/plugins/home/server/tutorials/mysql_metrics/index.ts index 078a96f8110df..09c55dc81ff84 100644 --- a/src/plugins/home/server/tutorials/mysql_metrics/index.ts +++ b/src/plugins/home/server/tutorials/mysql_metrics/index.ts @@ -23,16 +23,16 @@ export function mysqlMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'mysqlMetrics', name: i18n.translate('home.tutorials.mysqlMetrics.nameTitle', { - defaultMessage: 'MySQL metrics', + defaultMessage: 'MySQL Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.mysqlMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from MySQL.', + defaultMessage: 'Collect metrics from MySQL servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.mysqlMetrics.longDescription', { defaultMessage: - 'The `mysql` Metricbeat module fetches internal metrics from the MySQL server. \ + 'The `mysql` Metricbeat module fetches metrics from MySQL server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-mysql.html', diff --git a/src/plugins/home/server/tutorials/nats_logs/index.ts b/src/plugins/home/server/tutorials/nats_logs/index.ts index a1dc24080bc0d..b6ef0a192d92f 100644 --- a/src/plugins/home/server/tutorials/nats_logs/index.ts +++ b/src/plugins/home/server/tutorials/nats_logs/index.ts @@ -24,13 +24,13 @@ export function natsLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'natsLogs', name: i18n.translate('home.tutorials.natsLogs.nameTitle', { - defaultMessage: 'NATS logs', + defaultMessage: 'NATS Logs', }), moduleName, category: TutorialsCategory.LOGGING, isBeta: true, shortDescription: i18n.translate('home.tutorials.natsLogs.shortDescription', { - defaultMessage: 'Collect and parse logs created by Nats.', + defaultMessage: 'Collect and parse logs from NATS servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.natsLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/nats_metrics/index.ts b/src/plugins/home/server/tutorials/nats_metrics/index.ts index 11494e5dc57d0..54f034ad44b19 100644 --- a/src/plugins/home/server/tutorials/nats_metrics/index.ts +++ b/src/plugins/home/server/tutorials/nats_metrics/index.ts @@ -23,16 +23,16 @@ export function natsMetricsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'natsMetrics', name: i18n.translate('home.tutorials.natsMetrics.nameTitle', { - defaultMessage: 'NATS metrics', + defaultMessage: 'NATS Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.natsMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from the Nats server.', + defaultMessage: 'Collect metrics from NATS servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.natsMetrics.longDescription', { defaultMessage: - 'The `nats` Metricbeat module fetches monitoring metrics from Nats. \ + 'The `nats` Metricbeat module fetches metrics from Nats. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-nats.html', diff --git a/src/plugins/home/server/tutorials/netflow_logs/index.ts b/src/plugins/home/server/tutorials/netflow_logs/index.ts index e8404e93ae355..c659d9c1d31b1 100644 --- a/src/plugins/home/server/tutorials/netflow_logs/index.ts +++ b/src/plugins/home/server/tutorials/netflow_logs/index.ts @@ -24,12 +24,12 @@ export function netflowLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'netflowLogs', name: i18n.translate('home.tutorials.netflowLogs.nameTitle', { - defaultMessage: 'NetFlow / IPFIX Collector', + defaultMessage: 'NetFlow / IPFIX Records', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.netflowLogs.shortDescription', { - defaultMessage: 'Collect NetFlow and IPFIX flow records.', + defaultMessage: 'Collect records from NetFlow and IPFIX flow with Filebeat.', }), longDescription: i18n.translate('home.tutorials.netflowLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/netscout_logs/index.ts b/src/plugins/home/server/tutorials/netscout_logs/index.ts index 395fbb8b49d39..e6c22947f8057 100644 --- a/src/plugins/home/server/tutorials/netscout_logs/index.ts +++ b/src/plugins/home/server/tutorials/netscout_logs/index.ts @@ -24,12 +24,12 @@ export function netscoutLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'netscoutLogs', name: i18n.translate('home.tutorials.netscoutLogs.nameTitle', { - defaultMessage: 'Arbor Peakflow logs', + defaultMessage: 'Arbor Peakflow Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.netscoutLogs.shortDescription', { - defaultMessage: 'Collect Netscout Arbor Peakflow SP logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Netscout Arbor Peakflow SP with Filebeat.', }), longDescription: i18n.translate('home.tutorials.netscoutLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/nginx_logs/index.ts b/src/plugins/home/server/tutorials/nginx_logs/index.ts index 90ec6737c2461..e6f2fc4efb01c 100644 --- a/src/plugins/home/server/tutorials/nginx_logs/index.ts +++ b/src/plugins/home/server/tutorials/nginx_logs/index.ts @@ -24,12 +24,12 @@ export function nginxLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'nginxLogs', name: i18n.translate('home.tutorials.nginxLogs.nameTitle', { - defaultMessage: 'Nginx logs', + defaultMessage: 'Nginx Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.nginxLogs.shortDescription', { - defaultMessage: 'Collect and parse access and error logs created by the Nginx HTTP server.', + defaultMessage: 'Collect and parse logs from Nginx HTTP servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.nginxLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/nginx_metrics/index.ts b/src/plugins/home/server/tutorials/nginx_metrics/index.ts index 12f67a26dcf29..680dd664912d3 100644 --- a/src/plugins/home/server/tutorials/nginx_metrics/index.ts +++ b/src/plugins/home/server/tutorials/nginx_metrics/index.ts @@ -23,16 +23,16 @@ export function nginxMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'nginxMetrics', name: i18n.translate('home.tutorials.nginxMetrics.nameTitle', { - defaultMessage: 'Nginx metrics', + defaultMessage: 'Nginx Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.nginxMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the Nginx HTTP server.', + defaultMessage: 'Collect metrics from Nginx HTTP servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.nginxMetrics.longDescription', { defaultMessage: - 'The `nginx` Metricbeat module fetches internal metrics from the Nginx HTTP server. \ + 'The `nginx` Metricbeat module fetches metrics from Nginx HTTP server. \ The module scrapes the server status data from the web page generated by the \ {statusModuleLink}, \ which must be enabled in your Nginx installation. \ diff --git a/src/plugins/home/server/tutorials/o365_logs/index.ts b/src/plugins/home/server/tutorials/o365_logs/index.ts index e3663e2c3cd78..3cd4d3a5c5e18 100644 --- a/src/plugins/home/server/tutorials/o365_logs/index.ts +++ b/src/plugins/home/server/tutorials/o365_logs/index.ts @@ -24,12 +24,12 @@ export function o365LogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'o365Logs', name: i18n.translate('home.tutorials.o365Logs.nameTitle', { - defaultMessage: 'Office 365 logs', + defaultMessage: 'Office 365 Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.o365Logs.shortDescription', { - defaultMessage: 'Collect Office 365 activity logs via the Office 365 API.', + defaultMessage: 'Collect and parse logs from Office 365 with Filebeat.', }), longDescription: i18n.translate('home.tutorials.o365Logs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/okta_logs/index.ts b/src/plugins/home/server/tutorials/okta_logs/index.ts index 62cde4b5128c3..aad18409de329 100644 --- a/src/plugins/home/server/tutorials/okta_logs/index.ts +++ b/src/plugins/home/server/tutorials/okta_logs/index.ts @@ -24,12 +24,12 @@ export function oktaLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'oktaLogs', name: i18n.translate('home.tutorials.oktaLogs.nameTitle', { - defaultMessage: 'Okta logs', + defaultMessage: 'Okta Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.oktaLogs.shortDescription', { - defaultMessage: 'Collect the Okta system log via the Okta API.', + defaultMessage: 'Collect and parse logs from the Okta API with Filebeat.', }), longDescription: i18n.translate('home.tutorials.oktaLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts b/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts index acbddf5169881..02625b341549b 100644 --- a/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts +++ b/src/plugins/home/server/tutorials/openmetrics_metrics/index.ts @@ -23,12 +23,13 @@ export function openmetricsMetricsSpecProvider(context: TutorialContext): Tutori return { id: 'openmetricsMetrics', name: i18n.translate('home.tutorials.openmetricsMetrics.nameTitle', { - defaultMessage: 'OpenMetrics metrics', + defaultMessage: 'OpenMetrics Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.openmetricsMetrics.shortDescription', { - defaultMessage: 'Fetch metrics from an endpoint that serves metrics in OpenMetrics format.', + defaultMessage: + 'Collect metrics from an endpoint that serves metrics in OpenMetrics format with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.openmetricsMetrics.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/oracle_metrics/index.ts b/src/plugins/home/server/tutorials/oracle_metrics/index.ts index 42560a7b46225..bfb0452941bd4 100644 --- a/src/plugins/home/server/tutorials/oracle_metrics/index.ts +++ b/src/plugins/home/server/tutorials/oracle_metrics/index.ts @@ -23,17 +23,17 @@ export function oracleMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: moduleName + 'Metrics', name: i18n.translate('home.tutorials.oracleMetrics.nameTitle', { - defaultMessage: 'oracle metrics', + defaultMessage: 'oracle Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.oracleMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from a Oracle server.', + defaultMessage: 'Collect metrics from Oracle servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.oracleMetrics.longDescription', { defaultMessage: - 'The `{moduleName}` Metricbeat module fetches internal metrics from a Oracle server. \ + 'The `{moduleName}` Metricbeat module fetches metrics from a Oracle server. \ [Learn more]({learnMoreLink}).', values: { moduleName, diff --git a/src/plugins/home/server/tutorials/osquery_logs/index.ts b/src/plugins/home/server/tutorials/osquery_logs/index.ts index 6bacbed57792c..4f87fc4e256e1 100644 --- a/src/plugins/home/server/tutorials/osquery_logs/index.ts +++ b/src/plugins/home/server/tutorials/osquery_logs/index.ts @@ -24,12 +24,12 @@ export function osqueryLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'osqueryLogs', name: i18n.translate('home.tutorials.osqueryLogs.nameTitle', { - defaultMessage: 'Osquery logs', + defaultMessage: 'Osquery Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.osqueryLogs.shortDescription', { - defaultMessage: 'Collect osquery logs in JSON format.', + defaultMessage: 'Collect and parse logs from Osquery with Filebeat.', }), longDescription: i18n.translate('home.tutorials.osqueryLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/panw_logs/index.ts b/src/plugins/home/server/tutorials/panw_logs/index.ts index 3ca839556d756..f5158c48f30d5 100644 --- a/src/plugins/home/server/tutorials/panw_logs/index.ts +++ b/src/plugins/home/server/tutorials/panw_logs/index.ts @@ -24,13 +24,13 @@ export function panwLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'panwLogs', name: i18n.translate('home.tutorials.panwLogs.nameTitle', { - defaultMessage: 'Palo Alto Networks PAN-OS logs', + defaultMessage: 'Palo Alto Networks PAN-OS Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.panwLogs.shortDescription', { defaultMessage: - 'Collect Palo Alto Networks PAN-OS threat and traffic logs over syslog or from a log file.', + 'Collect and parse threat and traffic logs from Palo Alto Networks PAN-OS with Filebeat.', }), longDescription: i18n.translate('home.tutorials.panwLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/php_fpm_metrics/index.ts b/src/plugins/home/server/tutorials/php_fpm_metrics/index.ts index ed67960ab5a1c..40b35984fb17a 100644 --- a/src/plugins/home/server/tutorials/php_fpm_metrics/index.ts +++ b/src/plugins/home/server/tutorials/php_fpm_metrics/index.ts @@ -23,17 +23,17 @@ export function phpfpmMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'phpfpmMetrics', name: i18n.translate('home.tutorials.phpFpmMetrics.nameTitle', { - defaultMessage: 'PHP-FPM metrics', + defaultMessage: 'PHP-FPM Metrics', }), moduleName, category: TutorialsCategory.METRICS, isBeta: false, shortDescription: i18n.translate('home.tutorials.phpFpmMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from PHP-FPM.', + defaultMessage: 'Collect metrics from PHP-FPM with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.phpFpmMetrics.longDescription', { defaultMessage: - 'The `php_fpm` Metricbeat module fetches internal metrics from the PHP-FPM server. \ + 'The `php_fpm` Metricbeat module fetches metrics from PHP-FPM server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-php_fpm.html', diff --git a/src/plugins/home/server/tutorials/postgresql_logs/index.ts b/src/plugins/home/server/tutorials/postgresql_logs/index.ts index c5f5d879ac35d..3a092e61b0bd9 100644 --- a/src/plugins/home/server/tutorials/postgresql_logs/index.ts +++ b/src/plugins/home/server/tutorials/postgresql_logs/index.ts @@ -24,12 +24,12 @@ export function postgresqlLogsSpecProvider(context: TutorialContext): TutorialSc return { id: 'postgresqlLogs', name: i18n.translate('home.tutorials.postgresqlLogs.nameTitle', { - defaultMessage: 'PostgreSQL logs', + defaultMessage: 'PostgreSQL Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.postgresqlLogs.shortDescription', { - defaultMessage: 'Collect and parse error and slow logs created by PostgreSQL.', + defaultMessage: 'Collect and parse logs from PostgreSQL servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.postgresqlLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/postgresql_metrics/index.ts b/src/plugins/home/server/tutorials/postgresql_metrics/index.ts index ca20efb44bca7..501ea252cd16f 100644 --- a/src/plugins/home/server/tutorials/postgresql_metrics/index.ts +++ b/src/plugins/home/server/tutorials/postgresql_metrics/index.ts @@ -23,17 +23,17 @@ export function postgresqlMetricsSpecProvider(context: TutorialContext): Tutoria return { id: 'postgresqlMetrics', name: i18n.translate('home.tutorials.postgresqlMetrics.nameTitle', { - defaultMessage: 'PostgreSQL metrics', + defaultMessage: 'PostgreSQL Metrics', }), moduleName, category: TutorialsCategory.METRICS, isBeta: false, shortDescription: i18n.translate('home.tutorials.postgresqlMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from PostgreSQL.', + defaultMessage: 'Collect metrics from PostgreSQL servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.postgresqlMetrics.longDescription', { defaultMessage: - 'The `postgresql` Metricbeat module fetches internal metrics from the PostgreSQL server. \ + 'The `postgresql` Metricbeat module fetches metrics from PostgreSQL server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-postgresql.html', diff --git a/src/plugins/home/server/tutorials/prometheus_metrics/index.ts b/src/plugins/home/server/tutorials/prometheus_metrics/index.ts index ee05770d65108..2f422e5e3be70 100644 --- a/src/plugins/home/server/tutorials/prometheus_metrics/index.ts +++ b/src/plugins/home/server/tutorials/prometheus_metrics/index.ts @@ -23,13 +23,13 @@ export function prometheusMetricsSpecProvider(context: TutorialContext): Tutoria return { id: moduleName + 'Metrics', name: i18n.translate('home.tutorials.prometheusMetrics.nameTitle', { - defaultMessage: 'Prometheus metrics', + defaultMessage: 'Prometheus Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.prometheusMetrics.shortDescription', { - defaultMessage: 'Fetch metrics from a Prometheus exporter.', + defaultMessage: 'Collect metrics from Prometheus exporters with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.prometheusMetrics.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts b/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts index 0fbdb48236832..8a1634e7da038 100644 --- a/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts +++ b/src/plugins/home/server/tutorials/rabbitmq_logs/index.ts @@ -24,12 +24,12 @@ export function rabbitmqLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'rabbitmqLogs', name: i18n.translate('home.tutorials.rabbitmqLogs.nameTitle', { - defaultMessage: 'RabbitMQ logs', + defaultMessage: 'RabbitMQ Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.rabbitmqLogs.shortDescription', { - defaultMessage: 'Collect RabbitMQ logs.', + defaultMessage: 'Collect and parse logs from RabbitMQ servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.rabbitmqLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts b/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts index b58f936f205b2..abfc895088d91 100644 --- a/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts +++ b/src/plugins/home/server/tutorials/rabbitmq_metrics/index.ts @@ -23,16 +23,16 @@ export function rabbitmqMetricsSpecProvider(context: TutorialContext): TutorialS return { id: 'rabbitmqMetrics', name: i18n.translate('home.tutorials.rabbitmqMetrics.nameTitle', { - defaultMessage: 'RabbitMQ metrics', + defaultMessage: 'RabbitMQ Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.rabbitmqMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the RabbitMQ server.', + defaultMessage: 'Collect metrics from RabbitMQ servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.rabbitmqMetrics.longDescription', { defaultMessage: - 'The `rabbitmq` Metricbeat module fetches internal metrics from the RabbitMQ server. \ + 'The `rabbitmq` Metricbeat module fetches metrics from RabbitMQ server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-rabbitmq.html', diff --git a/src/plugins/home/server/tutorials/radware_logs/index.ts b/src/plugins/home/server/tutorials/radware_logs/index.ts index 28392cf9c4362..3e918a0a4064c 100644 --- a/src/plugins/home/server/tutorials/radware_logs/index.ts +++ b/src/plugins/home/server/tutorials/radware_logs/index.ts @@ -24,12 +24,12 @@ export function radwareLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'radwareLogs', name: i18n.translate('home.tutorials.radwareLogs.nameTitle', { - defaultMessage: 'Radware DefensePro logs', + defaultMessage: 'Radware DefensePro Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.radwareLogs.shortDescription', { - defaultMessage: 'Collect Radware DefensePro logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Radware DefensePro with Filebeat.', }), longDescription: i18n.translate('home.tutorials.radwareLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/redis_logs/index.ts b/src/plugins/home/server/tutorials/redis_logs/index.ts index 0f3a5aa812f49..f6aada27dec48 100644 --- a/src/plugins/home/server/tutorials/redis_logs/index.ts +++ b/src/plugins/home/server/tutorials/redis_logs/index.ts @@ -24,12 +24,12 @@ export function redisLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'redisLogs', name: i18n.translate('home.tutorials.redisLogs.nameTitle', { - defaultMessage: 'Redis logs', + defaultMessage: 'Redis Logs', }), moduleName, category: TutorialsCategory.LOGGING, shortDescription: i18n.translate('home.tutorials.redisLogs.shortDescription', { - defaultMessage: 'Collect and parse error and slow logs created by Redis.', + defaultMessage: 'Collect and parse logs from Redis servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.redisLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/redis_metrics/index.ts b/src/plugins/home/server/tutorials/redis_metrics/index.ts index 1b4ee7290a6d0..2bb300c48ff65 100644 --- a/src/plugins/home/server/tutorials/redis_metrics/index.ts +++ b/src/plugins/home/server/tutorials/redis_metrics/index.ts @@ -23,16 +23,16 @@ export function redisMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'redisMetrics', name: i18n.translate('home.tutorials.redisMetrics.nameTitle', { - defaultMessage: 'Redis metrics', + defaultMessage: 'Redis Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.redisMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from Redis.', + defaultMessage: 'Collect metrics from Redis servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.redisMetrics.longDescription', { defaultMessage: - 'The `redis` Metricbeat module fetches internal metrics from the Redis server. \ + 'The `redis` Metricbeat module fetches metrics from Redis server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-redis.html', diff --git a/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts b/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts index be8de9c3eab4d..62e1386f29dbb 100644 --- a/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts +++ b/src/plugins/home/server/tutorials/redisenterprise_metrics/index.ts @@ -23,16 +23,16 @@ export function redisenterpriseMetricsSpecProvider(context: TutorialContext): Tu return { id: 'redisenterpriseMetrics', name: i18n.translate('home.tutorials.redisenterpriseMetrics.nameTitle', { - defaultMessage: 'Redis Enterprise metrics', + defaultMessage: 'Redis Enterprise Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.redisenterpriseMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from Redis Enterprise Server.', + defaultMessage: 'Collect metrics from Redis Enterprise servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.redisenterpriseMetrics.longDescription', { defaultMessage: - 'The `redisenterprise` Metricbeat module fetches monitoring metrics from Redis Enterprise Server \ + 'The `redisenterprise` Metricbeat module fetches metrics from Redis Enterprise Server \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-redisenterprise.html', diff --git a/src/plugins/home/server/tutorials/santa_logs/index.ts b/src/plugins/home/server/tutorials/santa_logs/index.ts index 10d1506438b62..da9f2e940066e 100644 --- a/src/plugins/home/server/tutorials/santa_logs/index.ts +++ b/src/plugins/home/server/tutorials/santa_logs/index.ts @@ -24,12 +24,12 @@ export function santaLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'santaLogs', name: i18n.translate('home.tutorials.santaLogs.nameTitle', { - defaultMessage: 'Google Santa logs', + defaultMessage: 'Google Santa Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.santaLogs.shortDescription', { - defaultMessage: 'Collect Google Santa logs about process executions on MacOS.', + defaultMessage: 'Collect and parse logs from Google Santa systems with Filebeat.', }), longDescription: i18n.translate('home.tutorials.santaLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/sonicwall_logs/index.ts b/src/plugins/home/server/tutorials/sonicwall_logs/index.ts index 1fa711327a07d..04bf7a3968320 100644 --- a/src/plugins/home/server/tutorials/sonicwall_logs/index.ts +++ b/src/plugins/home/server/tutorials/sonicwall_logs/index.ts @@ -24,12 +24,12 @@ export function sonicwallLogsSpecProvider(context: TutorialContext): TutorialSch return { id: 'sonicwallLogs', name: i18n.translate('home.tutorials.sonicwallLogs.nameTitle', { - defaultMessage: 'Sonicwall FW logs', + defaultMessage: 'Sonicwall FW Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.sonicwallLogs.shortDescription', { - defaultMessage: 'Collect Sonicwall-FW logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Sonicwall-FW with Filebeat.', }), longDescription: i18n.translate('home.tutorials.sonicwallLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/sophos_logs/index.ts b/src/plugins/home/server/tutorials/sophos_logs/index.ts index 35b27973a55ec..4fadcecb6e1bd 100644 --- a/src/plugins/home/server/tutorials/sophos_logs/index.ts +++ b/src/plugins/home/server/tutorials/sophos_logs/index.ts @@ -24,12 +24,12 @@ export function sophosLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'sophosLogs', name: i18n.translate('home.tutorials.sophosLogs.nameTitle', { - defaultMessage: 'Sophos logs', + defaultMessage: 'Sophos Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.sophosLogs.shortDescription', { - defaultMessage: 'Collect Sophos XG SFOS logs over syslog.', + defaultMessage: 'Collect and parse logs from Sophos XG SFOS with Filebeat.', }), longDescription: i18n.translate('home.tutorials.sophosLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/squid_logs/index.ts b/src/plugins/home/server/tutorials/squid_logs/index.ts index d8d0bb6c0829b..2d8f055d7fa6b 100644 --- a/src/plugins/home/server/tutorials/squid_logs/index.ts +++ b/src/plugins/home/server/tutorials/squid_logs/index.ts @@ -24,12 +24,12 @@ export function squidLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'squidLogs', name: i18n.translate('home.tutorials.squidLogs.nameTitle', { - defaultMessage: 'Squid logs', + defaultMessage: 'Squid Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.squidLogs.shortDescription', { - defaultMessage: 'Collect Squid logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Squid servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.squidLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/stan_metrics/index.ts b/src/plugins/home/server/tutorials/stan_metrics/index.ts index ceb6084b539e6..0b3c0352b663d 100644 --- a/src/plugins/home/server/tutorials/stan_metrics/index.ts +++ b/src/plugins/home/server/tutorials/stan_metrics/index.ts @@ -23,16 +23,16 @@ export function stanMetricsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'stanMetrics', name: i18n.translate('home.tutorials.stanMetrics.nameTitle', { - defaultMessage: 'STAN metrics', + defaultMessage: 'STAN Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.stanMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from the STAN server.', + defaultMessage: 'Collect metrics from STAN servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.stanMetrics.longDescription', { defaultMessage: - 'The `stan` Metricbeat module fetches monitoring metrics from STAN. \ + 'The `stan` Metricbeat module fetches metrics from STAN. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-stan.html', diff --git a/src/plugins/home/server/tutorials/statsd_metrics/index.ts b/src/plugins/home/server/tutorials/statsd_metrics/index.ts index 472c1406db386..1be010a01d5a6 100644 --- a/src/plugins/home/server/tutorials/statsd_metrics/index.ts +++ b/src/plugins/home/server/tutorials/statsd_metrics/index.ts @@ -20,16 +20,16 @@ export function statsdMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'statsdMetrics', name: i18n.translate('home.tutorials.statsdMetrics.nameTitle', { - defaultMessage: 'Statsd metrics', + defaultMessage: 'Statsd Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.statsdMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from statsd.', + defaultMessage: 'Collect metrics from Statsd servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.statsdMetrics.longDescription', { defaultMessage: - 'The `statsd` Metricbeat module fetches monitoring metrics from statsd. \ + 'The `statsd` Metricbeat module fetches metrics from statsd. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-statsd.html', diff --git a/src/plugins/home/server/tutorials/suricata_logs/index.ts b/src/plugins/home/server/tutorials/suricata_logs/index.ts index 3bb2b93b6301a..373522e333379 100644 --- a/src/plugins/home/server/tutorials/suricata_logs/index.ts +++ b/src/plugins/home/server/tutorials/suricata_logs/index.ts @@ -24,12 +24,12 @@ export function suricataLogsSpecProvider(context: TutorialContext): TutorialSche return { id: 'suricataLogs', name: i18n.translate('home.tutorials.suricataLogs.nameTitle', { - defaultMessage: 'Suricata logs', + defaultMessage: 'Suricata Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.suricataLogs.shortDescription', { - defaultMessage: 'Collect Suricata IDS/IPS/NSM logs.', + defaultMessage: 'Collect and parse logs from Suricata IDS/IPS/NSM with Filebeat.', }), longDescription: i18n.translate('home.tutorials.suricataLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/system_logs/index.ts b/src/plugins/home/server/tutorials/system_logs/index.ts index 6f403a6d0a71a..fcc5745f48252 100644 --- a/src/plugins/home/server/tutorials/system_logs/index.ts +++ b/src/plugins/home/server/tutorials/system_logs/index.ts @@ -24,7 +24,7 @@ export function systemLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'systemLogs', name: i18n.translate('home.tutorials.systemLogs.nameTitle', { - defaultMessage: 'System logs', + defaultMessage: 'System Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, diff --git a/src/plugins/home/server/tutorials/system_metrics/index.ts b/src/plugins/home/server/tutorials/system_metrics/index.ts index 08979a3d3b003..1348535d9bb72 100644 --- a/src/plugins/home/server/tutorials/system_metrics/index.ts +++ b/src/plugins/home/server/tutorials/system_metrics/index.ts @@ -23,16 +23,17 @@ export function systemMetricsSpecProvider(context: TutorialContext): TutorialSch return { id: 'systemMetrics', name: i18n.translate('home.tutorials.systemMetrics.nameTitle', { - defaultMessage: 'System metrics', + defaultMessage: 'System Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.systemMetrics.shortDescription', { - defaultMessage: 'Collect CPU, memory, network, and disk statistics from the host.', + defaultMessage: + 'Collect CPU, memory, network, and disk metrics from System hosts with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.systemMetrics.longDescription', { defaultMessage: - 'The `system` Metricbeat module collects CPU, memory, network, and disk statistics from the host. \ + 'The `system` Metricbeat module collects CPU, memory, network, and disk statistics from host. \ It collects system wide statistics and statistics per process and filesystem. \ [Learn more]({learnMoreLink}).', values: { diff --git a/src/plugins/home/server/tutorials/tomcat_logs/index.ts b/src/plugins/home/server/tutorials/tomcat_logs/index.ts index 5ce4096ad4628..3258d3eff5a16 100644 --- a/src/plugins/home/server/tutorials/tomcat_logs/index.ts +++ b/src/plugins/home/server/tutorials/tomcat_logs/index.ts @@ -24,12 +24,12 @@ export function tomcatLogsSpecProvider(context: TutorialContext): TutorialSchema return { id: 'tomcatLogs', name: i18n.translate('home.tutorials.tomcatLogs.nameTitle', { - defaultMessage: 'Tomcat logs', + defaultMessage: 'Tomcat Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.tomcatLogs.shortDescription', { - defaultMessage: 'Collect Apache Tomcat logs over syslog or from a file.', + defaultMessage: 'Collect and parse logs from Apache Tomcat servers with Filebeat.', }), longDescription: i18n.translate('home.tutorials.tomcatLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/traefik_logs/index.ts b/src/plugins/home/server/tutorials/traefik_logs/index.ts index 6bbc905bbd6aa..30b9db4022137 100644 --- a/src/plugins/home/server/tutorials/traefik_logs/index.ts +++ b/src/plugins/home/server/tutorials/traefik_logs/index.ts @@ -24,12 +24,12 @@ export function traefikLogsSpecProvider(context: TutorialContext): TutorialSchem return { id: 'traefikLogs', name: i18n.translate('home.tutorials.traefikLogs.nameTitle', { - defaultMessage: 'Traefik logs', + defaultMessage: 'Traefik Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.traefikLogs.shortDescription', { - defaultMessage: 'Collect Traefik access logs.', + defaultMessage: 'Collect and parse logs from Traefik with Filebeat.', }), longDescription: i18n.translate('home.tutorials.traefikLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/traefik_metrics/index.ts b/src/plugins/home/server/tutorials/traefik_metrics/index.ts index 35d54317c8ede..6f76be3056110 100644 --- a/src/plugins/home/server/tutorials/traefik_metrics/index.ts +++ b/src/plugins/home/server/tutorials/traefik_metrics/index.ts @@ -20,16 +20,16 @@ export function traefikMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'traefikMetrics', name: i18n.translate('home.tutorials.traefikMetrics.nameTitle', { - defaultMessage: 'Traefik metrics', + defaultMessage: 'Traefik Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.traefikMetrics.shortDescription', { - defaultMessage: 'Fetch monitoring metrics from Traefik.', + defaultMessage: 'Collect metrics from Traefik with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.traefikMetrics.longDescription', { defaultMessage: - 'The `traefik` Metricbeat module fetches monitoring metrics from Traefik. \ + 'The `traefik` Metricbeat module fetches metrics from Traefik. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-traefik.html', diff --git a/src/plugins/home/server/tutorials/uptime_monitors/index.ts b/src/plugins/home/server/tutorials/uptime_monitors/index.ts index 6e949d5410115..118174d0e5717 100644 --- a/src/plugins/home/server/tutorials/uptime_monitors/index.ts +++ b/src/plugins/home/server/tutorials/uptime_monitors/index.ts @@ -28,7 +28,7 @@ export function uptimeMonitorsSpecProvider(context: TutorialContext): TutorialSc moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.uptimeMonitors.shortDescription', { - defaultMessage: 'Monitor services for their availability', + defaultMessage: 'Monitor availability of the services with Heartbeat.', }), longDescription: i18n.translate('home.tutorials.uptimeMonitors.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts b/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts index d9cfcc9f7fb75..b1dbeb89bdb26 100644 --- a/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts +++ b/src/plugins/home/server/tutorials/uwsgi_metrics/index.ts @@ -23,16 +23,16 @@ export function uwsgiMetricsSpecProvider(context: TutorialContext): TutorialSche return { id: 'uwsgiMetrics', name: i18n.translate('home.tutorials.uwsgiMetrics.nameTitle', { - defaultMessage: 'uWSGI metrics', + defaultMessage: 'uWSGI Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.uwsgiMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from the uWSGI server.', + defaultMessage: 'Collect metrics from uWSGI servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.uwsgiMetrics.longDescription', { defaultMessage: - 'The `uwsgi` Metricbeat module fetches internal metrics from the uWSGI server. \ + 'The `uwsgi` Metricbeat module fetches metrics from uWSGI server. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-uwsgi.html', diff --git a/src/plugins/home/server/tutorials/vsphere_metrics/index.ts b/src/plugins/home/server/tutorials/vsphere_metrics/index.ts index bcbcec59c36e4..14a574872221a 100644 --- a/src/plugins/home/server/tutorials/vsphere_metrics/index.ts +++ b/src/plugins/home/server/tutorials/vsphere_metrics/index.ts @@ -23,16 +23,16 @@ export function vSphereMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'vsphereMetrics', name: i18n.translate('home.tutorials.vsphereMetrics.nameTitle', { - defaultMessage: 'vSphere metrics', + defaultMessage: 'vSphere Metrics', }), moduleName, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.vsphereMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from vSphere.', + defaultMessage: 'Collect metrics from vSphere with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.vsphereMetrics.longDescription', { defaultMessage: - 'The `vsphere` Metricbeat module fetches internal metrics from a vSphere cluster. \ + 'The `vsphere` Metricbeat module fetches metrics from a vSphere cluster. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-vsphere.html', diff --git a/src/plugins/home/server/tutorials/windows_event_logs/index.ts b/src/plugins/home/server/tutorials/windows_event_logs/index.ts index 0df7fa906e085..008468487ea64 100644 --- a/src/plugins/home/server/tutorials/windows_event_logs/index.ts +++ b/src/plugins/home/server/tutorials/windows_event_logs/index.ts @@ -23,17 +23,17 @@ export function windowsEventLogsSpecProvider(context: TutorialContext): Tutorial return { id: 'windowsEventLogs', name: i18n.translate('home.tutorials.windowsEventLogs.nameTitle', { - defaultMessage: 'Windows Event Log', + defaultMessage: 'Windows Event Logs', }), moduleName, isBeta: false, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.windowsEventLogs.shortDescription', { - defaultMessage: 'Fetch logs from the Windows Event Log.', + defaultMessage: 'Collect and parse logs from Windows Event Logs with WinLogBeat.', }), longDescription: i18n.translate('home.tutorials.windowsEventLogs.longDescription', { defaultMessage: - 'Use Winlogbeat to collect the logs from the Windows Event Log. \ + 'Use Winlogbeat to collect the logs from Windows Event Logs. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.winlogbeat}/index.html', diff --git a/src/plugins/home/server/tutorials/windows_metrics/index.ts b/src/plugins/home/server/tutorials/windows_metrics/index.ts index 6c663fbb13d4d..31d9b3f8962ce 100644 --- a/src/plugins/home/server/tutorials/windows_metrics/index.ts +++ b/src/plugins/home/server/tutorials/windows_metrics/index.ts @@ -23,17 +23,17 @@ export function windowsMetricsSpecProvider(context: TutorialContext): TutorialSc return { id: 'windowsMetrics', name: i18n.translate('home.tutorials.windowsMetrics.nameTitle', { - defaultMessage: 'Windows metrics', + defaultMessage: 'Windows Metrics', }), moduleName, isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.windowsMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from Windows.', + defaultMessage: 'Collect metrics from Windows with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.windowsMetrics.longDescription', { defaultMessage: - 'The `windows` Metricbeat module fetches internal metrics from Windows. \ + 'The `windows` Metricbeat module fetches metrics from Windows. \ [Learn more]({learnMoreLink}).', values: { learnMoreLink: '{config.docs.beats.metricbeat}/metricbeat-module-windows.html', diff --git a/src/plugins/home/server/tutorials/zeek_logs/index.ts b/src/plugins/home/server/tutorials/zeek_logs/index.ts index 5434dcc8527ff..df86518978c52 100644 --- a/src/plugins/home/server/tutorials/zeek_logs/index.ts +++ b/src/plugins/home/server/tutorials/zeek_logs/index.ts @@ -24,12 +24,12 @@ export function zeekLogsSpecProvider(context: TutorialContext): TutorialSchema { return { id: 'zeekLogs', name: i18n.translate('home.tutorials.zeekLogs.nameTitle', { - defaultMessage: 'Zeek logs', + defaultMessage: 'Zeek Logs', }), moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.zeekLogs.shortDescription', { - defaultMessage: 'Collect Zeek network security monitoring logs.', + defaultMessage: 'Collect and parse logs from Zeek network security with Filebeat.', }), longDescription: i18n.translate('home.tutorials.zeekLogs.longDescription', { defaultMessage: diff --git a/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts b/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts index 85ca03acacfd4..8f732969a07f3 100644 --- a/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts +++ b/src/plugins/home/server/tutorials/zookeeper_metrics/index.ts @@ -23,18 +23,18 @@ export function zookeeperMetricsSpecProvider(context: TutorialContext): Tutorial return { id: moduleName + 'Metrics', name: i18n.translate('home.tutorials.zookeeperMetrics.nameTitle', { - defaultMessage: 'Zookeeper metrics', + defaultMessage: 'Zookeeper Metrics', }), moduleName, euiIconType: '/plugins/home/assets/logos/zookeeper.svg', isBeta: false, category: TutorialsCategory.METRICS, shortDescription: i18n.translate('home.tutorials.zookeeperMetrics.shortDescription', { - defaultMessage: 'Fetch internal metrics from a Zookeeper server.', + defaultMessage: 'Collect metrics from Zookeeper servers with Metricbeat.', }), longDescription: i18n.translate('home.tutorials.zookeeperMetrics.longDescription', { defaultMessage: - 'The `{moduleName}` Metricbeat module fetches internal metrics from a Zookeeper server. \ + 'The `{moduleName}` Metricbeat module fetches metrics from a Zookeeper server. \ [Learn more]({learnMoreLink}).', values: { moduleName, diff --git a/src/plugins/home/server/tutorials/zscaler_logs/index.ts b/src/plugins/home/server/tutorials/zscaler_logs/index.ts index a2eb41a257a92..977bbb242c62a 100644 --- a/src/plugins/home/server/tutorials/zscaler_logs/index.ts +++ b/src/plugins/home/server/tutorials/zscaler_logs/index.ts @@ -29,7 +29,7 @@ export function zscalerLogsSpecProvider(context: TutorialContext): TutorialSchem moduleName, category: TutorialsCategory.SECURITY_SOLUTION, shortDescription: i18n.translate('home.tutorials.zscalerLogs.shortDescription', { - defaultMessage: 'This is a module for receiving Zscaler NSS logs over Syslog or a file.', + defaultMessage: 'Collect and parse logs from Zscaler NSS with Filebeat.', }), longDescription: i18n.translate('home.tutorials.zscalerLogs.longDescription', { defaultMessage: diff --git a/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_index_list_prompt/empty_index_list_prompt.tsx b/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_index_list_prompt/empty_index_list_prompt.tsx index a550209095898..3afd7ef1ded6b 100644 --- a/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_index_list_prompt/empty_index_list_prompt.tsx +++ b/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_index_list_prompt/empty_index_list_prompt.tsx @@ -91,7 +91,7 @@ export const EmptyIndexListPrompt = ({ { - navigateToApp('home', { path: '/app/integrations/browse' }); + navigateToApp('integrations', { path: '/browse' }); closeFlyout(); }} icon={} diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx index 11961714e9f8a..bde7039a0a030 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -56,7 +56,7 @@ const confirmModalOptionsDelete = { export const EditIndexPattern = withRouter( ({ indexPattern, history, location }: EditIndexPatternProps) => { - const { uiSettings, overlays, chrome, data } = + const { application, uiSettings, overlays, chrome, data } = useKibana().services; const [fields, setFields] = useState(indexPattern.getNonScriptedFields()); const [conflictedFields, setConflictedFields] = useState( @@ -134,12 +134,14 @@ export const EditIndexPattern = withRouter( const showTagsSection = Boolean(indexPattern.timeFieldName || (tags && tags.length > 0)); const kibana = useKibana(); const docsUrl = kibana.services.docLinks!.links.elasticsearch.mapping; + const userEditPermission = !!application?.capabilities?.indexPatterns?.save; + return (
{showTagsSection && ( diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap index c03899554ffff..8b6e0a1682750 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/__snapshots__/indexed_fields_table.test.tsx.snap @@ -78,6 +78,7 @@ exports[`IndexedFieldsTable IndexedFieldsTable with rollup index pattern should "terms", ], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "Elastic", "searchable": true, @@ -96,6 +97,7 @@ exports[`IndexedFieldsTable IndexedFieldsTable with rollup index pattern should "date_histogram (interval: 30s, delay: 30s, UTC)", ], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "timestamp", "type": "date", @@ -111,6 +113,7 @@ exports[`IndexedFieldsTable IndexedFieldsTable with rollup index pattern should "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "conflictingField", "type": "keyword, long", @@ -133,6 +136,7 @@ exports[`IndexedFieldsTable IndexedFieldsTable with rollup index pattern should "value_count", ], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "amount", "type": "long", @@ -166,6 +170,7 @@ exports[`IndexedFieldsTable should filter based on the query bar 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "Elastic", "searchable": true, @@ -200,6 +205,7 @@ exports[`IndexedFieldsTable should filter based on the type filter 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "timestamp", "type": "date", @@ -233,6 +239,7 @@ exports[`IndexedFieldsTable should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "Elastic", "searchable": true, @@ -248,6 +255,7 @@ exports[`IndexedFieldsTable should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "timestamp", "type": "date", @@ -263,6 +271,7 @@ exports[`IndexedFieldsTable should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "conflictingField", "type": "keyword, long", @@ -277,6 +286,7 @@ exports[`IndexedFieldsTable should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": false, + "isUserEditable": false, "kbnType": undefined, "name": "amount", "type": "long", diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap index 95acb14282ba5..f876b15bc86c0 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/__snapshots__/table.test.tsx.snap @@ -105,6 +105,7 @@ exports[`Table should render normally 1`] = ` Object { "actions": Array [ Object { + "available": [Function], "data-test-subj": "editFieldFormat", "description": "Edit", "icon": "pencil", @@ -141,6 +142,7 @@ exports[`Table should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": true, + "isUserEditable": true, "kbnType": "string", "name": "Elastic", "searchable": true, @@ -152,6 +154,7 @@ exports[`Table should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": true, + "isUserEditable": true, "kbnType": "date", "name": "timestamp", "type": "date", @@ -162,6 +165,7 @@ exports[`Table should render normally 1`] = ` "hasRuntime": false, "info": Array [], "isMapped": true, + "isUserEditable": true, "kbnType": "conflict", "name": "conflictingField", "type": "text, long", @@ -172,10 +176,22 @@ exports[`Table should render normally 1`] = ` "hasRuntime": true, "info": Array [], "isMapped": false, + "isUserEditable": true, "kbnType": "text", "name": "customer", "type": "keyword", }, + Object { + "displayName": "noedit", + "excluded": false, + "hasRuntime": true, + "info": Array [], + "isMapped": false, + "isUserEditable": false, + "kbnType": "text", + "name": "noedit", + "type": "keyword", + }, ] } pagination={ diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx index 5fb2ba46882cc..71b2e59aefc81 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.test.tsx @@ -26,6 +26,7 @@ const items: IndexedFieldItem[] = [ kbnType: 'string', excluded: false, isMapped: true, + isUserEditable: true, hasRuntime: false, }, { @@ -36,6 +37,7 @@ const items: IndexedFieldItem[] = [ info: [], excluded: false, isMapped: true, + isUserEditable: true, hasRuntime: false, }, { @@ -46,6 +48,7 @@ const items: IndexedFieldItem[] = [ info: [], excluded: false, isMapped: true, + isUserEditable: true, hasRuntime: false, }, { @@ -56,6 +59,18 @@ const items: IndexedFieldItem[] = [ info: [], excluded: false, isMapped: false, + isUserEditable: true, + hasRuntime: true, + }, + { + name: 'noedit', + displayName: 'noedit', + type: 'keyword', + kbnType: 'text', + info: [], + excluded: false, + isMapped: false, + isUserEditable: false, hasRuntime: true, }, ]; @@ -114,6 +129,13 @@ describe('Table', () => { expect(editField).toBeCalled(); }); + test('should not allow edit or deletion for user with only read access', () => { + const editAvailable = renderTable().prop('columns')[6].actions[0].available(items[4]); + const deleteAvailable = renderTable().prop('columns')[7].actions[0].available(items[4]); + expect(editAvailable).toBeFalsy(); + expect(deleteAvailable).toBeFalsy(); + }); + test('render name', () => { const mappedField = { name: 'customer', @@ -122,6 +144,7 @@ describe('Table', () => { kbnType: 'string', type: 'keyword', isMapped: true, + isUserEditable: true, hasRuntime: false, }; @@ -134,6 +157,7 @@ describe('Table', () => { kbnType: 'string', type: 'keyword', isMapped: false, + isUserEditable: true, hasRuntime: true, }; diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx index 9448571facd43..4fdecff842c3f 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx @@ -319,6 +319,7 @@ export class Table extends PureComponent { onClick: editField, type: 'icon', 'data-test-subj': 'editFieldFormat', + available: (field) => field.isUserEditable, }, ], width: '40px', @@ -333,7 +334,7 @@ export class Table extends PureComponent { onClick: (field) => deleteField(field.name), type: 'icon', 'data-test-subj': 'deleteField', - available: (field) => !field.isMapped, + available: (field) => !field.isMapped && field.isUserEditable, }, ], width: '40px', diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx index 4928e3026d151..0427bfba7105d 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx @@ -7,7 +7,7 @@ */ import React from 'react'; -import { shallow } from 'enzyme'; +import { shallow, ShallowWrapper } from 'enzyme'; import { IndexPatternField, IndexPattern, IndexPatternType } from 'src/plugins/data/public'; import { IndexedFieldsTable } from './indexed_fields_table'; import { getFieldInfo } from '../../utils'; @@ -78,15 +78,21 @@ const fields = [ displayName: 'Elastic', searchable: true, esTypes: ['keyword'], + isUserEditable: true, }, - { name: 'timestamp', displayName: 'timestamp', esTypes: ['date'] }, - { name: 'conflictingField', displayName: 'conflictingField', esTypes: ['keyword', 'long'] }, - { name: 'amount', displayName: 'amount', esTypes: ['long'] }, + { name: 'timestamp', displayName: 'timestamp', esTypes: ['date'], isUserEditable: true }, + { + name: 'conflictingField', + displayName: 'conflictingField', + esTypes: ['keyword', 'long'], + isUserEditable: true, + }, + { name: 'amount', displayName: 'amount', esTypes: ['long'], isUserEditable: true }, ].map(mockFieldToIndexPatternField); describe('IndexedFieldsTable', () => { test('should render normally', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow( { indexedFieldTypeFilter="" fieldFilter="" /> - ); + ).dive(); await new Promise((resolve) => process.nextTick(resolve)); component.update(); @@ -106,7 +112,7 @@ describe('IndexedFieldsTable', () => { }); test('should filter based on the query bar', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow( { indexedFieldTypeFilter="" fieldFilter="" /> - ); + ).dive(); await new Promise((resolve) => process.nextTick(resolve)); component.setProps({ fieldFilter: 'Elast' }); @@ -127,7 +133,7 @@ describe('IndexedFieldsTable', () => { }); test('should filter based on the type filter', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow( { indexedFieldTypeFilter="" fieldFilter="" /> - ); + ).dive(); await new Promise((resolve) => process.nextTick(resolve)); component.setProps({ indexedFieldTypeFilter: 'date' }); @@ -149,7 +155,7 @@ describe('IndexedFieldsTable', () => { describe('IndexedFieldsTable with rollup index pattern', () => { test('should render normally', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow( { indexedFieldTypeFilter="" fieldFilter="" /> - ); + ).dive(); await new Promise((resolve) => process.nextTick(resolve)); component.update(); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx index 4e9aeb1874c89..b058ad4a7672c 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx @@ -9,8 +9,10 @@ import React, { Component } from 'react'; import { createSelector } from 'reselect'; import { IndexPatternField, IndexPattern } from '../../../../../../plugins/data/public'; +import { useKibana } from '../../../../../../plugins/kibana_react/public'; import { Table } from './components/table'; import { IndexedFieldItem } from './types'; +import { IndexPatternManagmentContext } from '../../../types'; interface IndexedFieldsTableProps { fields: IndexPatternField[]; @@ -23,16 +25,23 @@ interface IndexedFieldsTableProps { getFieldInfo: (indexPattern: IndexPattern, field: IndexPatternField) => string[]; }; fieldWildcardMatcher: (filters: any[]) => (val: any) => boolean; + userEditPermission: boolean; } interface IndexedFieldsTableState { fields: IndexedFieldItem[]; } -export class IndexedFieldsTable extends Component< - IndexedFieldsTableProps, - IndexedFieldsTableState -> { +const withHooks = (Comp: typeof Component) => { + return (props: any) => { + const { application } = useKibana().services; + const userEditPermission = !!application?.capabilities?.indexPatterns?.save; + + return ; + }; +}; + +class IndexedFields extends Component { constructor(props: IndexedFieldsTableProps) { super(props); @@ -50,7 +59,7 @@ export class IndexedFieldsTable extends Component< } mapFields(fields: IndexPatternField[]): IndexedFieldItem[] { - const { indexPattern, fieldWildcardMatcher, helpers } = this.props; + const { indexPattern, fieldWildcardMatcher, helpers, userEditPermission } = this.props; const sourceFilters = indexPattern.sourceFilters && indexPattern.sourceFilters.map((f: Record) => f.value); @@ -68,6 +77,7 @@ export class IndexedFieldsTable extends Component< excluded: fieldWildcardMatch ? fieldWildcardMatch(field.name) : false, info: helpers.getFieldInfo && helpers.getFieldInfo(indexPattern, field), isMapped: !!field.isMapped, + isUserEditable: userEditPermission, hasRuntime: !!field.runtimeField, }; })) || @@ -114,3 +124,5 @@ export class IndexedFieldsTable extends Component< ); } } + +export const IndexedFieldsTable = withHooks(IndexedFields); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts index 662134a003eb6..c5ac96ad149cc 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts @@ -16,5 +16,6 @@ export interface IndexedFieldItem extends IndexedFieldItemBase { excluded: boolean; kbnType: string; isMapped: boolean; + isUserEditable: boolean; hasRuntime: boolean; } diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap index c0ecc441e9018..95be4d4a7d632 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/__snapshots__/scripted_field_table.test.tsx.snap @@ -27,11 +27,13 @@ exports[`ScriptedFieldsTable should filter based on the lang filter 1`] = ` items={ Array [ Object { + "isUserEditable": false, "lang": "painless", "name": "ScriptedField", "script": "x++", }, Object { + "isUserEditable": false, "lang": "painless", "name": "JustATest", "script": "z++", @@ -65,6 +67,7 @@ exports[`ScriptedFieldsTable should filter based on the query bar 1`] = ` items={ Array [ Object { + "isUserEditable": false, "lang": "painless", "name": "JustATest", "script": "z++", @@ -123,11 +126,13 @@ exports[`ScriptedFieldsTable should render normally 1`] = ` items={ Array [ Object { + "isUserEditable": false, "lang": "painless", "name": "ScriptedField", "script": "x++", }, Object { + "isUserEditable": false, "lang": "painless", "name": "JustATest", "script": "z++", @@ -161,11 +166,13 @@ exports[`ScriptedFieldsTable should show a delete modal 1`] = ` items={ Array [ Object { + "isUserEditable": false, "lang": "painless", "name": "ScriptedField", "script": "x++", }, Object { + "isUserEditable": false, "lang": "painless", "name": "JustATest", "script": "z++", diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/__snapshots__/header.test.tsx.snap b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/__snapshots__/header.test.tsx.snap index f4eb2a0e74089..e9916bc1bdeec 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/__snapshots__/header.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/__snapshots__/header.test.tsx.snap @@ -6,23 +6,7 @@ exports[`Header should render normally 1`] = ` Object { "action": "PUSH", "block": [MockFunction], - "createHref": [MockFunction] { - "calls": Array [ - Array [ - Object { - "hash": "", - "pathname": "patterns/test/create-field/", - "search": "", - }, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": undefined, - }, - ], - }, + "createHref": [MockFunction], "createSubHistory": [MockFunction], "go": [MockFunction], "goBack": [MockFunction], @@ -136,69 +120,6 @@ exports[`Header should render normally 1`] = `
- -
- - - - - -
-
diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.tsx index 22da83b179652..a5930e14f0a0d 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.tsx @@ -22,7 +22,9 @@ interface HeaderProps extends RouteComponentProps { } export const Header = withRouter(({ indexPatternId, history }: HeaderProps) => { - const docLinks = useKibana().services.docLinks?.links; + const { application, docLinks } = useKibana().services; + const links = docLinks?.links; + const userEditPermission = !!application?.capabilities?.indexPatterns?.save; return ( @@ -39,7 +41,7 @@ export const Header = withRouter(({ indexPatternId, history }: HeaderProps) => { defaultMessage="Scripted fields are deprecated. Use {runtimeDocs} instead." values={{ runtimeDocs: ( - + { - - - - - + {userEditPermission && ( + + + + + + )} ); }); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/__snapshots__/table.test.tsx.snap b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/__snapshots__/table.test.tsx.snap index 8439887dd468a..c312ae5ecbbe6 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/__snapshots__/table.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/__snapshots__/table.test.tsx.snap @@ -37,6 +37,7 @@ exports[`Table should render normally 1`] = ` Object { "actions": Array [ Object { + "available": [Function], "description": "Edit this field", "icon": "pencil", "name": "Edit", @@ -44,6 +45,7 @@ exports[`Table should render normally 1`] = ` "type": "icon", }, Object { + "available": [Function], "color": "danger", "description": "Delete this field", "icon": "trash", @@ -60,10 +62,17 @@ exports[`Table should render normally 1`] = ` items={ Array [ Object { - "lang": "Elastic", + "isUserEditable": true, + "lang": "painless", "name": "1", "script": "", }, + Object { + "isUserEditable": false, + "lang": "painless", + "name": "2", + "script": "", + }, ] } pagination={ diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.test.tsx index 5a9f4eb871181..7b53b9a6c20c5 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.test.tsx @@ -15,8 +15,10 @@ import { IIndexPattern } from 'src/plugins/data/public'; const getIndexPatternMock = (mockedFields: any = {}) => ({ ...mockedFields } as IIndexPattern); -// @ts-expect-error invalid lang type -const items: ScriptedFieldItem[] = [{ name: '1', lang: 'Elastic', script: '' }]; +const items: ScriptedFieldItem[] = [ + { name: '1', lang: 'painless', script: '', isUserEditable: true }, + { name: '2', lang: 'painless', script: '', isUserEditable: false }, +]; describe('Table', () => { let indexPattern: IIndexPattern; @@ -93,4 +95,19 @@ describe('Table', () => { component.prop('columns')[4].actions[1].onClick(); expect(deleteField).toBeCalled(); }); + + test('should not allow edit or deletion for user with only read access', () => { + const component = shallow( + {}} + deleteField={() => {}} + /> + ); + const editAvailable = component.prop('columns')[4].actions[0].available(items[1]); + const deleteAvailable = component.prop('columns')[4].actions[1].available(items[1]); + expect(editAvailable).toBeFalsy(); + expect(deleteAvailable).toBeFalsy(); + }); }); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx index 3fcc2ebb0b93e..5064f40f43297 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx @@ -106,6 +106,7 @@ export class Table extends PureComponent { ), icon: 'pencil', onClick: editField, + available: (field) => !!field.isUserEditable, }, { type: 'icon', @@ -122,6 +123,7 @@ export class Table extends PureComponent { icon: 'trash', color: 'danger', onClick: deleteField, + available: (field) => !!field.isUserEditable, }, ], width: '40px', diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx index 1f5220aa01c44..d797da7221575 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx @@ -7,7 +7,7 @@ */ import React from 'react'; -import { shallow } from 'enzyme'; +import { shallow, ShallowWrapper } from 'enzyme'; import { ScriptedFieldsTable } from '../scripted_fields_table'; import { IIndexPattern, IndexPattern } from '../../../../../../plugins/data/common'; @@ -48,21 +48,28 @@ describe('ScriptedFieldsTable', () => { beforeEach(() => { indexPattern = getIndexPatternMock({ getScriptedFields: () => [ - { name: 'ScriptedField', lang: 'painless', script: 'x++' }, - { name: 'JustATest', lang: 'painless', script: 'z++' }, + { isUserEditable: true, name: 'ScriptedField', lang: 'painless', script: 'x++' }, + { + isUserEditable: false, + name: 'JustATest', + lang: 'painless', + script: 'z++', + }, ], }) as IndexPattern; }); test('should render normally', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow< + typeof ScriptedFieldsTable + >( {}} /> - ); + ).dive(); // Allow the componentWillMount code to execute // https://github.com/airbnb/enzyme/issues/450 @@ -73,14 +80,14 @@ describe('ScriptedFieldsTable', () => { }); test('should filter based on the query bar', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow( {}} /> - ); + ).dive(); // Allow the componentWillMount code to execute // https://github.com/airbnb/enzyme/issues/450 @@ -94,14 +101,16 @@ describe('ScriptedFieldsTable', () => { }); test('should filter based on the lang filter', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow< + typeof ScriptedFieldsTable + >( [ - { name: 'ScriptedField', lang: 'painless', script: 'x++' }, - { name: 'JustATest', lang: 'painless', script: 'z++' }, - { name: 'Bad', lang: 'somethingElse', script: 'z++' }, + { isUserEditable: true, name: 'ScriptedField', lang: 'painless', script: 'x++' }, + { isUserEditable: true, name: 'JustATest', lang: 'painless', script: 'z++' }, + { isUserEditable: true, name: 'Bad', lang: 'somethingElse', script: 'z++' }, ], }) as IndexPattern } @@ -109,7 +118,7 @@ describe('ScriptedFieldsTable', () => { helpers={helpers} saveIndexPattern={async () => {}} /> - ); + ).dive(); // Allow the componentWillMount code to execute // https://github.com/airbnb/enzyme/issues/450 @@ -123,7 +132,7 @@ describe('ScriptedFieldsTable', () => { }); test('should hide the table if there are no scripted fields', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow( { helpers={helpers} saveIndexPattern={async () => {}} /> - ); + ).dive(); // Allow the componentWillMount code to execute // https://github.com/airbnb/enzyme/issues/450 @@ -145,14 +154,16 @@ describe('ScriptedFieldsTable', () => { }); test('should show a delete modal', async () => { - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow< + typeof ScriptedFieldsTable + >( {}} /> - ); + ).dive(); await component.update(); // Fire `componentWillMount()` // @ts-expect-error lang is not valid @@ -165,7 +176,9 @@ describe('ScriptedFieldsTable', () => { test('should delete a field', async () => { const removeScriptedField = jest.fn(); - const component = shallow( + const component: ShallowWrapper, React.Component<{}, {}, any>> = shallow< + typeof ScriptedFieldsTable + >( { painlessDocLink={'painlessDoc'} saveIndexPattern={async () => {}} /> - ); + ).dive(); await component.update(); // Fire `componentWillMount()` - // @ts-expect-error lang is not valid + // @ts-expect-error component.instance().startDeleteField({ name: 'ScriptedField', lang: '', script: '' }); await component.update(); + // @ts-expect-error await component.instance().deleteField(); await component.update(); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx index 7fd5170b669f7..76433a7b49e27 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx @@ -15,8 +15,10 @@ import { import { Table, Header, CallOuts, DeleteScritpedFieldConfirmationModal } from './components'; import { ScriptedFieldItem } from './types'; +import { IndexPatternManagmentContext } from '../../../types'; import { IndexPattern, DataPublicPluginStart } from '../../../../../../plugins/data/public'; +import { useKibana } from '../../../../../../plugins/kibana_react/public'; interface ScriptedFieldsTableProps { indexPattern: IndexPattern; @@ -29,6 +31,7 @@ interface ScriptedFieldsTableProps { onRemoveField?: () => void; painlessDocLink: string; saveIndexPattern: DataPublicPluginStart['indexPatterns']['updateSavedObject']; + userEditPermission: boolean; } interface ScriptedFieldsTableState { @@ -38,10 +41,16 @@ interface ScriptedFieldsTableState { fields: ScriptedFieldItem[]; } -export class ScriptedFieldsTable extends Component< - ScriptedFieldsTableProps, - ScriptedFieldsTableState -> { +const withHooks = (Comp: typeof Component) => { + return (props: any) => { + const { application } = useKibana().services; + const userEditPermission = !!application?.capabilities?.indexPatterns?.save; + + return ; + }; +}; + +class ScriptedFields extends Component { constructor(props: ScriptedFieldsTableProps) { super(props); @@ -79,7 +88,7 @@ export class ScriptedFieldsTable extends Component< getFilteredItems = () => { const { fields } = this.state; - const { fieldFilter, scriptedFieldLanguageFilter } = this.props; + const { fieldFilter, scriptedFieldLanguageFilter, userEditPermission } = this.props; let languageFilteredFields = fields; @@ -99,6 +108,8 @@ export class ScriptedFieldsTable extends Component< ); } + filteredFields.forEach((field) => (field.isUserEditable = userEditPermission)); + return filteredFields; }; @@ -157,3 +168,5 @@ export class ScriptedFieldsTable extends Component< ); } } + +export const ScriptedFieldsTable = withHooks(ScriptedFields); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/types.ts b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/types.ts index 5c6adc824d225..45a59b97b9490 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/types.ts +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/types.ts @@ -11,4 +11,5 @@ export interface ScriptedFieldItem { name: string; lang: estypes.ScriptLanguage; script: string; + isUserEditable?: boolean; } diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx index e6c4edfc13e9c..821f1d533e201 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx @@ -80,7 +80,7 @@ export function Tabs({ location, refreshFields, }: TabsProps) { - const { uiSettings, docLinks, indexPatternFieldEditor } = + const { application, uiSettings, docLinks, indexPatternFieldEditor } = useKibana().services; const [fieldFilter, setFieldFilter] = useState(''); const [indexedFieldTypeFilter, setIndexedFieldTypeFilter] = useState(''); @@ -149,6 +149,7 @@ export function Tabs({ [uiSettings] ); + const userEditPermission = !!application?.capabilities?.indexPatterns?.save; const getFilterSection = useCallback( (type: string) => { return ( @@ -174,11 +175,13 @@ export function Tabs({ aria-label={filterAriaLabel} /> - - openFieldEditor()} data-test-subj="addField"> - {addFieldButtonLabel} - - + {userEditPermission && ( + + openFieldEditor()} data-test-subj="addField"> + {addFieldButtonLabel} + + + )} )} {type === TAB_SCRIPTED_FIELDS && scriptedFieldLanguages.length > 0 && ( @@ -201,6 +204,7 @@ export function Tabs({ scriptedFieldLanguageFilter, scriptedFieldLanguages, openFieldEditor, + userEditPermission, ] ); diff --git a/src/plugins/kibana_overview/README.md b/src/plugins/kibana_overview/README.md index ad0cbfdf7013b..4681a3453fecd 100644 --- a/src/plugins/kibana_overview/README.md +++ b/src/plugins/kibana_overview/README.md @@ -6,4 +6,4 @@ ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.scss b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.scss index f1bc12e74cf4e..d4b50536d0d09 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.scss +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.scss @@ -1,5 +1,5 @@ .kbnNoDataPageContents__item:only-child { - min-width: 400px; + min-width: ($euiSize * 22.5); @include euiBreakpoint('xs', 's') { min-width: auto; diff --git a/src/plugins/kibana_utils/common/persistable_state/types.ts b/src/plugins/kibana_utils/common/persistable_state/types.ts index 6fea0a3a4eab6..80b791a75758f 100644 --- a/src/plugins/kibana_utils/common/persistable_state/types.ts +++ b/src/plugins/kibana_utils/common/persistable_state/types.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { SerializableRecord } from '@kbn/utility-types'; +import type { SerializableRecord, Serializable } from '@kbn/utility-types'; import { SavedObjectReference } from '../../../../core/types'; /** @@ -26,7 +26,7 @@ import { SavedObjectReference } from '../../../../core/types'; * }; * ``` */ -export interface VersionedState { +export interface VersionedState { version: string; state: S; } @@ -116,7 +116,7 @@ export type PersistableStateDefinition

{ +export interface PersistableStateService

{ /** * Function which reports telemetry information. This function is essentially * a "reducer" - it receives the existing "stats" object and returns an diff --git a/src/plugins/kibana_utils/common/state_containers/README.md b/src/plugins/kibana_utils/common/state_containers/README.md index c623e8b306438..1e9f60e41c729 100644 --- a/src/plugins/kibana_utils/common/state_containers/README.md +++ b/src/plugins/kibana_utils/common/state_containers/README.md @@ -1,2 +1,2 @@ * [docs](../../docs/state_containers) -* [api reference](https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers) \ No newline at end of file +* [api reference](https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_containers) \ No newline at end of file diff --git a/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.ts b/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.ts index 841cf8b87a565..7de28363c970d 100644 --- a/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.ts +++ b/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.ts @@ -63,7 +63,7 @@ export const useContainerSelector = , /** * Creates helpers for using {@link StateContainer | State Containers} with react - * Refer to {@link https://github.com/elastic/kibana/blob/master/src/plugins/kibana_utils/docs/state_containers/react.md | guide} for details + * Refer to {@link https://github.com/elastic/kibana/blob/main/src/plugins/kibana_utils/docs/state_containers/react.md | guide} for details * @public */ export const createStateContainerReactHelpers = >() => { diff --git a/src/plugins/kibana_utils/common/state_containers/index.ts b/src/plugins/kibana_utils/common/state_containers/index.ts index 34032147cc171..c96b48cc045b7 100644 --- a/src/plugins/kibana_utils/common/state_containers/index.ts +++ b/src/plugins/kibana_utils/common/state_containers/index.ts @@ -8,7 +8,7 @@ /** * State containers are Redux-store-like objects meant to help you manage state in your services or apps. - * Refer to {@link https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers | guides and examples} for more info + * Refer to {@link https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_containers | guides and examples} for more info * * @packageDocumentation */ diff --git a/src/plugins/kibana_utils/public/state_sync/README.md b/src/plugins/kibana_utils/public/state_sync/README.md index eb5f6e60958fc..5003246c12857 100644 --- a/src/plugins/kibana_utils/public/state_sync/README.md +++ b/src/plugins/kibana_utils/public/state_sync/README.md @@ -1,3 +1,3 @@ - [docs](../../docs/state_sync) - [demo plugins](../../../../../examples/state_containers_examples): run Kibana with `--run-examples` flag. -- [api reference](https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync) +- [api reference](https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_sync) diff --git a/src/plugins/kibana_utils/public/state_sync/index.ts b/src/plugins/kibana_utils/public/state_sync/index.ts index 28a774bf341bf..2e14096c23950 100644 --- a/src/plugins/kibana_utils/public/state_sync/index.ts +++ b/src/plugins/kibana_utils/public/state_sync/index.ts @@ -10,7 +10,7 @@ * State syncing utilities are a set of helpers for syncing your application state * with browser URL or browser storage. * - * They are designed to work together with {@link https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers | state containers}. But state containers are not required. + * They are designed to work together with {@link https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_containers | state containers}. But state containers are not required. * * State syncing utilities include: * @@ -22,7 +22,7 @@ * Listens for state updates in the URL and pushes them back to state. * * {@link ISessionStorageStateStorage} - Serializes state and persists it to browser storage. * - * Refer {@link https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync | here} for a complete guide and examples. + * Refer {@link https://github.com/elastic/kibana/tree/main/src/plugins/kibana_utils/docs/state_sync | here} for a complete guide and examples. * @packageDocumentation */ diff --git a/src/plugins/kibana_utils/public/state_sync/state_sync.ts b/src/plugins/kibana_utils/public/state_sync/state_sync.ts index 8cfe0fe0fe967..2c3141e76d712 100644 --- a/src/plugins/kibana_utils/public/state_sync/state_sync.ts +++ b/src/plugins/kibana_utils/public/state_sync/state_sync.ts @@ -42,7 +42,7 @@ export interface ISyncStateRef Record> = () => ({ - // TODO: Remove this when vis_type_vislib is removed - // https://github.com/elastic/kibana/issues/56143 + // TODO: Remove this when vislib pie is removed + // https://github.com/elastic/kibana/issues/111246 [LEGACY_PIE_CHARTS_LIBRARY]: { name: i18n.translate('visTypePie.advancedSettings.visualization.legacyPieChartsLibrary.name', { defaultMessage: 'Pie legacy charts library', @@ -33,7 +33,7 @@ export const getUiSettingsConfig: () => Record 'visTypePie.advancedSettings.visualization.legacyPieChartsLibrary.deprecation', { defaultMessage: - 'The legacy charts library for pie in visualize is deprecated and will not be supported as of 8.0.', + 'The legacy charts library for pie in visualize is deprecated and will not be supported in a future version.', } ), docLinksKey: 'visualizationSettings', diff --git a/src/plugins/vis_types/table/public/components/__snapshots__/table_vis_basic.test.tsx.snap b/src/plugins/vis_types/table/public/components/__snapshots__/table_vis_basic.test.tsx.snap index 38e3dcbb7097c..85cf9422630d6 100644 --- a/src/plugins/vis_types/table/public/components/__snapshots__/table_vis_basic.test.tsx.snap +++ b/src/plugins/vis_types/table/public/components/__snapshots__/table_vis_basic.test.tsx.snap @@ -17,7 +17,6 @@ exports[`TableVisBasic should init data grid 1`] = ` "header": "underline", } } - key="0" minSizeForControls={1} onColumnResize={[Function]} renderCellValue={[Function]} @@ -56,7 +55,6 @@ exports[`TableVisBasic should init data grid with title provided - for split mod "header": "underline", } } - key="0" minSizeForControls={1} onColumnResize={[Function]} renderCellValue={[Function]} @@ -88,7 +86,6 @@ exports[`TableVisBasic should render the toolbar 1`] = ` "header": "underline", } } - key="0" minSizeForControls={1} onColumnResize={[Function]} renderCellValue={[Function]} diff --git a/src/plugins/vis_types/table/public/components/table_vis_basic.tsx b/src/plugins/vis_types/table/public/components/table_vis_basic.tsx index cfe1ce5d40a1e..2476c17c58a4d 100644 --- a/src/plugins/vis_types/table/public/components/table_vis_basic.tsx +++ b/src/plugins/vis_types/table/public/components/table_vis_basic.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { memo, useCallback, useMemo, useEffect, useState, useRef } from 'react'; +import React, { memo, useCallback, useMemo } from 'react'; import { EuiDataGrid, EuiDataGridProps, EuiDataGridSorting, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { orderBy } from 'lodash'; @@ -111,26 +111,6 @@ export const TableVisBasic = memo( [columns, setColumnsWidth] ); - const firstRender = useRef(true); - const [dataGridUpdateCounter, setDataGridUpdateCounter] = useState(0); - - // key was added as temporary solution to force re-render if we change autoFitRowToContent or we get new data - // cause we have problem with correct updating height cache in EUI datagrid when we use auto-height - // will be removed as soon as fix problem on EUI side - useEffect(() => { - // skip first render - if (firstRender.current) { - firstRender.current = false; - return; - } - // skip if auto height was turned off - if (!visConfig.autoFitRowToContent) { - return; - } - // update counter to remount grid from scratch - setDataGridUpdateCounter((counter) => counter + 1); - }, [visConfig.autoFitRowToContent, table, sort, pagination, columnsWidth]); - return ( <> {title && ( @@ -139,7 +119,6 @@ export const TableVisBasic = memo( )} )} - + + + + } + > + + ); diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx b/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx index 9e46427e33c2e..caf7ac638af78 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_editor.tsx @@ -79,6 +79,15 @@ export class VisEditor extends Component ({ + [TIME_RANGE_MODE_KEY]: + this.props.vis.title && + this.props.vis.params.type !== 'timeseries' && + val.override_index_pattern + ? TIME_RANGE_DATA_MODES.LAST_VALUE + : TIME_RANGE_DATA_MODES.ENTIRE_TIME_RANGE, + ...val, + })), }, extractedIndexPatterns: [''], }; diff --git a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js index 6f6ddbbb7c414..2158283bb80d5 100644 --- a/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_types/timeseries/public/application/visualizations/views/timeseries/index.js @@ -144,7 +144,7 @@ export const TimeSeries = ({ debugState={window._echDebugStateFlag ?? false} showLegend={legend} showLegendExtra={true} - allowBrushingLastHistogramBucket={true} + allowBrushingLastHistogramBin={true} legendPosition={legendPosition} onBrushEnd={onBrushEndListener} onElementClick={(args) => handleElementClick(args)} diff --git a/src/plugins/vis_types/timeseries/public/application/visualizations/views/top_n.js b/src/plugins/vis_types/timeseries/public/application/visualizations/views/top_n.js index aaec701a42eea..e9ffcd8bc5a86 100644 --- a/src/plugins/vis_types/timeseries/public/application/visualizations/views/top_n.js +++ b/src/plugins/vis_types/timeseries/public/application/visualizations/views/top_n.js @@ -120,13 +120,15 @@ export class TopN extends Component { maxWidth: this.state.labelMaxWidth, }, }, - onClick: { + onClickStyle: { row: { cursor: 'pointer', }, }, }, - this.props + { + onClickStyle: typeof this.props.onClick === 'function', + } ); return (

@@ -180,7 +182,6 @@ export class TopN extends Component { TopN.defaultProps = { tickFormatter: (n) => n, - onClick: (i) => i, direction: 'desc', }; diff --git a/src/plugins/vis_types/timeseries/public/timeseries_vis_renderer.tsx b/src/plugins/vis_types/timeseries/public/timeseries_vis_renderer.tsx index 34cc1dc347ef8..ad069a4d7e2cc 100644 --- a/src/plugins/vis_types/timeseries/public/timeseries_vis_renderer.tsx +++ b/src/plugins/vis_types/timeseries/public/timeseries_vis_renderer.tsx @@ -13,6 +13,7 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { IUiSettingsClient } from 'kibana/public'; +import { EuiLoadingChart } from '@elastic/eui'; import { fetchIndexPattern } from '../common/index_patterns_utils'; import { VisualizationContainer, PersistedState } from '../../../visualizations/public'; @@ -43,10 +44,6 @@ export const getTimeseriesVisRenderer: (deps: { name: 'timeseries_vis', reuseDomNode: true, render: async (domNode, config, handlers) => { - // Build optimization. Move app styles from main bundle - // @ts-expect-error TS error, cannot find type declaration for scss - await import('./application/index.scss'); - handlers.onDestroy(() => { unmountComponentAtNode(domNode); }); @@ -55,33 +52,49 @@ export const getTimeseriesVisRenderer: (deps: { const { indexPatterns } = getDataStart(); const showNoResult = !checkIfDataExists(visData, model); - const [palettesService, { indexPattern }] = await Promise.all([ + + let servicesLoaded; + + Promise.all([ palettes.getPalettes(), fetchIndexPattern(model.index_pattern, indexPatterns), - ]); + ]).then(([palettesService, { indexPattern }]) => { + servicesLoaded = true; - render( - - - + - - , - domNode - ); + showNoResult={showNoResult} + error={get(visData, [model.id, 'error'])} + > + + + , + domNode + ); + }); + + if (!servicesLoaded) { + render( +
+ +
, + domNode + ); + } }, }); diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/get_interval_and_timefield.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/get_interval_and_timefield.ts index b7a22abd825e0..7c17f003dfbab 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/get_interval_and_timefield.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/get_interval_and_timefield.ts @@ -24,10 +24,15 @@ export function getIntervalAndTimefield( { min, max, maxBuckets }: IntervalParams, series?: Series ) { - const timeField = + let timeField = (series?.override_index_pattern ? series.series_time_field : panel.time_field) || index.indexPattern?.timeFieldName; + // should use @timestamp as default timeField for es indeces if user doesn't provide timeField + if (!panel.use_kibana_indexes && !timeField) { + timeField = '@timestamp'; + } + if (panel.use_kibana_indexes) { validateField(timeField!, index); } diff --git a/src/plugins/vis_types/xy/public/components/xy_settings.tsx b/src/plugins/vis_types/xy/public/components/xy_settings.tsx index 8775ed18e6bf4..f920d405dd482 100644 --- a/src/plugins/vis_types/xy/public/components/xy_settings.tsx +++ b/src/plugins/vis_types/xy/public/components/xy_settings.tsx @@ -171,7 +171,7 @@ export const XYSettings: FC = ({ baseTheme={baseTheme} showLegend={showLegend} legendPosition={legendPosition} - allowBrushingLastHistogramBucket={isTimeChart} + allowBrushingLastHistogramBin={isTimeChart} roundHistogramBrushValues={enableHistogramMode && !isTimeChart} legendColorPicker={legendColorPicker} onElementClick={onElementClick} diff --git a/src/plugins/vis_types/xy/public/config/get_axis.test.ts b/src/plugins/vis_types/xy/public/config/get_axis.test.ts new file mode 100644 index 0000000000000..7dddae5702b2e --- /dev/null +++ b/src/plugins/vis_types/xy/public/config/get_axis.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { getScale } from './get_axis'; +import type { Scale } from '../types'; + +describe('getScale', () => { + const axisScale = { + type: 'linear', + mode: 'normal', + scaleType: 'linear', + } as Scale; + + it('returns linear type for a number', () => { + const format = { id: 'number' }; + const scale = getScale(axisScale, {}, format, true); + expect(scale.type).toBe('linear'); + }); + + it('returns ordinal type for a terms aggregation on a number field', () => { + const format = { + id: 'terms', + params: { + id: 'number', + otherBucketLabel: 'Other', + missingBucketLabel: 'Missing', + }, + }; + const scale = getScale(axisScale, {}, format, true); + expect(scale.type).toBe('ordinal'); + }); + + it('returns ordinal type for a terms aggregation on a string field', () => { + const format = { + id: 'terms', + params: { + id: 'string', + otherBucketLabel: 'Other', + missingBucketLabel: 'Missing', + }, + }; + const scale = getScale(axisScale, {}, format, true); + expect(scale.type).toBe('ordinal'); + }); + + it('returns ordinal type for a range aggregation on a number field', () => { + const format = { + id: 'range', + params: { + id: 'number', + }, + }; + const scale = getScale(axisScale, {}, format, true); + expect(scale.type).toBe('ordinal'); + }); + + it('returns time type for a date histogram aggregation', () => { + const format = { + id: 'date', + params: { + pattern: 'HH:mm', + }, + }; + const scale = getScale(axisScale, { date: true }, format, true); + expect(scale.type).toBe('time'); + }); + + it('returns linear type for an histogram aggregation', () => { + const format = { id: 'number' }; + const scale = getScale(axisScale, { interval: 1 }, format, true); + expect(scale.type).toBe('linear'); + }); +}); diff --git a/src/plugins/vis_types/xy/public/config/get_axis.ts b/src/plugins/vis_types/xy/public/config/get_axis.ts index 09495725296cd..0d6c67d064cf8 100644 --- a/src/plugins/vis_types/xy/public/config/get_axis.ts +++ b/src/plugins/vis_types/xy/public/config/get_axis.ts @@ -120,7 +120,7 @@ function getScaleType( return type; } -function getScale( +export function getScale( scale: Scale, params: Aspect['params'], format: Aspect['format'], @@ -130,7 +130,10 @@ function getScale( isCategoryAxis ? getScaleType( scale, - format?.id === 'number' || (format?.params?.id === 'number' && format?.id !== 'range'), + format?.id === 'number' || + (format?.params?.id === 'number' && + format?.id !== BUCKET_TYPES.RANGE && + format?.id !== BUCKET_TYPES.TERMS), 'date' in params, 'interval' in params ) diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx similarity index 98% rename from src/plugins/visualizations/public/embeddable/visualize_embeddable.ts rename to src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx index 0c7d58453db69..44555f2db2c67 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx @@ -9,6 +9,9 @@ import _, { get } from 'lodash'; import { Subscription } from 'rxjs'; import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { render } from 'react-dom'; +import { EuiLoadingChart } from '@elastic/eui'; import { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; import { IndexPattern, @@ -301,6 +304,13 @@ export class VisualizeEmbeddable this.domNode = div; super.render(this.domNode); + render( +
+ +
, + this.domNode + ); + const expressions = getExpressions(); this.handler = new expressions.ExpressionLoader(this.domNode, undefined, { onRenderError: (element: HTMLElement, error: ExpressionRenderError) => { diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_async.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable_async.ts index c7480844adbea..2fa22cfe8d80b 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable_async.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable_async.ts @@ -12,10 +12,12 @@ export const createVisualizeEmbeddableAsync = async ( ...args: ConstructorParameters ) => { // Build optimization. Move app styles from main bundle - // @ts-expect-error TS error, cannot find type declaration for scss - await import('./embeddables.scss'); - const { VisualizeEmbeddable } = await import('./visualize_embeddable'); + const [{ VisualizeEmbeddable }] = await Promise.all([ + import('./visualize_embeddable'), + // @ts-expect-error TS error, cannot find type declaration for scss + import('./embeddables.scss'), + ]); return new VisualizeEmbeddable(...args); }; diff --git a/src/setup_node_env/dist.js b/src/setup_node_env/dist.js index 1d901b9ef5f06..3628a27a7793f 100644 --- a/src/setup_node_env/dist.js +++ b/src/setup_node_env/dist.js @@ -6,5 +6,5 @@ * Side Public License, v 1. */ -require('./no_transpilation'); +require('./no_transpilation_dist'); require('./polyfill'); diff --git a/src/setup_node_env/no_transpilation.js b/src/setup_node_env/no_transpilation.js index 1826f5bb0297d..b9497734b40bc 100644 --- a/src/setup_node_env/no_transpilation.js +++ b/src/setup_node_env/no_transpilation.js @@ -7,12 +7,4 @@ */ require('./ensure_node_preserve_symlinks'); - -// The following require statements MUST be executed before any others - BEGIN -require('./exit_on_warning'); -require('./harden'); -// The following require statements MUST be executed before any others - END - -require('symbol-observable'); -require('source-map-support/register'); -require('./node_version_validator'); +require('./no_transpilation_dist'); diff --git a/src/setup_node_env/no_transpilation_dist.js b/src/setup_node_env/no_transpilation_dist.js new file mode 100644 index 0000000000000..c52eba70f4ad3 --- /dev/null +++ b/src/setup_node_env/no_transpilation_dist.js @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// The following require statements MUST be executed before any others - BEGIN +require('./exit_on_warning'); +require('./harden'); +// The following require statements MUST be executed before any others - END + +require('symbol-observable'); +require('source-map-support/register'); +require('./node_version_validator'); diff --git a/test/accessibility/apps/dashboard.ts b/test/accessibility/apps/dashboard.ts index 408e7d402a8f0..54eb5e7df4178 100644 --- a/test/accessibility/apps/dashboard.ts +++ b/test/accessibility/apps/dashboard.ts @@ -15,8 +15,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const listingTable = getService('listingTable'); - // FLAKY: https://github.com/elastic/kibana/issues/105171 - describe.skip('Dashboard', () => { + describe('Dashboard', () => { const dashboardName = 'Dashboard Listing A11y'; const clonedDashboardName = 'Dashboard Listing A11y Copy'; diff --git a/test/accessibility/apps/dashboard_panel.ts b/test/accessibility/apps/dashboard_panel.ts index b2fc073949d73..83c7776049d16 100644 --- a/test/accessibility/apps/dashboard_panel.ts +++ b/test/accessibility/apps/dashboard_panel.ts @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const inspector = getService('inspector'); - // FLAKY: https://github.com/elastic/kibana/issues/112920 - describe.skip('Dashboard Panel', () => { + describe('Dashboard Panel', () => { before(async () => { await PageObjects.common.navigateToApp('dashboard'); await testSubjects.click('dashboardListingTitleLink-[Flights]-Global-Flight-Dashboard'); diff --git a/test/accessibility/apps/discover.ts b/test/accessibility/apps/discover.ts index e05f3e2bc091d..867e146e64ca3 100644 --- a/test/accessibility/apps/discover.ts +++ b/test/accessibility/apps/discover.ts @@ -92,8 +92,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.saveCurrentSavedQuery(); }); - // issue - https://github.com/elastic/kibana/issues/78488 - it.skip('a11y test on saved queries list panel', async () => { + it('a11y test on saved queries list panel', async () => { await PageObjects.discover.clickSavedQueriesPopOver(); await testSubjects.moveMouseTo( 'saved-query-list-item load-saved-query-test-button saved-query-list-item-selected saved-query-list-item-selected' diff --git a/test/common/services/bsearch.ts b/test/common/services/bsearch.ts new file mode 100644 index 0000000000000..d9fe89d9e4b9c --- /dev/null +++ b/test/common/services/bsearch.ts @@ -0,0 +1,122 @@ +/* + * Copyright 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 request from 'superagent'; +import type SuperTest from 'supertest'; +import { IEsSearchResponse } from 'src/plugins/data/common'; +import { FtrProviderContext } from '../ftr_provider_context'; +import { RetryService } from './retry/retry'; + +/** + * Function copied from here: + * test/api_integration/apis/search/bsearch.ts without the compress + * + * Splits the JSON lines from bsearch + */ +const parseBfetchResponse = (resp: request.Response): Array> => { + return resp.text + .trim() + .split('\n') + .map((item) => JSON.parse(item)); +}; + +/** + * Function copied from here: + * x-pack/test/rule_registry/common/lib/authentication/spaces.ts + * @param spaceId The space id we want to utilize + */ +const getSpaceUrlPrefix = (spaceId?: string): string => { + return spaceId && spaceId !== 'default' ? `/s/${spaceId}` : ``; +}; + +/** + * Options for the send method + */ +interface SendOptions { + supertest: SuperTest.SuperTest; + options: object; + strategy: string; + space?: string; +} + +/** + * Bsearch factory which will return a new bsearch capable service that can reduce flake + * on the CI systems when they are under pressure and bsearch returns an async search + * response or a sync response. + * + * @example + * const supertest = getService('supertest'); + * const bsearch = getService('bsearch'); + * const response = await bsearch.send({ + * supertest, + * options: { + * defaultIndex: ['large_volume_dns_data'], + * } + * strategy: 'securitySolutionSearchStrategy', + * }); + * expect(response).eql({ ... your value ... }); + */ +export const BSearchFactory = (retry: RetryService) => ({ + /** Send method to send in your supertest, url, options, and strategy name */ + send: async ({ + supertest, + options, + strategy, + space, + }: SendOptions): Promise => { + const spaceUrl = getSpaceUrlPrefix(space); + const { body } = await retry.try(async () => { + return supertest + .post(`${spaceUrl}/internal/search/${strategy}`) + .set('kbn-xsrf', 'true') + .send(options) + .expect(200); + }); + + if (body.isRunning) { + const result = await retry.try(async () => { + const resp = await supertest + .post(`${spaceUrl}/internal/bsearch`) + .set('kbn-xsrf', 'true') + .send({ + batch: [ + { + request: { + id: body.id, + ...options, + }, + options: { + strategy, + }, + }, + ], + }) + .expect(200); + const [parsedResponse] = parseBfetchResponse(resp); + expect(parsedResponse.result.isRunning).equal(false); + return parsedResponse.result; + }); + return result; + } else { + return body; + } + }, +}); + +/** + * Bsearch provider which will return a new bsearch capable service that can reduce flake + * on the CI systems when they are under pressure and bsearch returns an async search response + * or a sync response. + */ +export function BSearchProvider({ + getService, +}: FtrProviderContext): ReturnType { + const retry = getService('retry'); + return BSearchFactory(retry); +} diff --git a/test/common/services/index.ts b/test/common/services/index.ts index c04bd778468a9..91d17ce1bb3e8 100644 --- a/test/common/services/index.ts +++ b/test/common/services/index.ts @@ -16,6 +16,7 @@ import { SecurityServiceProvider } from './security'; import { EsDeleteAllIndicesProvider } from './es_delete_all_indices'; import { SavedObjectInfoService } from './saved_object_info'; import { IndexPatternsService } from './index_patterns'; +import { BSearchProvider } from './bsearch'; export const services = { deployment: DeploymentService, @@ -28,4 +29,5 @@ export const services = { esDeleteAllIndices: EsDeleteAllIndicesProvider, savedObjectInfo: SavedObjectInfoService, indexPatterns: IndexPatternsService, + bsearch: BSearchProvider, }; diff --git a/test/functional/apps/saved_objects_management/edit_saved_object.ts b/test/functional/apps/saved_objects_management/edit_saved_object.ts index 6a5e0dc394496..912976a49bcdd 100644 --- a/test/functional/apps/saved_objects_management/edit_saved_object.ts +++ b/test/functional/apps/saved_objects_management/edit_saved_object.ts @@ -49,16 +49,15 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const focusAndClickButton = async (buttonSubject: string) => { const button = await testSubjects.find(buttonSubject); await button.scrollIntoViewIfNecessary(); - await delay(10); + await delay(100); await button.focus(); - await delay(10); + await delay(100); await button.click(); // Allow some time for the transition/animations to occur before assuming the click is done - await delay(10); + await delay(100); }; - // FLAKY: https://github.com/elastic/kibana/issues/68400 - describe.skip('saved objects edition page', () => { + describe('saved objects edition page', () => { beforeEach(async () => { await esArchiver.load( 'test/functional/fixtures/es_archiver/saved_objects_management/edit_saved_object' @@ -119,7 +118,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { shouldUseHashForSubUrl: false, } ); - + // wait for the Edit view to load await focusAndClickButton('savedObjectEditDelete'); await PageObjects.common.clickConfirmOnModal(); diff --git a/test/functional/apps/visualize/_area_chart.ts b/test/functional/apps/visualize/_area_chart.ts index 2a5be39403002..76bb1d2f58d05 100644 --- a/test/functional/apps/visualize/_area_chart.ts +++ b/test/functional/apps/visualize/_area_chart.ts @@ -95,11 +95,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show correct chart', async function () { const xAxisLabels = [ - '2015-09-19 12:00', - '2015-09-20 12:00', - '2015-09-21 12:00', - '2015-09-22 12:00', - '2015-09-23 12:00', + '2015-09-20 00:00', + '2015-09-21 00:00', + '2015-09-22 00:00', + '2015-09-23 00:00', ]; const yAxisLabels = ['0', '200', '400', '600', '800', '1,000', '1,200', '1,400']; const expectedAreaChartData = [ diff --git a/test/functional/apps/visualize/_point_series_options.ts b/test/functional/apps/visualize/_point_series_options.ts index dbe26ba099590..a2d2831c87933 100644 --- a/test/functional/apps/visualize/_point_series_options.ts +++ b/test/functional/apps/visualize/_point_series_options.ts @@ -230,10 +230,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('timezones', async function () { it('should show round labels in default timezone', async function () { const expectedLabels = [ - '2015-09-19 12:00', - '2015-09-20 12:00', - '2015-09-21 12:00', - '2015-09-22 12:00', + '2015-09-20 00:00', + '2015-09-21 00:00', + '2015-09-22 00:00', + '2015-09-23 00:00', ]; await initChart(); const labels = await PageObjects.visChart.getXAxisLabels(xyChartSelector); @@ -242,11 +242,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show round labels in different timezone', async function () { const expectedLabels = [ - '2015-09-19 12:00', - '2015-09-20 12:00', - '2015-09-21 12:00', - '2015-09-22 12:00', - '2015-09-23 12:00', + '2015-09-20 00:00', + '2015-09-21 00:00', + '2015-09-22 00:00', + '2015-09-23 00:00', ]; await kibanaServer.uiSettings.update({ 'dateFormat:tz': 'America/Phoenix' }); diff --git a/test/functional/page_objects/home_page.ts b/test/functional/page_objects/home_page.ts index 29fdd1453b0e0..11b304cdbbf9d 100644 --- a/test/functional/page_objects/home_page.ts +++ b/test/functional/page_objects/home_page.ts @@ -13,6 +13,7 @@ export class HomePageObject extends FtrService { private readonly retry = this.ctx.getService('retry'); private readonly find = this.ctx.getService('find'); private readonly common = this.ctx.getPageObject('common'); + private readonly log = this.ctx.getService('log'); async clickSynopsis(title: string) { await this.testSubjects.click(`homeSynopsisLink${title}`); @@ -27,7 +28,10 @@ export class HomePageObject extends FtrService { } async isSampleDataSetInstalled(id: string) { - return !(await this.testSubjects.exists(`addSampleDataSet${id}`)); + const sampleDataCard = await this.testSubjects.find(`sampleDataSetCard${id}`); + const sampleDataCardInnerHTML = await sampleDataCard.getAttribute('innerHTML'); + this.log.debug(sampleDataCardInnerHTML); + return sampleDataCardInnerHTML.includes('removeSampleDataSet'); } async isWelcomeInterstitialDisplayed() { diff --git a/test/functional/page_objects/management/saved_objects_page.ts b/test/functional/page_objects/management/saved_objects_page.ts index 9f48a6f57c8d8..c33e86b42692d 100644 --- a/test/functional/page_objects/management/saved_objects_page.ts +++ b/test/functional/page_objects/management/saved_objects_page.ts @@ -107,6 +107,7 @@ export class SavedObjectsPageObject extends FtrService { if (isLoaded) { return true; } else { + this.log.debug(`still waiting for the table to load ${isLoaded}`); throw new Error('Waiting'); } }); diff --git a/test/functional/page_objects/timelion_page.ts b/test/functional/page_objects/timelion_page.ts index bdfde3c8145e5..ba1db60bc6350 100644 --- a/test/functional/page_objects/timelion_page.ts +++ b/test/functional/page_objects/timelion_page.ts @@ -7,13 +7,21 @@ */ import { FtrService } from '../ftr_provider_context'; +import type { WebElementWrapper } from '../services/lib/web_element_wrapper'; export class TimelionPageObject extends FtrService { private readonly testSubjects = this.ctx.getService('testSubjects'); + private readonly retry = this.ctx.getService('retry'); public async getSuggestionItemsText() { - const timelionCodeEditor = await this.testSubjects.find('timelionCodeEditor'); - const lists = await timelionCodeEditor.findAllByClassName('monaco-list-row'); + let lists: WebElementWrapper[] = []; + await this.retry.try(async () => { + const timelionCodeEditor = await this.testSubjects.find('timelionCodeEditor'); + lists = await timelionCodeEditor.findAllByClassName('monaco-list-row'); + if (lists.length === 0) { + throw new Error('suggestion list not populated'); + } + }); return await Promise.all(lists.map(async (element) => await element.getVisibleText())); } diff --git a/test/functional/services/lib/compare_pngs.ts b/test/functional/services/lib/compare_pngs.ts index fe1a1a359052b..521781c5a6d2b 100644 --- a/test/functional/services/lib/compare_pngs.ts +++ b/test/functional/services/lib/compare_pngs.ts @@ -10,26 +10,56 @@ import { parse, join } from 'path'; import Jimp from 'jimp'; import { ToolingLog } from '@kbn/dev-utils'; +interface PngDescriptor { + path: string; + + /** + * If a buffer is provided this will avoid the extra step of reading from disk + */ + buffer?: Buffer; +} + +const toDescriptor = (imageInfo: string | PngDescriptor): PngDescriptor => { + if (typeof imageInfo === 'string') { + return { path: imageInfo }; + } + return { + ...imageInfo, + }; +}; + +/** + * Override Jimp types that expect to be mapped to either string or buffer even though Jimp + * accepts both https://www.npmjs.com/package/jimp#basic-usage. + */ +const toJimp = (imageInfo: string | Buffer): Promise => { + return (Jimp.read as (value: string | Buffer) => Promise)(imageInfo); +}; + /** * Comparing pngs and writing result to provided directory * - * @param sessionPath - * @param baselinePath + * @param session + * @param baseline * @param diffPath * @param sessionDirectory * @param log * @returns Percent */ export async function comparePngs( - sessionPath: string, - baselinePath: string, + sessionInfo: string | PngDescriptor, + baselineInfo: string | PngDescriptor, diffPath: string, sessionDirectory: string, log: ToolingLog ) { - log.debug(`comparePngs: ${sessionPath} vs ${baselinePath}`); - const session = (await Jimp.read(sessionPath)).clone(); - const baseline = (await Jimp.read(baselinePath)).clone(); + const sessionDescriptor = toDescriptor(sessionInfo); + const baselineDescriptor = toDescriptor(baselineInfo); + + log.debug(`comparePngs: ${sessionDescriptor.path} vs ${baselineDescriptor.path}`); + + const session = (await toJimp(sessionDescriptor.buffer ?? sessionDescriptor.path)).clone(); + const baseline = (await toJimp(baselineDescriptor.buffer ?? baselineDescriptor.path)).clone(); if ( session.bitmap.width !== baseline.bitmap.width || @@ -63,8 +93,12 @@ export async function comparePngs( image.write(diffPath); // For debugging purposes it'll help to see the resized images and how they compare. - session.write(join(sessionDirectory, `${parse(sessionPath).name}-session-resized.png`)); - baseline.write(join(sessionDirectory, `${parse(baselinePath).name}-baseline-resized.png`)); + session.write( + join(sessionDirectory, `${parse(sessionDescriptor.path).name}-session-resized.png`) + ); + baseline.write( + join(sessionDirectory, `${parse(baselineDescriptor.path).name}-baseline-resized.png`) + ); } return percent; } diff --git a/vars/tasks.groovy b/vars/tasks.groovy index b985a507d5fca..02ec3858c550a 100644 --- a/vars/tasks.groovy +++ b/vars/tasks.groovy @@ -135,6 +135,9 @@ def functionalXpack(Map params = [:]) { whenChanged([ 'x-pack/plugins/security_solution/', + 'x-pack/plugins/cases/', + 'x-pack/plugins/timelines/', + 'x-pack/plugins/lists/', 'x-pack/test/security_solution_cypress/', 'x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/', 'x-pack/plugins/triggers_actions_ui/public/application/context/actions_connectors_context.tsx', @@ -146,13 +149,13 @@ def functionalXpack(Map params = [:]) { } } - // whenChanged([ - // 'x-pack/plugins/apm/', - // ]) { - // if (githubPr.isPr()) { - // task(kibanaPipeline.functionalTestProcess('xpack-APMCypress', './test/scripts/jenkins_apm_cypress.sh')) - // } - // } + whenChanged([ + 'x-pack/plugins/apm/', + ]) { + if (githubPr.isPr()) { + task(kibanaPipeline.functionalTestProcess('xpack-APMCypress', './test/scripts/jenkins_apm_cypress.sh')) + } + } whenChanged([ 'x-pack/plugins/uptime/', diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 238b16ca1d41f..5fb284def4bdc 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -10,6 +10,7 @@ "xpack.canvas": "plugins/canvas", "xpack.cases": "plugins/cases", "xpack.cloud": "plugins/cloud", + "xpack.code": "plugins/code", "xpack.dashboard": "plugins/dashboard_enhanced", "xpack.discover": "plugins/discover_enhanced", "xpack.crossClusterReplication": "plugins/cross_cluster_replication", diff --git a/x-pack/build_chromium/README.md b/x-pack/build_chromium/README.md index 267de376c68ff..c27a654abd671 100644 --- a/x-pack/build_chromium/README.md +++ b/x-pack/build_chromium/README.md @@ -99,7 +99,15 @@ are created in x64 using cross-compiling. CentOS is not supported for building C ## Artifacts After the build completes, there will be a .zip file and a .md5 file in `~/chromium/chromium/src/out/headless`. These are named like so: `chromium-{first_7_of_SHA}-{platform}-{arch}`, for example: `chromium-4747cc2-linux-x64`. -The zip files and md5 files are copied to a staging bucket in GCP storage. +The zip files and md5 files are copied to a **staging** bucket in GCP storage. + +To publish the built artifacts for bunding in Kibana, copy the files from the `headless_shell_staging` bucket to the `headless_shell` bucket. +``` +gsutil cp gs://headless_shell_staging/chromium-d163fd7-linux_arm64.md5 gs://headless_shell/ +gsutil cp gs://headless_shell_staging/chromium-d163fd7-linux_arm64.zip gs://headless_shell/ +``` + +IMPORTANT: Do not replace builds in the `headless_shell` bucket that are referenced in an active Kibana branch. CI tests on that branch will fail since the archive checksum no longer matches the original version. ## Testing Search the Puppeteer Github repo for known issues that could affect our use case, and make sure to test anywhere that is affected. diff --git a/x-pack/examples/alerting_example/public/plugin.tsx b/x-pack/examples/alerting_example/public/plugin.tsx index 242fd6e1fd2f5..25b6800ade2e8 100644 --- a/x-pack/examples/alerting_example/public/plugin.tsx +++ b/x-pack/examples/alerting_example/public/plugin.tsx @@ -67,7 +67,7 @@ export class AlertingExamplePlugin implements Plugin '1.0.0': (state: {}) => ({ ...state, migrated: true }), }; - public readonly getLocation = async (params: {}) => { + public readonly getLocation = async (params: MyForwardableState) => { + const path = Boolean(params.captureTest) ? '/captureTest' : '/'; return { app: PLUGIN_ID, - path: '/', + path, state: params, }; }; diff --git a/x-pack/examples/reporting_example/common/types.ts b/x-pack/examples/reporting_example/common/types.ts new file mode 100644 index 0000000000000..f05ba3a274525 --- /dev/null +++ b/x-pack/examples/reporting_example/common/types.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Ensure, SerializableRecord } from '@kbn/utility-types'; + +export type MyForwardableState = Ensure< + SerializableRecord & { captureTest: 'A' }, + SerializableRecord +>; diff --git a/x-pack/examples/reporting_example/public/application.tsx b/x-pack/examples/reporting_example/public/application.tsx index d945048ecd73e..3e1afd7c517a2 100644 --- a/x-pack/examples/reporting_example/public/application.tsx +++ b/x-pack/examples/reporting_example/public/application.tsx @@ -7,23 +7,29 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import { Router, Route, Switch } from 'react-router-dom'; import { AppMountParameters, CoreStart } from '../../../../src/core/public'; -import { ReportingExampleApp } from './components/app'; +import { CaptureTest } from './containers/capture_test'; +import { Main } from './containers/main'; +import { ApplicationContextProvider } from './application_context'; import { SetupDeps, StartDeps, MyForwardableState } from './types'; +import { ROUTES } from './constants'; export const renderApp = ( coreStart: CoreStart, deps: Omit, - { appBasePath, element }: AppMountParameters, // FIXME: appBasePath is deprecated + { appBasePath, element, history }: AppMountParameters, // FIXME: appBasePath is deprecated forwardedParams: MyForwardableState ) => { ReactDOM.render( - , + + + + } /> +
} /> + + + , element ); diff --git a/x-pack/examples/reporting_example/public/application_context.tsx b/x-pack/examples/reporting_example/public/application_context.tsx new file mode 100644 index 0000000000000..4ec16808f3f42 --- /dev/null +++ b/x-pack/examples/reporting_example/public/application_context.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useContext, createContext, FC } from 'react'; + +import type { MyForwardableState } from './types'; + +interface ContextValue { + forwardedState?: MyForwardableState; +} + +const ApplicationContext = createContext(undefined); + +export const ApplicationContextProvider: FC<{ forwardedState: ContextValue['forwardedState'] }> = ({ + forwardedState, + children, +}) => { + return ( + {children} + ); +}; + +export const useApplicationContext = (): ContextValue => { + const ctx = useContext(ApplicationContext); + if (!ctx) { + throw new Error('useApplicationContext called outside of ApplicationContext!'); + } + return ctx; +}; diff --git a/x-pack/examples/reporting_example/public/components/index.ts b/x-pack/examples/reporting_example/public/components/index.ts new file mode 100644 index 0000000000000..7b138d90bb0a3 --- /dev/null +++ b/x-pack/examples/reporting_example/public/components/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { TestImageA } from './test_image_a'; diff --git a/x-pack/examples/reporting_example/public/components/test_image_a.tsx b/x-pack/examples/reporting_example/public/components/test_image_a.tsx new file mode 100644 index 0000000000000..1ce94f35fdd29 --- /dev/null +++ b/x-pack/examples/reporting_example/public/components/test_image_a.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FunctionComponent } from 'react'; +import React from 'react'; +import { VIS } from '../constants'; + +type Props = React.DetailedHTMLProps, HTMLImageElement>; + +export const TestImageA: FunctionComponent = ({ + width = VIS.width, + height = VIS.height, + ...restProps +}) => { + return ( + Test image + ); +}; + +const testImage = `iVBORw0KGgoAAAANSUhEUgAAB0gAAAKsCAYAAABmnO55AAAK32lDQ1BJQ0MgUHJvZmlsZQAASImVlwdUk8kWgOf/00NCgAACUkLvSCeAlNBDlw6iEpJAQgkhISCIDVlcwVVBRJqygKsiCq6ugKwFsWBFsYB9QRYF9blYsKHyfuARdved995595zJfOfmzp1775n5zx0AyH4soTANlgMgXZAlCvP1oMXExtFwI4AIKIAE8MCWxRYLGaGhgQCRufmv8r4fQNPzLfNpX//+/38VBQ5XzAYAikc4kSNmpyPchYznbKEoCwDUQUSvm5MlnOYbCCuKkAAR/n2ak2f54zQnzjCaNGMTEeaJMA0APInFEiUDQDJD9LRsdjLihzSdg6WAwxcgnI+wK5vH4iB8AmGz9PSMaR5F2AixFwJARqoD6Il/8pn8F/+JUv8sVrKUZ/OaEbwXXyxMY+X+n6X535KeJpnbwwAZJJ7IL2y6pkj97qZmBEhZkBgcMsd8zmzdp5kn8YucY7bYM26OOSyvAOnatODAOU7i+zClfrKYEXPMFXuHz7EoI0y6V5LIkzHHLNH8vpLUSKmex2VK/efxIqLnOJsfFTzH4tTwgHkbT6leJAmTxs8V+HrM7+sjzT1d/Kd8+Uzp2ixehJ80d9Z8/FwBY96nOEYaG4fr5T1vEym1F2Z5SPcSpoVK7blpvlK9ODtcujYLOZzza0OlNUxh+YfOMQgEvoAG/IAXCENmW4Bkn8VdmTWdiGeGMFfET+Zl0RjIbePSmAK2hRnN2tLaCoDpuzt7HN6GzdxJSPnUvC5jD3KM3yP3pXRel1gOQHsRACr353V6uwGgFALQ1s2WiLJndejpH8zMV0ERqAJNoAuMgDmwBvbAGbgDb+APQkAEiAXLARvwQDoQgRyQD9aDIlACtoEdoBrUgUawHxwCR0A7OAHOgAvgCrgB7oAHYBCMgBdgHLwHkxAE4SAyRIVUIS1IHzKFrCE65Ap5Q4FQGBQLJUDJkACSQPnQBqgEKoOqoXqoCfoZOg6dgS5BfdA9aAgag95An2EUTIIVYQ3YAF4E02EGHABHwMvgZDgTzoML4S1wJdwAH4Tb4DPwFfgOPAi/gCdQACWDUkZpo8xRdJQnKgQVh0pCiVBrUMWoClQDqgXViepB3UINol6iPqGxaCqahjZHO6P90JFoNjoTvQa9GV2N3o9uQ59D30IPocfR3zBkjDrGFOOEYWJiMMmYHEwRpgKzF3MMcx5zBzOCeY/FYpWxhlgHrB82FpuCXYXdjN2FbcV2Yfuww9gJHA6nijPFueBCcCxcFq4IV4U7iDuNu4kbwX3Ey+C18NZ4H3wcXoAvwFfgD+BP4W/in+EnCXIEfYITIYTAIeQSthL2EDoJ1wkjhEmiPNGQ6EKMIKYQ1xMriS3E88SHxLcyMjI6Mo4yS2T4MutkKmUOy1yUGZL5RFIgmZA8SfEkCWkLaR+pi3SP9JZMJhuQ3clx5CzyFnIT+Sz5MfmjLFXWQpYpy5FdK1sj2yZ7U/YVhUDRpzAoyyl5lArKUcp1yks5gpyBnKccS26NXI3ccbkBuQl5qryVfIh8uvxm+QPyl+RHFXAKBgreChyFQoVGhbMKw1QUVZfqSWVTN1D3UM9TRxSxioaKTMUUxRLFQ4q9iuNKCkq2SlFKK5VqlE4qDSqjlA2UmcppyluVjyj3K39eoLGAsYC7YNOClgU3F3xQWajirsJVKVZpVbmj8lmVpuqtmqpaqtqu+kgNrWaitkQtR2232nm1lwsVFzovZC8sXnhk4X11WN1EPUx9lXqj+lX1CQ1NDV8NoUaVxlmNl5rKmu6aKZrlmqc0x7SoWq5afK1yrdNaz2lKNAYtjVZJO0cb11bX9tOWaNdr92pP6hjqROoU6LTqPNIl6tJ1k3TLdbt1x/W09IL08vWa9e7rE/Tp+jz9nfo9+h8MDA2iDTYatBuMGqoYMg3zDJsNHxqRjdyMMo0ajG4bY43pxqnGu4xvmMAmdiY8kxqT66awqb0p33SXaZ8ZxszRTGDWYDZgTjJnmGebN5sPWShbBFoUWLRbvFqktyhuUeminkXfLO0s0yz3WD6wUrDytyqw6rR6Y21izbausb5tQ7bxsVlr02Hz2tbUlmu72/auHdUuyG6jXbfdV3sHe5F9i/2Yg55DgkOtwwBdkR5K30y/6Ihx9HBc63jC8ZOTvVOW0xGnP5zNnVOdDziPLjZczF28Z/Gwi44Ly6XeZdCV5prg+qProJu2G8utwe2Ju647x32v+zOGMSOFcZDxysPSQ+RxzOODp5Pnas8uL5SXr1exV6+3gnekd7X3Yx8dn2SfZp9xXzvfVb5dfhi/AL9SvwGmBpPNbGKO+zv4r/Y/F0AKCA+oDngSaBIoCuwMgoP8g7YHPQzWDxYEt4eAEGbI9pBHoYahmaG/LsEuCV1Ss+RpmFVYflhPODV8RfiB8PcRHhFbIx5EGkVKIrujKFHxUU1RH6K9osuiB2MWxayOuRKrFsuP7YjDxUXF7Y2bWOq9dMfSkXi7+KL4/mWGy1Yuu7RcbXna8pMrKCtYK44mYBKiEw4kfGGFsBpYE4nMxNrEcbYneyf7BcedU84Z47pwy7jPklySypJGk12StyeP8dx4FbyXfE9+Nf91il9KXcqH1JDUfalTadFpren49IT04wIFQargXIZmxsqMPqGpsEg4mOmUuSNzXBQg2iuGxMvEHVmKSJN0VWIk+U4ylO2aXZP9MScq5+hK+ZWClVdzTXI35T7L88n7aRV6FXtVd752/vr8odWM1fVroDWJa7rX6q4tXDuyznfd/vXE9anrrxVYFpQVvNsQvaGzUKNwXeHwd77fNRfJFomKBjY6b6z7Hv09//veTTabqjZ9K+YUXy6xLKko+bKZvfnyD1Y/VP4wtSVpS+9W+627t2G3Cbb1l7qV7i+TL8srG94etL2tnFZeXP5ux4odlypsK+p2EndKdg5WBlZ2VOlVbav6Us2rvlPjUdNaq167qfbDLs6um7vdd7fUadSV1H3+kf/j3Xrf+rYGg4aKRmxjduPTPVF7en6i/9S0V21vyd6v+wT7BveH7T/X5NDUdED9wNZmuFnSPHYw/uCNQ16HOlrMW+pblVtLDoPDksPPf074uf9IwJHuo/SjLb/o/1J7jHqsuA1qy20bb+e1D3bEdvQd9z/e3enceexXi1/3ndA+UXNS6eTWU8RThaemTuednugSdr08k3xmuHtF94OzMWdvn1tyrvd8wPmLF3wunO1h9Jy+6HLxxCWnS8cv0y+3X7G/0nbV7uqxa3bXjvXa97Zdd7jeccPxRmff4r5TN91unrnldevCbebtK3eC7/T1R/bfHYgfGLzLuTt6L+3e6/vZ9ycfrHuIeVj8SO5RxWP1xw2/Gf/WOmg/eHLIa+jqk/AnD4bZwy9+F//+ZaTwKflpxTOtZ02j1qMnxnzGbjxf+nzkhfDF5Muif8j/o/aV0atf/nD/4+p4zPjIa9HrqTeb36q+3ffO9l33ROjE4/fp7yc/FH9U/bj/E/1Tz+foz88mc77gvlR+Nf7a+S3g28Op9KkpIUvEmmkFUMiAk5IAeLMP6Y1jAaAifTlx6WxvPSPQ7HtghsB/4tn+e0bsAWgcACBiFQCB1wCoqkbaWcQ/BXkThFIQvTOAbWyk418iTrKxnvVFckNak0dTU2+NAMCVAvC1dGpqsnFq6msjEuwDALpyZ3v6adFE3hc5OIDuz+zvmECDv8lsv/+nHP8+g+kIbMHf538CjT8a9ZYUCwUAAACKZVhJZk1NACoAAAAIAAQBGgAFAAAAAQAAAD4BGwAFAAAAAQAAAEYBKAADAAAAAQACAACHaQAEAAAAAQAAAE4AAAAAAAAAkAAAAAEAAACQAAAAAQADkoYABwAAABIAAAB4oAIABAAAAAEAAAdIoAMABAAAAAEAAAKsAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdH+sXfEAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAHXaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjY4NDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xODY0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6VXNlckNvbW1lbnQ+U2NyZWVuc2hvdDwvZXhpZjpVc2VyQ29tbWVudD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cj05w7IAAAAcaURPVAAAAAIAAAAAAAABVgAAACgAAAFWAAABVgAA0zwugxoiAABAAElEQVR4AezdB7yk8/XH8WN32WWxu5ZoQeRPoiwRJXpZPYiIGoII0cvqRK+rt43eExFliQS7ahBRo/feu0Qvyzb/OcNvnPnduXPnzjnrTvnM68Xze2bmOXfm/TzX9zf3eJ6Z7KvCTbghgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACbSAwGQ3SNtjLvEUEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEECgK0CDlQEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgbYRoEHaNruaN4oAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAjRIOQYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKBtBGiQts2u5o0igAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAANUo4BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBoG4G6G6QXXPhnGT36+opQe+65myz+s8UqPsadCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQE8J1N0gPeTQI+Scc8+v+LpHnHKirLfuOhUfa6U7v/jiC/nqq68qvqW+fftKr169Kj7Gnd+NwKuvvSYXX3yJTJgwUTb9zcbygx/M8d384Bp+yieffiqXXTZSnn76GVl//XVlicV/VsNWPf+UZn3dPS/HK0AAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFGEZikDdJ99ztQ3n3n3dJ7PeWUE2SaqacurTf7YOVV15Cnnnq64tu489+3dtmQu/c/98lZZ51bcXu9c4q+U8iPfzS3DBkyvwxdYQXp06d3p89t1weu/NvfZdSo60pvf4ftt5VFF1242Lj++Zq/lMcee7z42I/mnltu+ef1Mtlkk5We25ODI448Ws448+zSS3jw/rtlxhlnlA8++ED22HPf0v0LLjhEdh22c2m9pwedve6efl38fAQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECgVoGwBunZZ54mc8wxe/Hnfv/7s8rAgQNlqaVXkFdefbX0Wh575AGZbrpBpfVmH3gbpFdfc61sv8MuNTFog+/0006Reeedp6bnd/Wka68dLa+/8UbpaVv8djPp169fab1ZBscdf5KcfMofSy/33HPOkJ+vvpp8+eWX8sO55i3dr4MnH39IBgwYUHZfd1bGj58gF/7pzzJ+/PjiZnosb7jB+t0pUXrubzbdQm771+2l9b9cdEGhCb68vP32O7LIYkuW7tdLVf/tystK65Ny8M4778hVf7+69CMWGDJEll7629eiD3T2uksbMUAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEGlwgrEF66y03iDbx7K3VG6TrrLtB6QzSTz/9zL51qeUM0u40SLX4zDPPJP+86TpXky+9yNXXWLt0dqXe98RjDxab2unxZll21iDV13/a6WfK8KOOLb6VYbvsJHvvtbvrbX388ccy7/wLlWpos/rmG0eX1rszuOOOu2SrrbcVPW6WWnIJueSvFxXPEO7JBuk//3mrbL7FVqW3se02v5eDDtyvtK6Dzl532ZNYQQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQaWIAGadDO0csJX3TRxaVq9TRIF/rJgrLiikOLNfTsztGjrys20EpFC4PjjztaNv71hvauusbt0CBVmP/+738yccKE4uVr64IyG0U2SLWsfofta6+/LnPPNVfppzR6g7Sz1116AwwQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgQYXaPgG6UsvvSwPPfxI4dKjb8sUU0whs8wyiyy91BJdnkWpl1h94IEH5eFHHi1c+ncOWXSRnxabZPfc+x957733i7uld+9esvJKK3X4bs/nnn9ennn6WXnzrbeK32U5a+Fn/nieH5U1svL9GtEg3WbrLeXggw4oldZLuq619q/KzvT87eabyvAjD5P77ntA3v3vf0vPHTJkPplj9q8vcZzufP31N+SRRx9LqzJL4QzUPn36yKuvvS4HH3KYvPXW26XHTjrxWOnff+rid57ONdf/le7XwcSJEwuWD8nzL7xQtJvnxz+Sn/50IRk8eLqy5+Ur+voeKfi/8cabxUbvzDPNWNwXCy+8kPTq1St/etV1fQ1PPvmU3H3PvYV9P60stNBPimcsVzuD9MabbpZx476+HK7u69VXW7XDz6h1X99627/kvf+9J8N227NUQ8/oPfSQg4rrSy25uAwaNEhefvkVeaLwOtNN759mmmnl/gcekP8UvnP2//7v/2TNNVaXBx98SN4qXE433ZYpXMpWL//bWYNUL397//0PFi9Z/dPCe19kkYWLvw9p+7Ts6j0//fQz8sKLL6WnF85eXVymnHJK+ectt8mjjz4qp552ZumxlVYaKhttuEFhX01WtNPvb+3sdZc2+mbQnd/b3Gy5ZZcumE0j/yt431PY36mJvNhii3T5e5+/DtYRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgVygYRukn3z6qey40zDRy35Wuu2+2zDZY/dhlR6Ss84+Vw47fHiHx84641S5+JJL5fbb7yg99sB9d8tMhcad3l597TXZf/+D5ZZbbyuu5/9acegKcvRRR8iss86SPySTokGqP0QbVkcd/fVlYnV9qy23kMMOPUhOOnmEHH/CyXpX8bbl734rhx92cFotLtVALdJth+23lTFjxsgFF/453dVhuduuu8iee+xaul8baltvu4O8aJpq6UG9pPIF558tP/jBHOmu4nLs2LFy8KGHy5///O0ZtfYJut3w4YfJkkssbu/udHz33ffIdjvsXGyY2SftuMN2xYbvKSNOLd2dvoNU7/jxvAuUnYH7xmsvlp7X3X297PIrVTRIBS8tXCJ32UJjT88i1mMh3fR7Y88485xSk1svpzvy8r8W388114xKT5MbrrtGhgyZv2KDVPftttvvVHpuGhxy8AGy9e+3TKvFZbX3rE849rgTxXqdc/YZxf954KeLLFFWJ195/tknio1U3Q+VXnd6fj2/t7mZWl47arT85eJLUtnicvrpB8uIU06U5Zdbtux+VhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACB7gg0ZINUm3ib/3YruavQGKt200aeNvTs7R9XXyM77Fi5carP0yaLnpmWbqlBqmdr/mq9DYtnyKXHKi1/+MM5ZdQ1V8m0005b9vCkaJB+9dVXsspqa5a+51R/oDZ511prDXn++Rdk+aGrlF6Dns14/3/uKq3rIG/qXTf6arn88itqbpC+8sqrsvY665V5lf2Awop6/uOqK8qapEcOP0ZOP+Os/Kkd1q8vvJ4FFhjS4X57h77PNX+xTlmj0z6e789aGqT17Ovc0r4GHXfWINWzel959dXS07vbIC1t2Mng7DNPkzXX/Hnp0Z5skNb7e5s3SJdeeim5887yY7n0BguD9Dtr72OMAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCNQq0JAN0i223Fpuuumfpfcw9dT95RdrrSl6dtq1144u3a+DYwpndG666SbF+/Synssst2LZ47rt4ov/TPSxSmdBalNRm4vnX/AnOfCgQ0vb6n165p7eLrn08rJtjz1muPxmk1+XnquDiAapNobW/dUvi3Vfeumlwpl6o8uaa6usspKcf+5ZpcvTrrzqGmXN09tvu7lwCdcfFrfXptxSS69QHOu/tFF31523yajR18uthTNkr7l2VFnTcb111yleslUvq/rz1VeTDz/8ULS+vQyvNiPXXOPnctttt5e9Lr3/7jv/JVNNNVXxTEn9flN723mn7YuXRr7u+hvKzt791Tpry6l//PYsWLuNjvWyusssu2LZz9L71UmbcXq51/xWS4O0nn094o+nyQsvvChXXHlV6Uem41Lv2HrrrYqXJ86bfaUnFwb6/AUXWKBbZ5Cm7bUxP+ecP5B7C5eI/vTTz9LdxeXdd/1LZp9ttuK4ngbp0BWWk0MLZxu/8sorZftHf+biP1usWPeo4YfL5JNP3umZr/qken9vOzNTr/y96s/Zdpvfy0EH7qdDbggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAtwUarkGq37W48KJLlr2Rf916k6Tvxbz0spGyx577lB6fd9555OYbv26aXnHF3zp8R6Se7TnjjDPKhAkTZM+9/1A8g7K0cWGQGqRaU2un23HHHiWbbLxRcVW/A/F3W25TbHANHDhQVipcanezzX6TnlpcRjRIywpmKyccf4ysv966Zd+XevY558mhhx1ZeqZ+N6l+R6ne9PKk++y7f+mxvfbcTXYdtnNpXZuYjz32eGn9icceFH1v6aaNaHtZ1w03XF+OO+ao4s/XM1uPOvo4Oe30M9PT5bRTT5F1fvkLubLQQNxl1z1K99sm6Pjx44uOH370kQwsfN/mbLN9v/h9qqUnZ4O8yasP/+3Ky0pNO21c77nXvmVb1dIgrXdff/zxxzLv/AuVfp499tKdlZp9+t2ym2+2abHBqd+N27dv304bjfl3kGrdjX+9oRxz9JHSu3dvefPNt4pn9drGdbLX59bTIF3j56vppsXLWW++xVbFsf6rUiOys0vsen5vK5npmbGrFb4z9v0P3pf99jtItLmebsstt4xccvGf0ypLBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKBbAg3XIL3xppuLTbT0LvSMxj9feF5alS+++EL+b+75Sus6eOapx4rNy4MOPkzOO//C0mPaENTGYLppQzA/uzE1SM8553w55LAj0lOLl47dpnBW4LLLLlM8M1CbWtVuk7pBqj9bz2g99JADS2eQvvHGm/KzJZYpvSxrteVW28oNN95UesyeXap3dtUgzb+/9KI/ny/63aHp9mrhDNUNNvq2Saxn1OqZtY88+pissebXZ8Gm5+r3ZK622ioyX6GZPaDQGK31dv0NN8pWv9+u9PSFF/6pXPOPK0vreqncOeb89jXpA7U0SOvd1/U0SPVM5Hvv/nexuVl64YVBZ43GSg3Sm24YJfPNN29p8+FHHVvWnN5+u23kgP2/bhT3VIPU83ubN0gXW2wR+fvfvv2fFfQ7aNff8OuzxBWh0uWkSzgMEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIEuBBquQXrMscfLiD+eXnrZBx7wB9lu261L6zrYoNAssd9PeuUVl8oShcvo/uKX65VddvWyS/4iyyyzVGlbbajNv8BCZZftTA3S555/XlYYumrpuflAmzZ6edlNNv619O8/Vf5wyCV29cy4zTb9uun46aefyI03/rPszDn9odpsPOTgA0o/f931NpJ7/3Nfaf2F556UySabTH4417cNNf2eT/2+T3vrqkG65lrryMOPPGo3qTpesXBWrTZR9UzdhRddotPvLdXLturlkn/96w1Kl4XtrPAJJ54iJ550SunhvOGtD+SN4FoapPXu63oapHvsPkx2321Y6T2kQa0NUr3M7JOPP1zWYL2lcInkzTbfMpWS9L2mekdPNUg9v7d5g3SfvfeQXXbesfT+xo0bJz/44Y9L6zRISxQMEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoA6BhmuQ7rDjMPnH1deU3so5Z58h6RKg6c6999lPLv7rpWlVRpx8gqy33q9k0Z8tVfadmfbSvOnJQ1dcTZ597rm0WrrErt5x9z33ynbb79Rpc0+fo2dRXnjhOcXv9NT1dIs4g1QvxXrwQd82P7X2v/99p/x6k83SjykuX3z+qeJlWnUlv5TupX+9qNgg3Wjjry+1q8/Rhqo2Vu2tqwZp3miz21Ya27M7X3/9Ddl+x13KmtX5Ntr4O/us02X55ZbNHyqt6+Vz9TK66XbiCcfKRoVL/dpbfqZrLQ1S3b6efV1Pg/SIww+R322xuX3JxXGtDdJKl/HNG7zp+2W1cL7f3njtxbKffexxJ8opI04t3Wd/v/75z1ul3kvsen5v8wZpbqbfRTvbHHOVXjMN0hIFAwQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEKhDoOEapPq9lnoJ0XTbacft5A/77p1Wi8u8yXnDddfIkCHzdzibMG+offDBBzJkwUXKaqUzSNOdHxW+H/O2f90ud911jzzw4EPy1FNPp4dKS/u9munOSdUg1e/7XGjhn5U1bfXyo3pGq97+97/35Cc/XSy9DNlh+22LDVL7/aD5e9Qnd9Ug3fg3m8vtt99RqjvilBOLdUt3ZINZZpm5eBZvulu/b/TOu+4uNnjvf+ABue++B9JDpeX00w+Whx64t3TJ4NID3wzy71hNl/G1z8vPdK21Qao1uruve6JBqq/z2acfLztrOf+u3dVWXUXOP+8sfWqHBmm+7e+33r7srOSoBqnn95YGaXHX8S8EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBD4jgQarkGaf9/gQj9ZUEZd+/cSx3vvvS8LLrRoaV0Hr7z0rPTp06dwad7T5JhjTyg99otfrClnnv7H0vqoUdfJNtt9e+lOfSA1D7XuZ59/Jp99+pmMKzT3FixcllZvH374oZxz7gVy8inf1tGzH59+8tGyhuGkapC+/PIrsvSyQ4uvJf3rb1deJov/7NumqF5uVS+7qje9hK3eXnzxpeLSXn61eMc3/8obpI88dF/xe1fTc/TStnqJ23TLz8bVs/oee/wJmbp/f5lm2mlkwLTTFs9q/eSTT+Tjjz8pWn7+2ecyzzw/ln79+snYsWMLlwy+WbYtnKFrbzffOFr0LMlKtzvuuEvsmbD5mYN5w1Jr1NIgrXdf5z9Pzya+9ZYbyl56V82+9ORazyDV5+tZwcsuu3TaVHbbY2+5/PIrSuv6Pbt6+WG95WdRn3XGqbLWWmsUH9Njef4FFi6O07+qNUjzyznrNp29bs/vbVdmnEGa9hZLBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiBD4Thukp592ikwzzTQVX/dss31f5p5rLvnk009lnnkXLHvOccceJb/eaINik22fffeXK668qvS4bQDm382oT9LL1q6wwvLy5ptvySGHHl72/aP6uDZIZ5ppxg5naf75wvNkpZW+bkzef/+D8stffXtp10qXPY1okP589dVki99+fTndsePGil6q9pxzzy81O/X16u2lF56WKaaY4uuVwr//dtU/ZOdddiut28EJxx9TtLP36Tj/vtbhRx4maxcayv0LDU+tnVtqQ1Yviatnfer3jOplWm0DVS8jq5dG3XX3vWTkyCtLP27HHbaT/f7w9RnA2mBcbPGly/bBY488INNNN6j0fDvIz47Vx7bfbhvRs4q//PJL2f+AQ8rOhtTHu2qQVjojt9Z9/fnnn8vcP/66ca4/S2+jR/1Dvj/rrDJ48HTF9a6afcUnFf7VWaPx7bffkUUWWzI9rbjUpvfZZ54mP/jBHDJ69PWyy657lD1+4QXnyCorr1S87zebblE8Azo9QZvK227ze5lu0CC58M9/6XDZY9sgzS/nrD/38ksvlimn7CcDBw4sluzsdXt+b7syo0Ga9iZLBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQiBD4Thuk1V6wbaSdetqZctTR315mt9p2/7jqCll00a/Pihs3bpxs8butyxpE1bbVx9IZpHpZX3tZWn1sgcJZpFNNOaXc+5/7dLV023+/fYqXsi3dURhENEhtvc7GlS7vq2dtzjPfTypu8vijD8igQnMsv+Xf75keP+/cM2X11VYtNiC32HLrssvs6nP0jN7nX3ihrMmp9990wyiZb755Jf8eS31MvyNzzjl/IHqp3U8LZ+im2wrLLycX/+XCtFpxudPOu8pVf7+64mOV7uyqQarbePZ1foZmeg2PPnx/sUnaVbMvPb+zRmOlBmnaptJSm5jXjbpa9KxmvZ151jly+BFHVXpqxftsg/S111+XJZZcrsPz7Jmynb1u3aje39uuzGiQdtgl3IEAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIOgYZskOr70QapNlyq3fJLj+pzPytc1nXDjTaRhx95tMOm2lz84IMPyxqoD9x3d/EMUm3c6fduPlj43tFqt6WXXqp42d78rMfvokG6/nq/kmOOPrJ4ydr8NeaNK33cfjdl/vz/3He//GrdDfO7ZZedd5B99t6zeL+eMbnJpr+t+P2hdsOjhh8um2/2m+JdeobmQQcfJudf8Cf7lA5jPbPxgvPOLjahOzxo7hgzZoysv8HGFfenPm3FoSuULi+s67U0SD37Ov+uTf2ZevvrxX+S5ZdbVrpq9n397NrPINWG9OtvvFH2HbSphjZFb7x+lMwxx+zpLvniiy9kxZVWl1defbV0Xxro2b96pu9xx5+U7hLbINV9t/lvtyrzTE98+qlHZZqpp+70zNf0vHp+b7syo0GadFkigAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAhEBYg1RfTDqL7bQ/niIrr7yiLLX0ChUbNZVeuH6Hon6XYrpps+bCP11UPKvzrbfeTncXl3q51z1231WWXrr8UqTpSdok1e9EvPPuu+WRhx+Vnyy0oCyz1FLF73H83ZbbVGyQ6rZ6mVBt1px19rkdGlJ6Ft2vf72B/H6r30nv3r3TjyotJ1WDVN/rT36ygCyy8MKy5po/L/ve09IPLwyuv+FG2er329m7xH7/ZNkD36xcd/0NcvjhR5XtI/2+St0u3fTsVG2oXXb5yLKzP/Xx5ZZbRnbecXtZaqny/aANrauvGVVocJ8hTz31dCpVXGpjdJVVVpI/7LOXTFv43tJabu+++26xWT76uuslHQt6Vurxxx1V/B7Uww4fXirzpwvOLR57eseP512g9Jr12HzmqcdKz6t3X+t708b9aaefUaqtRfUSxb/dfFO55NLLRc/OTbejC83jzb5pHqf7dLnLsN3lyr99+926/7z5epnnxz+S/AxSvezygQf+QXbbba/Smcz6XvQs360Kx2L6rlxb+4MPPpADDzq0dOatPn+lFVeU7bbbWp5//oWyyzHbBqnW0G2POPJoufSykbak3HDdNTJkyPydvu705Hp+b7syyxukuu/vuvO29CNZIoAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALdEghtkKafPOKUE2W9dddJq66lNkf++9//yvvvf1BsDmqDbcCAAVVr6qV233zrLZlpxhmlb9++pefqmYPaNLO3p554uEOjTps8eqbpO++8U/yZehlT+52fafsXXnix+L2oun5y4Ts5r712dHpI7vz3rcXvjCzdMYkH+fek6o977pnHZaqppuryJ2tT7L333pcBAwfI9IMHV2zCqunbBY8PCy5ac5ZZZi58N+WUXdZW87fffls+L5wJOmfhOzQ7+w7aLgt984Q33nizeAZt+s7PWrfr7Hm17ut8ez0u3333v4Uzlj+T731vBvf7yutXWtfG/5tvvVlwnFP69OnYpM+3GT9+grz19lsy80wz1/R8u336Hfpq4lfFM6z79etnH+5yXM/vbZdFeQICCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggECBQd4P00MOPlLPPPq/iS4hskFb8AZ3cqQ3KQw47onSWoV5S97hjjyo28saOHVs4M/Q8OfqY40pb6yVHH3mo/PtFSw/WMFh51TU6nCGZNvsuGqTa3Bt5xZXFBu8+++5fdtarXkr1iMMPSS+HJQIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIFATqbpDqGWZffjm2ImK/fn0LZ6z1qfjYpLxTz/hceNHyy73qz1tggSHy2GOPd/jRf9h3b9lpx/LL0nZ4UpU7erpBqpev1deQ37Txe8ftt3wnZzXmP5t1BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBpZoO4GaaO+qVGjr5dttt2hy5e39167F5qj21f8PtEuN/7mCQcceIg8+eRTFZ9+2qmniF4OeFLe9Lswjzr62A4/4q8X/0mWX27ZDvdzBwIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAALtLtByDVLdoXpm5ZlnnSPX33Cj6Hdgptscs88uQ4bMJ7/73W9lySUWT3c37fLCP10kI0deWfy+1EGDBsqPfvwj2arw3oYMmb9p3xMvHAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFJKdCSDVIL9v77H8gnn34i35thhuJ3kdrHGCOAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQHsJtHyDtL12J+8WAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJoADdJqOjyGAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAItJUCDtKV2J28GAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQSqCdAgrabDYwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0FICNEhbanfyZhBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoJpAyzdITzr1PPn4k0+rGciCQ+aRX/1itYrPGTd+vFw96mZ54qln5b//e19mmH46mX/eH8naa64sk/fp02Gbf91xr9x86x3y4UefyFw/nEM232RdGTRwQNnzHnjoMbn2+ltk2aUWkxWXX6rsMVYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQGDSCbR8g3TXvQ8TbXJWuw2Z70ey/e837fCUL774Uk4sNFjfePPt4mN9+04hX345tjiedZaZZPedtpJ+/fqWtnv8yWfkjHMvFn3e7N+fRZ574WUZPN0gOeyA3UrP+ejjT+SAw06Q3r16yREH7ylT95+q9FjE4IOPvm0G73LXSPlywriIspOkxilDN5KZ+5c3jyfJD3IU/XzMl/Ll2G8Np5qyr/SdYnJHxfbedMKEifLxp5+XEHr37iXTTh37O1Aq3iYD9VTXdFNPdeVWn4D+vuvvfbrp77v+3nOrX8DmklYZNGDq+ouxZfH4JJfiDgRyKc4yVSKXkkTMklyKcbRVyCWr4R/zeclvaCuQS1YjZkwuxTimKuRSkohbkktxllqJXIr1JJdiPbUauRRrSi7Femq1dsullm+QTpz4beMgP1xO+OO58vIrr8vaa6wsq628XP6wXDLyarnj7vtlmqn7y967bSvTDRoo73/woRx70lnyyaefyTJLLiobb7B2abs//fVK+c/9j8h+e+4g2kA9/ZyLCmeePifDD9lLBkw7TfF5x484R156+TXZdstNimeuljYOGtgDWBukXzRwg3QEDdKgvd48ZZhYxe8rJlaxpkysYj21ms0lXadBqgr13/jAX79dpS3JpUoqvvvIJZ9fvjW5lIv418klv6GtQC5ZDf+YXPIb5hXIpVzEt04u+fwqbU0uVVKp/z5yqX67SluSS5VUfPeRSz6/fGtyKRfxr7dbLrV8g7SzQ0KblNqs1MvkHnvEvjLFFFOUPVXPFN1z/+GiDdZD9tu1eGnd9AS91O4hw0+WXoWzQE8Yvl9p25NPO7941uipJxwqk002mVx1zY3Fy+3uU2iuzj7brHLbv++RkVeNlkUWGiJbbr5hKhe6tAcwDVI/LRMrv6GtwMTKasSMmVjFOKYqTKySRNzS5pJWpUHqsyWXfH751uRSLuJfJ5f8hrYCuWQ1YsbkUoxjqkIuJYmYJbkU42irkEtWwz8ml/yGeQVyKRfxrZNLPr98a3IpF/Gvk0t+Q1uBXLIaMeN2y6W2bZAed8rZVc8eve+BR+XCi6+Q2WadWfbdY/sOR9fRJ5whr73xlmyx6fqy2MILFh//y2V/l7vvfVD2HLa1zDnHbKLff/r8i6/IMYfvK2PGfFFsqk7Zr58cWbi0rl6Gd1Lc7AFMg9QvzMTKb2grMLGyGjFjJlYxjqkKE6skEbe0uaRVaZD6bMkln1++NbmUi/jXySW/oa1ALlmNmDG5FOOYqpBLSSJmSS7FONoq5JLV8I/JJb9hXoFcykV86+SSzy/fmlzKRfzr5JLf0FYgl6xGzLjdcqktG6QvvPSKnPjH8745e/QPhTNAO36n5Ogbb5NR198ia642VNYo/JPfRt9wq4wq/LPm6ivKGquuUHz4uedfkpNPv6B4Zung6QaKnmmq30Wql+c98rjT5K2335Vdd/idzD3XnHm5sHV7AA8rXGJ3DJfYddkysXLxddiYiVUHEvcdTKzchGUFmFiVcYSs2FzSgjRIfazkks8v35pcykX86+SS39BWIJesRsyYXIpxTFXIpSQRsySXYhxtFXLJavjH5JLfMK9ALuUivnVyyeeXb00u5SL+dXLJb2grkEtWI2bcbrnUlg1S/Q7RV157Q9Zes/Ddoyt1/O5RPZTS2aCbbLi2LL3Eoh2OrjvvuV/+evnVsuTiC8umG61TevzBR56QW2+/u/hdpT+e+4ey/jo/l9tuv6fYTF1u6Z/JRuutVXrupBjYA5gzSP3CTKz8hrYCEyurETNmYhXjmKowsUoScUubS1qVBqnPllzy+eVbk0u5iH+dXPIb2grkktWIGZNLMY6pCrmUJGKW5FKMo61CLlkN/5hc8hvmFcilXMS3Ti75/PKtyaVcxL9OLvkNbQVyyWrEjNstl9quQfr8Cy/LSYXvCv36u0crnz2qh9Lp51wkTzz1nGzzu43lJwvM2+HoeuSxp+TsCy6R+eedW3bYerMOj6c7Xn/jbTnqhNNlwLTTyGEH7CZ9Ct95Oilv9gBu5gbpmC/GVmWasl/1SxRHbT9+/AQZP2FC6bVMPnkf6V347tnv6ueXfnA2aNaf/9VXX4kGV7r17t1Lpp16qrRaWkbtv1LBbNCsfult2NdfaWI1dtz49NSKS7t9pSe0s38+sdJjVPPC3vDr3n9/vyh8p7e9ddUgbefjT526ev/5f0enmrKv9DVXwuhqe47f8uM3/8Dfq9dkMsXkHa8sko5h/Mr9kkta6vGn/x3V4zTd9PicbLLJiqv4de2X3NJyQmEeOq4wH0039dTf+0o3fv/L8yY3Ssef/bykz0m5hF9tfrlr/ofo9Hkpf17yz+9P6/h/7Z/nfMol/Lr/3890bOW5pJ8/dY5vbxx/tf/+55+XbM5bUzvm+K1+/Oa51C/7Si78qvvlv7/53/Hyz0v22NRxvn3+eLv7T1H4O6j+3Snd8r/j4Vf7fz+TYf53vGr/HW3346+W959/XrJ/x6tl+7RfKi3bdfvu/h2vkl0z3dd2DdJjTjxTXn39TfnlWqvIqisu2+m+0u8f1e8h3WzjdWWJxRbq8Lx77ntYLrrkb7LYIgvKFr9Zv8Pjeoc21g4dfnLhbNKPZJ/CZXYHD55O7vnPQ/Lyq6/LHLPNKkv87Kcydf+OzaGKxWq8006smrlBat9Hpbee/pBR6TG9j+0/7YymeH9P+6UXl0+s0v3sv9r3Xz6x0g/8dvKaTO2yp/d/I//8/AO/dUvjRn79+hr5/an99yftU7tsdD/98KTHabrlH/gb/fU32u9P3iBNrp0tG+3156+T/d/av/+6v6s1SNn/te3/3Cn9Xuf3579f6Xn5/Wm9XbfPG6TJI1/iN3VOUrbersdPQpjU7z/9HF1WapBO6p/fSsd//nkpn5ta6zRupfef3pNdcvzUlr/WzI4ntV/+ecn+bB1P6p/f7Md//jem/O94+HX/+M//jpcfk3a92Y8fXn9zz//SsdjVfkzPa9ZlWzVIny18R+gphe8I1bOBjhu+X4ezguxOvHr0zXLDzbfLL9csNFJX6thIvfGf/5Z/jLpJVlt5OVl7jZXtpqXxyKtGy23/vkdWX3l5WX3V5eXIY08tfi9pesIM008n+++9U9XXkZ5b69IGUzM3SBvl/0AaN3686B9P023yPr0L/7dpb84grfMM3vz/iM4nVsm5UfZ/ej35spH+D6J8YqWTV84g7f7/wZf2cf6Bv0/h971P4ffe3hpp/9vXlcaN9vvT3f/zrNFef3JNy57e//l/R/MP/Ph17/c/b5DqmY76h77Obj29/5vh548dN04mTuQM0krHUD37b8LEiTLOXBmiWoOU3//afv/t5yXdT+kDP361+eXHdt4gTZ+X8ufVc/zbGu2yfZ7zKZfa5f3bfW7Hnvef51KlBim//7X//ueflzSX0pUi7D6zY8/+0zqtvn2eS5xBao+e7u///O94+eel8uqcQdrVf/84g7R7ZzDnx1el/37lf8er9t/RStvbn9HV/muH7fPPS/bveO3w/u3xkI/rff/d/Tte/nObbb2tGqTDjz9d3njzbVlnrVVllRWXqbqv7rj7Prlk5DWdXkI3XYJ34w1+IcssuViHWs+/+IqcdOp58r0ZBsuB++wsTz3zQvGyvXrG6Wa//pVcfPk/5N7CWah6eV69TG/UzU6smrlBGuXhrZN/4O9qYuX9ea2+ff6H6M4apK3uEPn+8olVpQ/8kT+v1WtV+sCvv/fc6hewuaRV0h+i66/Y3luSS7H7n1yK9dRq5FKsKbkU66nVyKVYU3Ip1pNcivXUauRSrCm5FOup1cilWFNyKdaTXIr11GrkUqwpuRTrqdXaLZfapkH69LMvyB/P/JP0LVzL/5jD9+3yrM0PP/pY9j/0+OIRdsLw/aVfv2//QP7FF1/KHvsdWXzsyIP3lIEDpi2O07++LHzf2oFHnCifffa5HLTvLjLj96aXG28pnHF67U2lhugTTz1baJj+paZmbapby9IewDRIaxGr/hwmVtV9uvsoE6vuinX9fCZWXRt15xlMrLqjVdtzbS7pFjRIa3Pr7FnkUmcy9d1PLtXnVm0rcqmaTvcfI5e6b9bVFuRSV0Lde5xc6p5XV88ml7oS6v7j5FL3zaptQS5V06nvMXKpPrfOtiKXOpOp735yqT63aluRS9V0uv8YudR9s662aLdcapsG6ZHHnSZvvvWO/OoXq8nKQ5cuOw70y3z/Mepmka++krUL302qp2Lr7bSzL5Inn35O5vzBbLL7TltJr169CpcMmygnnXa+vPjSqzLfPHPLjttsVlZLV9L3l6679uqy0gpLFR+/85775a+XXy2bFs4eXbLw3aN33/ug/OWyv0tnZ6B2KFrjHfYApkFaI1qVpzGxqoJTx0NMrOpA62ITJlZdAHXzYSZW3QSr4ek2l/TpNEhrQKvyFHKpCk4dD5FLdaB1sQm51AVQNx8ml7oJVsPTyaUakLrxFHKpG1g1PJVcqgGpm08hl7oJ1sXTyaUugOp4mFyqA63KJuRSFZw6HiKX6kDrYhNyqQugbj5MLnUTrIant1sutUWD9KlnnpdTz/pzp2ePPvzok3LOhZcWD4+tNt9QFl5oSHH89jv/lWNPPkv0jFA983SWmWcsNlnT+t67biszzThD2WH1+JPPyBnnXixzzDar7LXrNqXvYtBahx/zR5lm6v6y4vJLyS3/uks++fSz4uV38xplBbu5Yg9gGqTdxKvwdCZWFVAcdzGxcuB1sikTq05g6rybiVWdcFU2s7mkT6NBWgWrhofIpRqQuvEUcqkbWDU+lVyqEarGp5FLNUJ142nkUjewangquVQDUjeeQi51A6vGp5JLNULV+DRyqUaobjyNXOoGVg1PJZdqQOrGU8ilbmDV+FRyqUaoGp9GLtUI1Y2ntVsutUWD9OgTzpDX3nhL1l17tcIZneVnj+qx8d77H8rhR48Q/VLfg/+wi0w/eLrSIfPe+x/IWedfUvzu0nTnrLPMJNtuubEMnm5Ququ4HDt2nOx78DEybtx4OeyA3WTQwAFlj2tT9Kprbiyehapno+p3oaYzTMue6FixBzANUgfkN5sysfIb2gpMrKxGzJiJVYxjqsLEKknELW0uaVUapD5bcsnnl29NLuUi/nVyyW9oK5BLViNmTC7FOKYq5FKSiFmSSzGOtgq5ZDX8Y3LJb5hXIJdyEd86ueTzy7cml3IR/zq55De0FcglqxEzbrdcaosGaS2Hxvjx44tP69OnT8Wnjy9chve99z6QwYMHlS7BW/GJXdypl+h9593/yfdmGCy9v7mUbxebdOthewAPu2ukjJkwrlvbf5dPHjF0I5m5f3kT+bv8+bX8LCZWtSjV/hwmVrVb1fpMJla1StX2PCZWtTl151k2l3Q7GqTd0ev4XHKpo4nnHnLJo1d5W3Kpsku995JL9cp1vh251LlNPY+QS/Wodb4NudS5Tb2PkEv1ylXejlyq7OK5l1zy6HXcllzqaOK5h1zy6FXellyq7FLvveRSvXKdb9duuUSDtPNjoSkfsQcwZ5D6dyETK7+hrcDEymrEjJlYxTimKkyskkTc0uaSVqVB6rMll3x++dbkUi7iXyeX/Ia2ArlkNWLG5FKMY6pCLiWJmCW5FONoq5BLVsM/Jpf8hnkFcikX8a2TSz6/fGtyKRfxr5NLfkNbgVyyGjHjdsslGqQxx03DVLEHMA1S/25hYuU3tBWYWFmNmDETqxjHVIWJVZKIW9pc0qo0SH225JLPL9+aXMpF/Ovkkt/QViCXrEbMmFyKcUxVyKUkEbMkl2IcbRVyyWr4x+SS3zCvQC7lIr51csnnl29NLuUi/nVyyW9oK5BLViNm3G65RIM05rhpmCr2AKZB6t8tTKz8hrYCEyurETNmYhXjmKowsUoScUubS1qVBqnPllzy+eVbk0u5iH+dXPIb2grkktWIGZNLMY6pCrmUJGKW5FKMo61CLlkN/5hc8hvmFcilXMS3Ti75/PKtyaVcxL9OLvkNbQVyyWrEjNstl2iQxhw3DVPFHsA0SP27hYmV39BWYGJlNWLGTKxiHFMVJlZJIm5pc0mr0iD12ZJLPr98a3IpF/Gvk0t+Q1uBXLIaMWNyKcYxVSGXkkTMklyKcbRVyCWr4R+TS37DvAK5lIv41skln1++NbmUi/jXySW/oa1ALlmNmHG75RIN0pjjpmGq2AOYBql/tzCx8hvaCkysrEbMmIlVjGOqwsQqScQtbS5pVRqkPltyyeeXb00u5SL+dXLJb2grkEtWI2ZMLsU4pirkUpKIWZJLMY62CrlkNfxjcslvmFcgl3IR3zq55PPLtyaXchH/OrnkN7QVyCWrETNut1yiQRpz3DRMFXsA0yD17xYmVn5DW4GJldWIGTOxinFMVZhYJYm4pc0lrUqD1GdLLvn88q3JpVzEv04u+Q1tBXLJasSMyaUYx1SFXEoSMUtyKcbRViGXrIZ/TC75DfMK5FIu4lsnl3x++dbkUi7iXyeX/Ia2ArlkNWLG7ZZLNEhjjpuGqWIPYBqk/t3CxMpvaCswsbIaMWMmVjGOqQoTqyQRt7S5pFVpkPpsySWfX741uZSL+NfJJb+hrUAuWY2YMbkU45iqkEtJImZJLsU42irkktXwj8klv2FegVzKRXzr5JLPL9+aXMpF/Ovkkt/QViCXrEbMuN1yiQZpzHHTMFXsAUyD1L9bmFj5DW0FJlZWI2bMxCrGMVVhYpUk4pY2l7QqDVKfLbnk88u3JpdyEf86ueQ3tBXIJasRMyaXYhxTFXIpScQsyaUYR1uFXLIa/jG55DfMK5BLuYhvnVzy+eVbk0u5iH+dXPIb2grkktWIGbdbLtEgjTluGqaKPYBpkPp3CxMrv6GtwMTKasSMmVjFOKYqTKySRNzS5pJWpUHqsyWXfH751uRSLuJfJ5f8hrYCuWQ1YsbkUoxjqkIuJYmYJbkU42irkEtWwz8ml/yGeQVyKRfxrZNLPr98a3IpF/Gvk0t+Q1uBXLIaMeN2yyUapDHHTcNUsQfwsLtGypgJ4xrmteUvZMTQjWTm/gPyuxtqnYlV7O5gYhXrqdWYWMWaMrGK9dRqNpd0nQapKtR/I5fqt6u0JblUScV3H7nk88u3JpdyEf86ueQ3tBXIJavhH5NLfsO8ArmUi/jWySWfX6WtyaVKKvXfRy7Vb1dpS3KpkorvPnLJ55dvTS7lIv71dsslGqT+Y6ahKtgDmDNI/buGiZXf0FZgYmU1YsZMrGIcUxUmVkkibmlzSavSIPXZkks+v3xrcikX8a+TS35DW4FcshoxY3IpxjFVIZeSRMySXIpxtFXIJavhH5NLfsO8ArmUi/jWySWfX741uZSL+NfJJb+hrUAuWY2YcbvlEg3SmOOmYarYA5gGqX+3MLHyG9oKTKysRsyYiVWMY6rCxCpJxC1tLmlVGqQ+W3LJ55dvTS7lIv51cslvaCuQS1YjZkwuxTimKuRSkohZkksxjrYKuWQ1/GNyyW+YVyCXchHfOrnk88u3JpdyEf86ueQ3tBXIJasRM263XKJBGnPcNEwVewDTIPXvFiZWfkNbgYmV1YgZM7GKcUxVmFglibilzSWtSoPUZ0su+fzyrcmlXMS/Ti75DW0FcslqxIzJpRjHVIVcShIxS3IpxtFWIZeshn9MLvkN8wrkUi7iWyeXfH751uRSLuJfJ5f8hrYCuWQ1Ysbtlks0SGOOm4apYg9gGqT+3cLEym9oKzCxshoxYyZWMY6pChOrJBG3tLmkVWmQ+mzJJZ9fvjW5lIv418klv6GtQC5ZjZgxuRTjmKqQS0kiZkkuxTjaKuSS1fCPySW/YV6BXMpFfOvkks8v35pcykX86+SS39BWIJesRsy43XKJBmnMcdMwVewBTIPUv1uYWPkNbQUmVlYjZszEKsYxVWFilSTiljaXtCoNUp8tueTzy7cml3IR/zq55De0FcglqxEzJpdiHFMVcilJxCzJpRhHW4Vcshr+MbnkN8wrkEu5iG+dXPL55VuTS7mIf51c8hvaCuSS1YgZt1su0SCNOW4apoo9gGmQ+ncLEyu/oa3AxMpqxIyZWMU4pipMrJJE3NLmklalQeqzJZd8fvnW5FIu4l8nl/yGtgK5ZDVixuRSjGOqQi4liZgluRTjaKuQS1bDPyaX/IZ5BXIpF/Gtk0s+v3xrcikX8a+TS35DW4Fcshox43bLJRqkMcdNw1SxBzANUv9uYWLlN7QVmFhZjZgxE6sYx1SFiVWSiFvaXNKqNEh9tuSSzy/fmlzKRfzrvaOnqQAAQABJREFU5JLf0FYgl6xGzJhcinFMVcilJBGzJJdiHG0Vcslq+Mfkkt8wr0Au5SK+dXLJ55dvTS7lIv51cslvaCuQS1YjZtxuuUSDNOa4aZgq9gCmQerfLUys/Ia2AhMrqxEzZmIV45iqMLFKEnFLm0talQapz5Zc8vnlW5NLuYh/nVzyG9oK5JLViBmTSzGOqQq5lCRiluRSjKOtQi5ZDf+YXPIb5hXIpVzEt04u+fzyrcmlXMS/Ti75DW0FcslqxIzbLZdokMYcNw1TxR7ANEj9u4WJld/QVmBiZTVixkysYhxTFSZWSSJuaXNJq9Ig9dmSSz6/fGtyKRfxr5NLfkNbgVyyGjFjcinGMVUhl5JEzJJcinG0Vcglq+Efk0t+w7wCuZSL+NbJJZ9fvjW5lIv418klv6GtQC5ZjZhxu+USDdKY46ZhqtgDeNhdI2XMhHEN89ryFzJi6EYyc/8B+d0Ntc7EKnZ3MLGK9dRqTKxiTZlYxXpqNZtLuk6DVBXqv5FL9dtV2pJcqqTiu49c8vnlW5NLuYh/nVzyG9oK5JLV8I/JJb9hXoFcykV86+SSz6/S1uRSJZX67yOX6rertCW5VEnFdx+55PPLtyaXchH/ervlEg1S/zHTUBXsAcwZpP5dw8TKb2grMLGyGjFjJlYxjqkKE6skEbe0uaRVaZD6bMkln1++NbmUi/jXySW/oa1ALlmNmDG5FOOYqpBLSSJmSS7FONoq5JLV8I/JJb9hXoFcykV86+SSzy/fmlzKRfzr5JLf0FYgl6xGzLjdcokGacxx0zBV7AFMg9S/W5hY+Q1tBSZWViNmzMQqxjFVYWKVJOKWNpe0Kg1Sny255PPLtyaXchH/OrnkN7QVyCWrETMml2IcUxVyKUnELMmlGEdbhVyyGv4xueQ3zCuQS7mIb51c8vnlW5NLuYh/nVzyG9oK5JLViBm3Wy7RII05bhqmij2AaZD6dwsTK7+hrcDEymrEjJlYxTimKkyskkTc0uaSVqVB6rMll3x++dbkUi7iXyeX/Ia2ArlkNWLG5FKMY6pCLiWJmCW5FONoq5BLVsM/Jpf8hnkFcikX8a2TSz6/fGtyKRfxr5NLfkNbgVyyGjHjdsslGqQxx03DVLEHMA1S/25hYuU3tBWYWFmNmDETqxjHVIWJVZKIW9pc0qo0SH225JLPL9+aXMpF/Ovkkt/QViCXrEbMmFyKcUxVyKUkEbMkl2IcbRVyyWr4x+SS3zCvQC7lIr51csnnl29NLuUi/nVyyW9oK5BLViNm3G65RIM05rhpmCr2AKZB6t8tTKz8hrYCEyurETNmYhXjmKowsUoScUubS1qVBqnPllzy+eVbk0u5iH+dXPIb2grkktWIGZNLMY6pCrmUJGKW5FKMo61CLlkN/5hc8hvmFcilXMS3Ti75/PKtyaVcxL9OLvkNbQVyyWrEjNstl2iQxhw3DVPFHsA0SP27hYmV39BWYGJlNWLGTKxiHFMVJlZJIm5pc0mr0iD12ZJLPr98a3IpF/Gvk0t+Q1uBXLIaMWNyKcYxVSGXkkTMklyKcbRVyCWr4R+TS37DvAK5lIv41skln1++NbmUi/jXySW/oa1ALlmNmHG75RIN0pjjpmGq2AOYBql/tzCx8hvaCkysrEbMmIlVjGOqwsQqScQtbS5pVRqkPltyyeeXb00u5SL+dXLJb2grkEtWI2ZMLsU4pirkUpKIWZJLMY62CrlkNfxjcslvmFcgl3IR3zq55PPLtyaXchH/OrnkN7QVyCWrETNut1yiQRpz3DRMFXsA0yD17xYmVn5DW4GJldWIGTOxinFMVZhYJYm4pc0lrUqD1GdLLvn88q3JpVzEv04u+Q1tBXLJasSMyaUYx1SFXEoSMUtyKcbRViGXrIZ/TC75DfMK5FIu4lsnl3x++dbkUi7iXyeX/Ia2ArlkNWLG7ZZLNEhjjpuGqWIPYBqk/t3CxMpvaCswsbIaMWMmVjGOqQoTqyQRt7S5pFVpkPpsySWfX741uZSL+NfJJb+hrUAuWY2YMbkU45iqkEtJImZJLsU42irkktXwj8klv2FegVzKRXzr5JLPL9+aXMpF/Ovkkt/QViCXrEbMuN1yiQZpzHHTMFXsATzsrpEyZsK4hnlt+QsZMXQjmbn/gPzuhlpnYhW7O5hYxXpqNSZWsaZMrGI9tZrNJV2nQaoK9d/IpfrtKm1JLlVS8d1HLvn88q3JpVzEv04u+Q1tBXLJavjH5JLfMK9ALuUivnVyyedXaWtyqZJK/feRS/XbVdqSXKqk4ruPXPL55VuTS7mIf73dcokGqf+YaagK9gDmDFL/rmFi5Te0FZhYWY2YMROrGMdUhYlVkohb2lzSqjRIfbbkks8v35pcykX86+SS39BWIJesRsyYXIpxTFXIpSQRsySXYhxtFXLJavjH5JLfMK9ALuUivnVyyeeXb00u5SL+dXLJb2grkEtWI2bcbrlEgzTmuGmYKvYApkHq3y1MrPyGtgITK6sRM2ZiFeOYqjCxShJxS5tLWpUGqc+WXPL55VuTS7mIf51c8hvaCs2YS29+9pEc9Z/r7NtoqPHEiV/JEYv+ovSayKUSRV0Dcqkutk43Ipc6pan7AXKpbrqKGzZjLlV8Iw10J5+XYncGuRTrSS7Femo1cinWlFyK9dRq7ZZLNEjjj6EerWgPYBqk/l3BxMpvaCswsbIaMWMmVjGOqQoTqyQRt7S5pFX5Q7TPllzy+eVbk0u5iH+dXPIb2grNmEvaIB1262X2bTTUeMo+k8spS25Qek3kUomirgG5VBdbpxuRS53S1P0AuVQ3XcUNmzGXKr6RBrqTz0uxO4NcivUkl2I9tRq5FGtKLsV6arV2yyUapPHHUI9WtAcwDVL/rmBi5Te0FZhYWY2YMROrGMdUhYlVkohb2lzSqvwh2mdLLvn88q3JpVzEv04u+Q1thWbMJRqkdg+2/phcit3H5FKsp1Yjl2JNmzGXYgXiq/F5KdaUXIr1JJdiPbUauRRrSi7Femq1dsslGqTxx1CPVrQHMA1S/65gYuU3tBWYWFmNmDETqxjHVIWJVZKIW9pc0qo0SH225JLPL9+aXMpF/Ovkkt/QVmjGXKJBavdg64/Jpdh9TC7Femo1cinWtBlzKVYgvhqfl2JNyaVYT3Ip1lOrkUuxpuRSrKdWa7dcokEafwz1aEV7ANMg9e8KJlZ+Q1uBiZXViBkzsYpxTFWYWCWJuKXNJa1Kg9RnSy75/PKtyaVcxL9OLvkNbYVmzCUapHYPtv6YXIrdx+RSrKdWI5diTZsxl2IF4qvxeSnWlFyK9SSXYj21GrkUa0ouxXpqtXbLJRqk8cdQj1a0BzANUv+uYGLlN7QVmFhZjZgxE6sYx1SFiVWSiFvaXNKqNEh9tuSSzy/fmlzKRfzr5JLf0FZoxlyiQWr3YOuPyaXYfUwuxXpqNXIp1rQZcylWIL4an5diTcmlWE9yKdZTq5FLsabkUqynVmu3XKJBGn8M9WhFewDTIPXvCiZWfkNbgYmV1YgZM7GKcUxVmFglibilzSWtSoPUZ0su+fzyrcmlXMS/Ti75DW2FZswlGqR2D7b+mFyK3cfkUqynViOXYk2bMZdiBeKr8Xkp1pRcivUkl2I9tRq5FGtKLsV6arV2yyUapPHHUI9WtAcwDVL/rmBi5Te0FZhYWY2YMROrGMdUhYlVkohb2lzSqjRIfbbkks8v35pcykX86+SS39BWaMZcokFq92Drj8ml2H1MLsV6ajVyKda0GXMpViC+Gp+XYk3JpVhPcinWU6uRS7Gm5FKsp1Zrt1yiQRp/DPVoRXsAD7trpIyZMK5HX0+1Hz5i6EYyc/8B1Z7S448xsYrdBUysYj21GhOrWFMmVrGeWs3mkq7TIFWF+m/kUv12lbYklyqp+O4jl3x++dbNmEs0SPO92Nrr5FLs/iWXYj21GrkUa9qMuRQrEF+Nz0uxpuRSrCe5FOup1cilWFNyKdZTq7VbLtEgjT+GerSiPYA5g9S/K5hY+Q1tBSZWViNmzMQqxjFVYWKVJOKWNpe0Kg1Sny255PPLtyaXchH/OrnkN7QVmjGXaJDaPdj6Y3Ipdh+TS7GeWo1cijVtxlyKFYivxuelWFNyKdaTXIr11GrkUqwpuRTrqdXaLZdokMYfQz1a0R7ANEj9u4KJld/QVmBiZTVixkysYhxTFSZWSSJuaXNJq9Ig9dmSSz6/fGtyKRfxr5NLfkNboRlziQap3YOtPyaXYvcxuRTrqdXIpVjTZsylWIH4anxeijUll2I9yaVYT61GLsWakkuxnlqt3XKJBmn8MdSjFe0BTIPUvyuYWPkNbQUmVlYjZszEKsYxVWFilSTiljaXtCoNUp8tueTzy7cml3IR/zq55De0FZoxl2iQ2j3Y+mNyKXYfk0uxnlqNXIo1bcZcihWIr8bnpVhTcinWk1yK9dRq5FKsKbkU66nV2i2XaJDGH0M9WtEewDRI/buCiZXf0FZgYmU1YsZMrGIcUxUmVkkibmlzSavSIPXZkks+v3xrcikX8a+TS35DW6EZc4kGqd2DrT8ml2L3MbkU66nVyKVY02bMpViB+Gp8Xoo1JZdiPcmlWE+tRi7FmpJLsZ5ard1yiQZp/DHUoxXtAUyD1L8rmFj5DW0FJlZWI2bMxCrGMVVhYpUk4pY2l7QqDVKfLbnk88u3JpdyEf86ueQ3tBWaMZdokNo92Ppjcil2H5NLsZ5ajVyKNW3GXIoViK/G56VYU3Ip1pNcivXUauRSrCm5FOup1dotl2iQxh9DPVrRHsA0SP27gomV39BWYGJlNWLGTKxiHFMVJlZJIm5pc0mr0iD12ZJLPr98a3IpF/Gvk0t+Q1uhGXOJBqndg60/Jpdi9zG5FOup1cilWNNmzKVYgfhqfF6KNSWXYj3JpVhPrUYuxZqSS7GeWq3dcokGafwx1KMV7QFMg9S/K5hY+Q1tBSZWViNmzMQqxjFVYWKVJOKWNpe0Kg1Sny255PPLtyaXchH/OrnkN7QVmjGXaJDaPdj6Y3Ipdh+TS7GeWo1cijVtxlyKFYivxuelWFNyKdaTXIr11GrkUqwpuRTrqdXaLZdokMYfQz1a0R7ANEj9u4KJld/QVmBiZTVixkysYhxTFSZWSSJuaXNJq9Ig9dmSSz6/fGtyKRfxr5NLfkNboRlziQap3YOtPyaXYvcxuRTrqdXIpVjTZsylWIH4anxeijUll2I9yaVYT61GLsWakkuxnlqt3XKJBmn8MdSjFe0BTIPUvyuYWPkNbQUmVlYjZszEKsYxVWFilSTiljaXtCoNUp8tueTzy7cml3IR/zq55De0FZoxl2iQ2j3Y+mNyKXYfk0uxnlqNXIo1bcZcihWIr8bnpVhTcinWk1yK9dRq5FKsKbkU66nV2i2XaJDGH0M9WtEewMPuGiljJozr0ddT7YePGLqRzNx/QLWn9PhjTKxidwETq1hPrcbEKtaUiVWsp1azuaTrNEhVof4buVS/XaUtyaVKKr77yCWfX751M+YSDdJ8L7b2OrkUu3/JpVhPrUYuxZo2Yy7FCsRX4/NSrCm5FOtJLsV6ajVyKdaUXIr11Grtlks0SOOPoR6taA9gziD17womVn5DW4GJldWIGTOxinFMVZhYJYm4pc0lrUqD1GdLLvn88q3JpVzEv04u+Q1thWbMJRqkdg+2/phcit3H5FKsp1Yjl2JNmzGXYgXiq/F5KdaUXIr1JJdiPbUauRRrSi7Femq1dsslGqTxx1CPVrQHMA1S/65gYuU3tBWYWFmNmDETqxjHVIWJVZKIW9pc0qo0SH225JLPL9+aXMpF/Ovkkt/QVmjGXKJBavdg64/Jpdh9TC7Femo1cinWtBlzKVYgvhqfl2JNyaVYT3Ip1lOrkUuxpuRSrKdWa7dcokEafwz1aEV7ANMg9e8KJlZ+Q1uBiZXViBkzsYpxTFWYWCWJuKXNJa1Kg9RnSy75/PKtyaVcxL9OLvkNbYVmzCUapHYPtv6YXIrdx+RSrKdWI5diTZsxl2IF4qvxeSnWlFyK9SSXYj21GrkUa0ouxXpqtXbLJRqk8cdQj1a0BzANUv+uYGLlN7QVmFhZjZgxE6sYx1SFiVWSiFvaXNKqNEh9tuSSzy/fmlzKRfzr5JLf0FZoxlyiQWr3YOuPyaXYfUwuxXpqNXIp1rQZcylWIL4an5diTcmlWE9yKdZTq5FLsabkUqynVmu3XKJBGn8M9WhFewDTIPXvCiZWfkNbgYmV1YgZM7GKcUxVmFglibilzSWtSoPUZ0su+fzyrcmlXMS/Ti75DW2FZswlGqR2D7b+mFyK3cfkUqynViOXYk2bMZdiBeKr8Xkp1pRcivUkl2I9tRq5FGtKLsV6arV2yyUapPHHUI9WtAcwDVL/rmBi5Te0FZhYWY2YMROrGMdUhYlVkohb2lzSqjRIfbbkks8v35pcykX86+SS39BWaMZcokFq92Drj8ml2H1MLsV6ajVyKda0GXMpViC+Gp+XYk3JpVhPcinWU6uRS7Gm5FKsp1Zrt1yiQRp/DPVoRXsA0yD17womVn5DW4GJldWIGTOxinFMVZhYJYm4pc0lrUqD1GdLLvn88q3JpVzEv04u+Q1thWbMJRqkdg+2/phcit3H5FKsp1Yjl2JNmzGXYgXiq/F5KdaUXIr1JJdiPbUauRRrSi7Femq1dsslGqTxx1CPVrQHMA1S/65gYuU3tBWYWFmNmDETqxjHVIWJVZKIW9pc0qo0SH225JLPL9+aXMpF/Ovkkt/QVmjGXKJBavdg64/Jpdh9TC7Femo1cinWtBlzKVYgvhqfl2JNyaVYT3Ip1lOrkUuxpuRSrKdWa7dcavkG6fMvvCy33H63PPvcSzJ+/Hj54Zyzy9JLLCKL/HSBmo6ecYVtrh51szzx1LPy3/+9LzNMP53MP++PZO01V5bJ+/TpUONfd9wrN996h3z40Scy1w/nkM03WVcGDRxQ9rwHHnpMrr3+Fll2qcVkxeWXKnvMu2IPYBqkXk0RJlZ+Q1uBiZXViBkzsYpxTFWYWCWJuKXNJa1Kg9RnSy75/PKtyaVcxL9OLvkNbYVmzCUapHYPtv6YXIrdx+RSrKdWI5diTZsxl2IF4qvxeSnWlFyK9SSXYj21GrkUa0ouxXpqtXbLpZZukD786JNyzoWXVjxKVltpuWKTs+KD39z5xRdfyomnnidvvPl28Z6+faeQL78cWxzPOstMsvtOW0m/fn1LJR5/8hk549yLRZ83+/dnkecKzdnB0w2Sww7YrfScjz7+RA447ATp3auXHHHwnjJ1/6lKj0UM7AE87K6RMmbCuIiyk6TGiKEbycz9y5vHk+QHOYoysXLgVdiUiVUFFOddTKycgNnmTKwykIBVm0tajgapD5Vc8vnlW5NLuYh/nVzyG9oKzZhLNEjtHmz9MbkUu4/JpVhPrUYuxZo2Yy7FCsRX4/NSrCm5FOtJLsV6ajVyKdaUXIr11Grtlkst2yD98KOPZf9Djy8eIRutt1bxrNHx4yfIPfc9JJf/bVTx/v332klmmfl7xXGlf10y8mq54+77ZZqp+8veu20r0w0aKO9/8KEce9JZ8smnn8kySy4qG2+wdmnTP/31SvnP/Y/IfnvuINpAPf2ciwpnnj4nww/ZSwZMO03xecePOEdeevk12XbLTWTBIfOUto0a2AOYM0j9qkys/Ia2AhMrqxEzZmIV45iqMLFKEnFLm0talQapz5Zc8vnlW5NLuYh/nVzyG9oKzZhLNEjtHmz9MbkUu4/JpVhPrUYuxZo2Yy7FCsRX4/NSrCm5FOtJLsV6ajVyKdaUXIr11Grtlkst2yC96pobCpe6vVPWWn1F+fmqK5QdKef9+XJ58OHHZfllFpcN112z7LG0omeK7rn/cJk4caIcst+uxUvrpsf0UruHDD9ZehXOAj1h+H4yxRRTFB86+bTzi2eNnnrCoTLZZJPJVdfcWLzc7j6F5urss80qt/37Hhl51WhZZKEhsuXmG6ZyoUt7ANMg9dMysfIb2gpMrKxGzJiJVYxjqsLEKknELW0uaVUapD5bcsnnl29NLuUi/nVyyW9oKzRjLtEgtXuw9cfkUuw+JpdiPbUauRRr2oy5FCsQX43PS7Gm5FKsJ7kU66nVyKVYU3Ip1lOrtVsutWyDdNe9DxP9/tDjj9xPppyyX9mRMn7CBPn88zHSt9DY1MvhVrrd98CjcuHFV8hss84s++6xfYenHH3CGfLaG2/JFpuuL4stvGDx8b9c9ne5+94HZc9hW8ucc8wmJxUuz/v8i6/IMYfvK2PGfFFsqk7Zr58cWbi0bmc/t8MP6uYd9gCmQdpNvApPZ2JVAcVxFxMrB14nmzKx6gSmzruZWNUJV2Uzm0v6NBqkVbBqeIhcqgGpG08hl7qBVeNTyaUaoWp8WjPmEg3SGnduizyNXIrdkeRSrKdWI5diTZsxl2IF4qvxeSnWlFyK9SSXYj21GrkUa0ouxXpqtXbLpZZskH722eey94FHF5ubu++8ldz34KPy5NPPF78/dMh8P5KfLDCvDBpY/bsvR994m4y6/hZZc7Whskbhn/w2+oZbZVThnzULZ6iu8c0Zqs89/5KcfPoFxTNLB083UPRMU/0uUr0875HHnSZvvf2u7LrD72TuuebMy4Wt2wOYBqmflYmV39BWYGJlNWLGTKxiHFMVJlZJIm5pc0mr0iD12ZJLPr98a3IpF/Gvk0t+Q1uhGXOJBqndg60/Jpdi9zG5FOup1cilWNNmzKVYgfhqfF6KNSWXYj3JpVhPrUYuxZqSS7GeWq3dcqklG6RvvPm2DD/+dPnhnLOLNkvfefd/ZUeKXhp3r8JZnrMXLnvb2S2dDbrJhmsXvr900Q5Pu/Oe++Wvl18tSy6+sGy60Tqlxx985Am59fa7i99V+uO5fyjrr/Nzue32e4rN1OWW/pno96FOyps9gGmQ+qWZWPkNbQUmVlYjZszEKsYxVWFilSTiljaXtCoNUp8tueTzy7cml3IR/zq55De0FZoxl2iQ2j3Y+mNyKXYfk0uxnlqNXIo1bcZcihWIr8bnpVhTcinWk1yK9dRq5FKsKbkU66nV2i2XWrJB+viTz8oZ5/6ldHSssOwSsviiP5EvCt8reuM//y1PPfN88SzPQ/ffTaYbVPlM0tPPuUieeOo52eZ3GxfPOC0V+2bwyGNPydkXXCLzzzu37LD1ZvnDpfXX33hbjjrhdBkw7TRy2AG7SZ8+fUqPTYqBPYCbuUE6fvyEqjx9+vSu+njU9l98Oa54qeb0w/r2nVymKOzD7+rnp5+bL5v150+c+JV8VrjcdLr17t1Lpp16qrRaWkbtv1LBbNCsfult2NdfaWL11VdfpadWXNrtKz2hnf3zidXkk/eRflNMXsaEX/f++/vJZ2PK/LpqkLbz8adQXb3/sePGix6n6TbVlH0LXxnw7THa1fYcv+XHb/6Bv1evyaR/9tUMyVqX+JX7WRsd6/H3+Rdfirqmm3qqq97w69ovuaVl/juvv+/6e1/p1ii//29//rHsdvvISi+xIe6bss/kcsqSG5ReS8qlRvErvbBs0Ki/P/kfotPnpezl8/tf4+fX/PNSyqVG3f9pPzfy70+eS/r5Uz+H2lsjv359nY20//PPS5pLUxQ+M1W7NdLrr/Q6e3r/27/j6eubpv+UZS8Tv+7Nn/K/4+Wfl8pwCys9vf8b/edPNtlkxYZecsv/jtfor78Rf3/yv+PZz0vJOS0b8fWn16bLRtj/+ecl+3c8/Lr338+0b7v7d7y0XbMuW7JB+vCjT8o5F15a3Cf5JXInTpwoJxa+G/Sll18rnt05dLklK+47/f5R/R7SzTZeV5ZYbKEOz7nnvoflokv+JostsqBs8Zv1Ozyud+h3nR46/OTC2aQfyT6Fy+wOHjyd3POfh+TlV1+XOQpnry7xs5/K1P07NocqFqvxTjuxauYGqX0fld56+kNGpcf0Prb/tDOa4v097ZdeXD6xSvez/2rff/nESj/w633Vbj29/xv55+cf+Cs5NvLr19fL70/tvz+V9m+j++kfoao1SBv99Tfa70/eIK10TNj7Gu3129emY/Z/a//+6z6u1iBtlP3/zphP5MD7r9GX25C3zhqkjeLXGVqj/vcnb5A22+tPr5f93/r//Uz7ulKDlP1f+/7PPy/lc9PkbJeN+t+v9BrZ/7Xv/2Rml43u11WDtNFff0///uR/Y8r/jodf939/8r/j2d+nfNzT+5+fP3W+S8rWW/34T2+2q+MgPa9Zly3ZIE2X2NWdcuJRB0jfvlOU7Z8HHnpMzr9opMw3z9yy4zaVz/68evTNcsPNt8sv11xFVl1p2bLtdUXPRP3HqJtktZWXk7XXWLnD43rHyKtGy23/vkdWX3l5WX3V5eXIY08tfi9pevIM008n+++9k0weeFap/cVs5gZp/n8qJLO0zP+PunR/WkZtP7FwBsREczZe78LlmScrnAXxXf389H7yZbP+fD2z0Z5Vkk+s0vuM2n+pXr5sVr/0PuzrzydWOnnV/0u62s1uX+l57eyff+DvVfi/JXtl/4c5fuX/R3N+DOXHT/5/FHY1scq3z+u3u7/mULUGKX7lZyx3dfzkDVL9P6Q1mzq7tfvxV8v7z3/n1VNd9VbL9p3Zt+v2+dypWoO0UX7/tUH6h3v+Xm1X9uhjnTVIG8WvM5xG/f3JG6Tp81L+Phr19afX2Sj7P/+dT7mEX/fmn2m/6jLPpUoN0kbZ//Z123Ej7f/885Lm0oTCiQjVbo30+iu9zp7e//bvePr68jOe8Ove73/+d7yuGqQ9vf8b/edP1a9v2f+En/8dr9FffyP+/uR/x7Ofl/L/RjXi67evsRH2fz53sn/Hw697//1M+zafO3X1d7y0XbMuW7JB+mXhUrq7/+GIYuPx5GMP6rBvnn3+JTnl9Atk1llmkv323KHD43rHHXffJ5eMvKbTS+imS/BuvMEvZJklF+tQ4/kXX5GTCmeqfm+GwXLgPjsXLuv7gug2esbpZr/+lVx8+T/k3sJZqHp5Xr1Mb9TNTqyauUEa5eGtk3/g72pi5f15rb59/ofofGLV6u9/Ury/fGJV6QP/pPi5rVqz0gd+/b3nVr+AzSWt0uoTq/qlatuSXKrNqdZnkUu1StX+PHKpdqtantmMucR3kNayZ1vnOeRS7L4kl2I9tRq5FGvajLkUKxBfjc9LsabkUqwnuRTrqdXIpVhTcinWU6u1Wy61ZINUd6Q2SLVRut+eOxYaoTPqXaXbVdfcKDffeoesuPxSst4vVy/dbwcffvSx7H/o8cW7Thi+v/Qr/B8z6fZF4eysPfY7srh65MF7ysAB06aHikv9uQcecaJ89tnnctC+u8iM35tebrylcMbptTeVGqJPPPVsoWH6F1lnrVVllRWXKdves2IP4GF3jZQxE779njJP3Umx7YihG8nM/St/B+yk+Hn11GRiVY9a59swsercpt5HmFjVK1d5OyZWlV0899pc0jo0SD2aIuSSzy/fmlzKRfzr5JLf0FZoxlyiQWr3YOuPyaXYfUwuxXpqNXIp1rQZcylWIL4an5diTcmlWE9yKdZTq5FLsabkUqynVmu3XGrZBumtt98tV/z9Oplm6v7Fy9jqUm9PPPVc8UxOHe+83W9lnh/9X+GSnxMKl8u9WaRw+c+111pF+vT++gtsTzv7Inny6edkzh/MJrvvtJX0KlzWTr/D9KTTzpcXX3q100v0pu8vXXft1WWlFZbSHyV33nO//PXyq2XTwtmjSxa+e/Tuex+Uv1z2d+nsDNTiRnX8yx7AnEFaB2C2CROrDMS5ysTKCVhhcyZWFVAcdzGxcuB1sqnNJX0KDdJOoGq8m1yqEarGp5FLNUJ142nkUjewanhqM+YSDdIadmwLPYVcit2Z5FKsp1Yjl2JNmzGXYgXiq/F5KdaUXIr1JJdiPbUauRRrSi7Femq1dsullm2QaiPzkOGnyHvvf1A8SvRyumPGjJH3P/iouG7PHn340SflnAsvLd6/1eYbysILDSmO337nv3LsyWcVz0TV7zGdZeYZ5c233imt773rtjLTjDMUn5v+9fiTz8gZ514sc8w2q+y16zal71zSWocf88diw1Z/9i3/uks++fSz4uV38xqpVj1LewDTIK1HsHwbJlblHt41JlZewY7bM7HqaOK5h4mVR6/ytjaX9Bk0SCs71XovuVSrVG3PI5dqc+rOs8il7mh1/dxmzCUapF3v11Z6BrkUuzfJpVhPrUYuxZo2Yy7FCsRX4/NSrCm5FOtJLsV6ajVyKdaUXIr11Grtlkst2yDVnTl27Fi5/KrRxbM1dV1vAwdOK0svvoissdrQr+8o/Pu99z+Uw48eUfxi+YP/sItMP3g689gHctb5l8gbb75duk+brdtuubEMnm5Q6T4djB07TvY9+BgZN268HHbAbjJoYPnlY7Upqpf31eatno2ql9dNZ5iWFXKs2AOYBqkD8ptNmVj5DW0FJlZWI2bMxCrGMVVhYpUk4pY2l7QqDVKfLbnk88u3JpdyEf86ueQ3tBWaMZdokNo92Ppjcil2H5NLsZ5ajVyKNW3GXIoViK/G56VYU3Ip1pNcivXUauRSrCm5FOup1dotl1q6QZoOj68Kl85997/vSf+pppSpv7nUbnosLcePH18c9unTJ91VthxfuAzve+99IIMHDypdgrfsCTWuaHP0nXf/J9+bYbD0/uZSvjVuWtPT7AFMg7QmsqpPYmJVlafbDzKx6jZZlxswseqSqFtPYGLVLa6anmxzSTegQVoTW6dPIpc6panrAXKpLraqG5FLVXm6/WAz5hIN0m7v5qbegFyK3X3kUqynViOXYk2bMZdiBeKr8Xkp1pRcivUkl2I9tRq5FGtKLsV6arV2y6W2aJDGHyaNW9EewDRI/fuJiZXf0FZgYmU1YsZMrGIcUxUmVkkibmlzSavSIPXZkks+v3xrcikX8a+TS35DW6EZc4kGqd2DrT8ml2L3MbkU66nVyKVY02bMpViB+Gp8Xoo1JZdiPcmlWE+tRi7FmpJLsZ5ard1yiQZp/DHUoxXtATzsrpEyZsK4Hn091X74iKEbycz9yy9DXO35PfEYE6tYdSZWsZ5ajYlVrCkTq1hPrWZzSddpkKpC/TdyqX67SluSS5VUfPeRSz6/fOtmzCUapPlebO11cil2/5JLsZ5ajVyKNW3GXIoViK/G56VYU3Ip1pNcivXUauRSrCm5FOup1dotl2iQxh9DPVrRHsCcQerfFUys/Ia2AhMrqxEzZmIV45iqMLFKEnFLm0talQapz5Zc8vnlW5NLuYh/nVzyG9oKzZhLNEjtHmz9MbkUu4/JpVhPrUYuxZo2Yy7FCsRX4/NSrCm5FOtJLsV6ajVyKdaUXIr11Grtlks0SOOPoR6taA9gGqT+XcHEym9oKzCxshoxYyZWMY6pChOrJBG3tLmkVWmQ+mzJJZ9fvjW5lIv418klv6Gt0Iy5RIPU7sHWH5NLsfuYXIr11GrkUqxpM+ZSrEB8NT4vxZqSS7Ge5FKsp1Yjl2JNyaVYT63WbrlEgzT+GOrRivYApkHq3xVMrPyGtgITK6sRM2ZiFeOYqjCxShJxS5tLWpUGqc+WXPL55VuTS7mIf51c8hvaCs2YSzRI7R5s/TG5FLuPyaVYT61GLsWaNmMuxQrEV+PzUqwpuRTrSS7Femo1cinWlFyK9dRq7ZZLNEjjj6EerWgPYL6D1L8rmFj5DW0FJlZWI2bMxCrGMVVhYpUk4pY2l7QqDVKfLbnk88u3JpdyEf86ueQ3tBWaMZdokNo92Ppjcil2H5NLsZ5ajVyKNW3GXIoViK/G56VYU3Ip1pNcivXUauRSrCm5FOup1dotl2iQxh9DPVrRHsCcQerfFUys/Ia2AhMrqxEzZmIV45iqMLFKEnFLm0talQapz5Zc8vnlW5NLuYh/nVzyG9oKzZhLNEjtHmz9MbkUu4/JpVhPrUYuxZo2Yy7FCsRX4/NSrCm5FOtJLsV6ajVyKdaUXIr11Grtlks0SOOPoR6taA9gGqT+XcHEym9oKzCxshoxYyZWMY6pChOrJBG3tLmkVWmQ+mzJJZ9fvjW5lIv418klv6Gt0Iy5RIPU7sHWH5NLsfuYXIr11GrkUqxpM+ZSrEB8NT4vxZqSS7Ge5FKsp1Yjl2JNyaVYT63WbrlEgzT+GOrRivYApkHq3xVMrPyGtgITK6sRM2ZiFeOYqjCxShJxS5tLWpUGqc+WXPL55VuTS7mIf51c8hvaCs2YSzRI7R5s/TG5FLuPyaVYT61GLsWaNmMuxQrEV+PzUqwpuRTrSS7Femo1cinWlFyK9dRq7ZZLNEjjj6EerWgPYBqk/l3BxMpvaCswsbIaMWMmVjGOqQoTqyQRt7S5pFVpkPpsySWfX741uZSL+NfJJb+hrdCMuUSD1O7B1h+TS7H7mFyK9dRq5FKsaTPmUqxAfDU+L8WakkuxnuRSrKdWI5diTcmlWE+t1m65RIM0/hjq0Yr2AKZB6t8VTKz8hrYCEyurETNmYhXjmKowsUoScUubS1qVBqnPllzy+eVbk0u5iH+dXPIb2grNmEs0SO0ebP0xuRS7j8mlWE+tRi7FmjZjLsUKxFfj81KsKbkU60kuxXpqNXIp1pRcivXUau2WSzRI44+hHq1oD+Bhd42UMRPG9ejrqfbDRwzdSGbuP6DaU3r8MSZWsbuAiVWsp1ZjYhVrysQq1lOr2VzSdRqkqlD/jVyq367SluRSJRXffeSSzy/fuhlziQZpvhdbe51cit2/5FKsp1Yjl2JNmzGXYgXiq/F5KdaUXIr1JJdiPbUauRRrSi7Femq1dsslGqTxx1CPVrQHMGeQ+ncFEyu/oa3AxMpqxIyZWMU4pipMrJJE3NLmklalQeqzJZd8fvnW5FIu4l8nl/yGtkIz5hINUrsHW39MLsXuY3Ip1lOrkUuxps2YS7EC8dX4vBRrSi7FepJLsZ5ajVyKNSWXYj21WrvlEg3S+GOoRyvaA5gGqX9XMLHyG9oKTKysRsyYiVWMY6rCxCpJxC1tLmlVGqQ+W3LJ55dvTS7lIv51cslvaCs0Yy7RILV7sPXH5FLsPiaXYj21GrkUa9qMuRQrEF+Nz0uxpuRSrCe5FOup1cilWFNyKdZTq7VbLtEgjT+GerSiPYBpkPp3BRMrv6GtwMTKasSMmVjFOP4/e28CLVlRpW0HNVPFWMUgICLiAIKiKDKpCChNi6Jtq3zYyHJYymrbFlCcGGQQaKWlRRRdim3jh4qKX6uA/IoIqIyCA8ogIoIDBYhMMhRQA3/uhLjsijqZNzL2vnVP3PPkWnoizom9b+YTcXnj7LdO3piFjVUk4XfUuiRZMUhtbNElG780Gl1Kidj76JKdoc5Qoy5hkOoZnPptdMl3jtElX56SDV3yZVqjLvkS8M/G/ZIvU3TJlye65MtTsqFLvkzRJV+ekq1ruoRB6r+GJjWjXsD8DVL7VLCxsjPUGdhYaRo+bTZWPhxjFjZWkYTfUeuSZMUgtbFFl2z80mh0KSVi76NLdoY6Q426hEGqZ3Dqt9El3zlGl3x5SjZ0yZdpjbrkS8A/G/dLvkzRJV+e6JIvT8mGLvkyRZd8eUq2rukSBqn/GprUjHoB8wSpfSrYWNkZ6gxsrDQNnzYbKx+OMQsbq0jC76h1SbJikNrYoks2fmk0upQSsffRJTtDnaFGXcIg1TM49dvoku8co0u+PCUbuuTLtEZd8iXgn437JV+m6JIvT3TJl6dkQ5d8maJLvjwlW9d0CYPUfw1Naka9gDFI7VPBxsrOUGdgY6Vp+LTZWPlwjFnYWEUSfketS5IVg9TGFl2y8Uuj0aWUiL2PLtkZ6gw16hIGqZ7Bqd9Gl3znGF3y5SnZ0CVfpjXqki8B/2zcL/kyRZd8eaJLvjwlG7rkyxRd8uUp2bqmSxik/mtoUjPqBYxBap8KNlZ2hjoDGytNw6fNxsqHY8zCxiqS8DtqXZKsGKQ2tuiSjV8ajS6lROx9dMnOUGeoUZcwSPUMTv02uuQ7x+iSL0/Jhi75Mq1Rl3wJ+GfjfsmXKbrkyxNd8uUp2dAlX6boki9PydY1XcIg9V9Dk5pRL2AMUvtUsLGyM9QZ2FhpGj5tNlY+HGMWNlaRhN9R65JkxSC1sUWXbPzSaHQpJWLvo0t2hjpDjbqEQapncOq30SXfOUaXfHlKNnTJl2mNuuRLwD8b90u+TNElX57oki9PyYYu+TJFl3x5Srau6RIGqf8amtSMegFjkNqngo2VnaHOwMZK0/Bps7Hy4RizsLGKJPyOWpckKwapjS26ZOOXRqNLKRF7H12yM9QZatQlDFI9g1O/jS75zjG65MtTsqFLvkxr1CVfAv7ZuF/yZYou+fJEl3x5SjZ0yZcpuuTLU7J1TZcwSP3X0KRm1Av4gEvOCIuWLp7U9zPsh5+0y95hg3lrDhsy6dfYWPlOARsrX56SjY2VL1M2Vr48JZvWJeljkAqF8he6VM6uKRJdaqJiO4cu2fil0TXqEgZpOotTu48u+c4vuuTLU7KhS75Ma9QlXwL+2bhf8mWKLvnyRJd8eUo2dMmXKbrky1OydU2XMEj919CkZtQLmCdI7VPBxsrOUGdgY6Vp+LTZWPlwjFnYWEUSfketS5IVg9TGFl2y8Uuj0aWUiL2PLtkZ6gw16hIGqZ7Bqd9Gl3znGF3y5SnZ0CVfpjXqki8B/2zcL/kyRZd8eaJLvjwlG7rkyxRd8uUp2bqmSxik/mtoUjPqBYxBap8KNlZ2hjoDGytNw6fNxsqHY8zCxiqS8DtqXZKsGKQ2tuiSjV8ajS6lROx9dMnOUGeoUZcwSPUMTv02uuQ7x+iSL0/Jhi75Mq1Rl3wJ+GfjfsmXKbrkyxNd8uUp2dAlX6boki9PydY1XcIg9V9Dk5pRL2AMUvtUsLGyM9QZ2FhpGj5tNlY+HGMWNlaRhN9R65JkxSC1sUWXbPzSaHQpJWLvo0t2hjpDjbqEQapncOq30SXfOUaXfHlKNnTJl2mNuuRLwD8b90u+TNElX57oki9PyYYu+TJFl3x5Srau6RIGqf8amtSMegHzN0jtU8HGys5QZ2BjpWn4tNlY+XCMWdhYRRJ+R61LkhWD1MYWXbLxS6PRpZSIvY8u2RnqDDXqEgapnsGp30aXfOcYXfLlKdnQJV+mNeqSLwH/bNwv+TJFl3x5oku+PCUbuuTLFF3y5SnZuqZLGKT+a2hSM+oFzBOk9qlgY2VnqDOwsdI0fNpsrHw4xixsrCIJv6PWJcmKQWpjiy7Z+KXR6FJKxN5Hl+wMdYYadQmDVM/g1G+jS75zjC758pRs6JIv0xp1yZeAfzbul3yZoku+PNElX56SDV3yZYou+fKUbF3TJQxS/zU0qRn1AsYgtU8FGys7Q52BjZWm4dNmY+XDMWZhYxVJ+B21LklWDFIbW3TJxi+NRpdSIvY+umRnqDPUqEsYpHoGp34bXfKdY3TJl6dkQ5d8mdaoS74E/LNxv+TLFF3y5Yku+fKUbOiSL1N0yZenZOuaLmGQ+q+hSc2oFzAGqX0q2FjZGeoMbKw0DZ82GysfjjELG6tIwu+odUmyYpDa2KJLNn5pNLqUErH30SU7Q52hRl3CINUzOPXb6JLvHKNLvjwlG7rky7RGXfIl4J+N+yVfpuiSL090yZenZEOXfJmiS748JVvXdAmD1H8NTWpGvYAxSO1TwcbKzlBnYGOlafi02Vj5cIxZ2FhFEn5HrUuSFYPUxhZdsvFLo9GllIi9jy7ZGeoMNeoSBqmewanfRpd85xhd8uUp2dAlX6Y16pIvAf9s3C/5MkWXfHmiS748JRu65MsUXfLlKdm6pksYpP5raFIz6gWMQWqfCjZWdoY6AxsrTcOnzcbKh2PMwsYqkvA7al2SrBikNrboko1fGo0upUTsfXTJzlBnqFGXMEj1DE79NrrkO8foki9PyYYu+TKtUZd8Cfhn437Jlym65MsTXfLlKdnQJV+m6JIvT8nWNV3CIPVfQ5OaUS/gAy45IyxaunhS38+wH37SLnuHDeatOWzIpF9jY+U7BWysfHlKNjZWvkzZWPnylGxal6SPQSoUyl/oUjm7pkh0qYmK7Ry6ZOOXRteoSxik6SxO7T665Du/6JIvT8mGLvkyrVGXfAn4Z+N+yZcpuuTLE13y5SnZ0CVfpuiSL0/J1jVdwiD1X0OTmlEvYJ4gtU8FGys7Q52BjZWm4dNmY+XDMWZhYxVJ+B21LklWDFIbW3TJxi+NRpdSIvY+umRnqDPUqEsYpHoGp34bXfKdY3TJl6dkQ5d8mdaoS74E/LNxv+TLFF3y5Yku+fKUbOiSL1N0yZenZOuaLmGQ+q+hSc2oFzAGqX0q2FjZGeoMbKw0DZ82GysfjjELG6tIwu+odUmyYpDa2KJLNn5pNLqUErH30SU7Q52hRl3CINUzOPXb6JLvHKNLvjwlG7rky7RGXfIl4J+N+yVfpuiSL090yZenZEOXfJmiS748JVvXdAmD1H8NTWpGvYAxSO1TwcbKzlBnYGOlafi02Vj5cIxZ2FhFEn5HrUuSFYPUxhZdsvFLo9GllIi9jy7ZGeoMNeoSBqmewanfRpd85xhd8uUp2dAlX6Y16pIvAf9s3C/5MkWXfHmiS748JRu65MsUXfLlKdm6pksYpP5raFIz6gXM3yC1TwUbKztDnYGNlabh02Zj5cMxZqlxYyWF6F/f8Zf4EVp3XLTo4fCyDZ859r4wSMdQFDXQpSJsA4PQpYFoii+gS8XoGgNr1aUDLvhG4+dpw8lVZ8wMn9rhDWNvBV0aQ1HUQJeKsA0MQpcGoim+gC4Vo2sMrFGXGj9Ii07qOp68LXTJNjnoko1fGo0upUTsfXTJzlBnQJc0DZ9213QJg9Rn3bQmi17APEFqnxY2VnaGOgMbK03Dp83GyodjzFLjxoondeLsdeOILvnOM7rky1OyoUu+TNElX56SDYPUlym65MsTXfLlKdnQJV+mNeqSLwH/bLqOJ9kxSG2M0SUbvzQaXUqJ2Pvokp2hzoAuaRo+7a7pEgapz7ppTRa9gDFI7dPCxsrOUGdgY6Vp+LTZWPlwjFlq3FhhkMbZ68YRXfKdZ3TJl6dkQ5d8maJLvjwlGwapL1N0yZcnuuTLU7KhS75Ma9QlXwL+2XQdT7JjkNoYo0s2fmk0upQSsffRJTtDnQFd0jR82l3TJQxSn3XTmix6AWOQ2qeFjZWdoc7AxkrT8GmzsfLhGLPUuLHCII2z140juuQ7z+iSL0/Jhi75MkWXfHlKNgxSX6boki9PdMmXp2RDl3yZ1qhLvgT8s+k6nmTHILUxRpds/NJodCklYu+jS3aGOgO6pGn4tLumSxikPuumNVn0AsYgtU8LGys7Q52BjZWm4dNmY+XDMWapcWOFQRpnrxtHdMl3ntElX56SDV3yZYou+fKUbBikvkzRJV+e6JIvT8mGLvkyrVGXfAn4Z9N1PMmOQWpjjC7Z+KXR6FJKxN5Hl+wMdQZ0SdPwaXdNlzBIfdZNa7LoBYxBap8WNlZ2hjoDGytNw6fNxsqHY8xS48YKgzTOXjeO6JLvPKNLvjwlG7rkyxRd8uUp2TBIfZmiS7480SVfnpINXfJlWqMu+RLwz6breJIdg9TGGF2y8Uuj0aWUiL2PLtkZ6gzokqbh0+6aLmGQ+qyb1mTRC/iAS84Ii5Yubs17S9/ISbvsHTaYt2Z6ulV9Nla+08HGypenZGNj5cu0xo0VBqnvGmh7NnTJd4bQJV+ekg1d8mWKLvnylGwYpL5M0SVfnuiSL0/Jhi75Mq1Rl3wJ+GfTdTzJjkFqY4wu2fil0ehSSsTeR5fsDHUGdEnT8Gl3TZcwSH3WTWuy6AXME6T2aWFjZWeoM7Cx0jR82mysfDjGLDVurDBI4+x144gu+c4zuuTLU7KhS75M0SVfnpINg9SXKbrkyxNd8uUp2dAlX6Y16pIvAf9suo4n2TFIbYzRJRu/NBpdSonY++iSnaHOgC5pGj7trukSBqnPumlNFr2AMUjt08LGys5QZ2BjpWn4tNlY+XCMWWrcWGGQxtnrxhFd8p1ndMmXp2RDl3yZoku+PCUbBqkvU3TJlye65MtTsqFLvkxr1CVfAv7ZdB1PsmOQ2hijSzZ+aTS6lBKx99ElO0OdAV3SNHzaXdMlDFKfddOaLHoBY5Dap4WNlZ2hzsDGStPwaeuN1Z/vvzvMmzsnTJu2ik/yCciy6ZrrhJvu/dsEZPZJuXjJ0vDQQ4+EjVdbOwjPmTOnhzmzZ/kkn4AswhODdALAtjgluuQ7OeiSL0/JpnVJ+musNjdMnz5NmrwKCNR4w48uFUx0xSHoku/koUu+PCUbuuTLtEZd8iXgn03X8SQ7BqmNMbpk45dGo0spEXsfXbIz1BnQJU3Dp901XcIg9Vk3rcmiFzB/g9Q+LWys7Ax1BjZWmoZPW2+sTvjNj8L199zuk3gCshy4zW5hpw03C6ddd3k488arJuAn+KTc/clbhNdv+vxwxR1/DKf89mKfpBOQZat1NgpHbL8nBukEsG1zSnTJd3bQJV+ekk3rkvQxSIVC+avGG34M0vL5rjESXfKdNXTJl6dkQ5d8mdaoS74E/LPpOp5kxyC1MUaXbPzSaHQpJWLvo0t2hjoDuqRp+LS7pksYpD7rpjVZ9ALmCVL7tLCxsjPUGdhYaRo+bb2xwiD1YYpB6sMxZuGrDCMJnyO65MMxZkGXIgm/o9YlyYpBamNb4w0/BqltzmuLRpd8Zwxd8uUp2dAlX6Y16pIvAf9suo4n2TFIbYzRJRu/NBpdSonY++iSnaHOgC5pGj7trukSBqnPumlNFr2AMUjt08LGys5QZ2BjpWn4tPXGCoPUhykGqQ/HmAWDNJLwOaJLPhxjFnQpkvA7al2SrBikNrY13vBjkNrmvLZodMl3xtAlX56SDV3yZVqjLvkS8M+m63iSHYPUxhhdsvFLo9GllIi9jy7ZGeoM6JKm4dPumi5hkPqsm9Zk0QsYg9Q+LWys7Ax1BjZWmoZPW2+sMEh9mGKQ+nCMWTBIIwmfI7rkwzFmQZciCb+j1iXJikFqY1vjDT8GqW3Oa4tGl3xnDF3y5SnZ0CVfpjXqki8B/2y6jifZMUhtjNElG780Gl1Kidj76JKdoc6ALmkaPu2u6RIGqc+6aU0WvYAxSO3TwsbKzlBnYGOlafi09cYKg9SHKQapD8eYBYM0kvA51qhLF93y+/C7u9v595GXPRrCI4sXh302e2F/gqZPn9Y39Hxmq5tZtC4JAQxS2zrQN/zyt7Fvuv/OMHPGdFvSCYx+21Y78bexJ5BvG1PXqEtt5BjfE/dLkYTfEV3yYymZtC5Jf/asmWHuqrOlyauQgK7jSQoM0kKQj4ehSzZ+aTS6lBKx99ElO0OdAV3SNHzaXdMlDFKfddOaLHoBY5Dap4WNlZ2hzsDGStPwaeuNFQapD1MMUh+OMQsGaSThc6xRl8Qg/dQvz/cBMAFZNl9r/fDe5+zWz4xBagesdUmyYZDamOobfjFIT/ntxbaEExi91TobhSO23xODdAIZtzF1jbrURo7xPXG/FEn4HdElP5aSSeuS9DFIhYLtpet4kgmD1MYTXbLxS6PRpZSIvY8u2RnqDOiSpuHT7pouYZD6rJvWZNEL+IBLzgiLli5uzXtL38hJu+wdNpi3Znq6VX02Vr7TwcbKl6dk0xsrDFIfvhikPhxjFgzSSMLnWKMuYZD6zH0tWbQuyXvGILXNnL7hxyC1sYzR6FIk4XOsUZd8PvnEZOF+yZ8ruuTLVOuSZMYgtfPVdTzJhkFqY4ou2fil0ehSSsTeR5fsDHUGdEnT8Gl3TZcwSH3WTWuy6AXME6T2aWFjZWeoM7Cx0jR82npjhUHqwxSD1IdjzM4lecgAAEAASURBVEIhOpLwOdaoSxikPnNfSxatS/KeMUhtM6dv+DFIbSxjNLoUSfgca9Qln08+MVm4X/Lnii75MtW6JJkxSO18dR1PsmGQ2piiSzZ+aTS6lBKx99ElO0OdAV3SNHzaXdMlDFKfddOaLHoBY5Dap4WNlZ2hzsDGStPwaeuNFQapD1MMUh+OMQuF6EjC51ijLmGQ+sx9LVm0Lsl7xiC1zZy+4ccgtbGM0ehSJOFzrFGXfD75xGThfsmfK7rky1TrkmTGILXz1XU8yYZBamOKLtn4pdHoUkrE3keX7Ax1BnRJ0/Bpd02XMEh91k1rsugFjEFqnxY2VnaGOgMbK03Dp603VhikPkwxSH04xiy6EC1f/b40PBovte74iZf+M1/9PgGzgkE6AVBbnFLrkrxNDFLbZOkbfgxSG8sYrXVJzlGIjmTKjtwvlXEbFMX90iAy5efRpXJ2TZFal+Q6BmkTpdHO6TqeRKJLo/FLR6NLKRFbH12y8WuKRpeaqJSfQ5fK2Q2K7JouYZAOWgmVntcLmL9Bap9ENlZ2hjoDGytNw6etN1YYpD5MMUh9OMYsuhCNLkUq5ccadQmDtHy+a4zUuiTvH4PUNov6hh+D1MYyRmtdknMUoiOZsmONulT2SVdOFPdL/pzRJV+mWpckMwapna+u40k2dMnGFF2y8Uuj0aWUiL2PLtkZ6gzokqbh0+6aLmGQ+qyb1mTRC5gnSO3TwsbKzlBnYGOlafi09cYKg9SHKQapD8eYRReiMUgjlfJjjbqEQVo+3zVGal2S949BaptFfcOPQWpjGaO1Lsk5CtGRTNmxRl0q+6QrJ4r7JX/O6JIvU61LkhmD1M5X1/EkG7pkY4ou2fil0ehSSsTeR5fsDHUGdEnT8Gl3TZcwSH3WTWuy6AWMQWqfFjZWdoY6AxsrTcOnrTdWGKQ+TDFIfTjGLLoQjUEaqZQfa9QlDNLy+a4xUuuSvH8MUtss6ht+DFIbyxitdUnOUYiOZMqONepS2SddOVHcL/lzRpd8mWpdkswYpHa+uo4n2dAlG1N0ycYvjUaXUiL2PrpkZ6gzoEuahk+7a7o0pQ3SU7/yrfDHP98ycGV86L3/GmbPnjXwulxYvGRJOPN754VrrvtduONvd4V115kfttzimWGvPV8eZs6YsULsjy+6PJx3wUXhnnvvC09/2iZhvze9Lqy91prLjfv5L38Tzv7++eElO24bdt15x+WuWTt6AWOQWmmGwMbKzlBnYGOlafi09cYKg9SHKQapD8eYRReiMUgjlfKj1iUxS2bNmhFmTJ9ennCCI1+80dMDBukEQ25Zeq1L8tYwSG0TpG/4MUhtLGO01iU5RyE6kik7al2SDHNXnd03TMqyEcX9kv8aQJd8mWpdkswYpHa+uo4n2dAlG1N0ycYvjUaXUiL2PrpkZ6gzoEuahk+7a7o0pQ3Sgw85Lix66KGBK+OE/zg0zJk9e+D1hx56OPzXZ/473LLwtv4YMVMffviRfnujDZ8U3vvut4c5c56Iv/ra68PnvvjVvun6lCdvGG648eawYP7a4ejDDhr7Gff+/b5w2NEnhOnTpoVjjjg4rDZv7tg1j4ZewBikdqJsrOwMdQY2VpqGT1tvrDBIfZhikPpwjFl0IRqDNFIpP2pd+tZNvwzn/uW68mQTHPmazbYO+26xHQbpBHNuW3qtS/LeMEhtM6Rv+DFIbSxjtNYlOUchOpIpO2pdkgwYpGUcYxT3S5GE3xFd8mMpmbQuSR+DVCjYXrqOJ5nQJRtPdMnGL41Gl1Ii9j66ZGeoM6BLmoZPu2u6NGUN0mXLloV/P/jIMK1nRH7q+I80rg65Nux1+hlnhosuvTKsvtq88IGD9g/z114r3HX3PeH4T34+3Hf/A+HFO7ww7POGvcZSfPlr/y/87MqrwiEHvyuIgfrZU07rPXl6QzjuyPeHNddYvT/uEyedEm66+c9h/7e9KTx3q83HYr0aegFjkNqpsrGyM9QZ2FhpGj5tvbHCIPVhikHqwzFm0YVoDNJIpfyodQmDtJyjjtx8rfXDe5+zW//U9OnT+oaevk57NAJalyQSg3Q0fulofcOPQZrSKetrXZIMFKLLOMYorUtyDoM0kik7cr9Uxm1YFLo0jM7o17QuSTQG6egM0whdx5Nr6FJKaLQ+ujQar/FGo0vjERr9Oro0OrNhEejSMDpl17qmS1PWIL3zrrvDR475ZM/UXDN89PD3jbwa5EnRgw89LojReuQhB/a/Wjcmka/aPfK4E/vm6wnHHdL7ervHvqb3xJO/1H9q9DMnHBVWWWWV8O2zzu1/3e4He+bqUzbeKFz408vCGd8+J7zgeVuFt+33xpjO9agXMIVoO1o2VnaGOgMbK03Dp603VhikPkwxSH04xiy6EI0uRSrlR61LGKTlHHUkBqmmYW9rXZJsGKQ2pvqGH4PUxjJGa12ScxSiI5myo9YlyYBBWsYxRnG/FEn4HdElP5aSSeuS9DFIhYLtpet4kgldsvFEl2z80mh0KSVi76NLdoY6A7qkafi0u6ZLU9Ygvf6GP4STPndqeMZmTw0H/tvbRl4dV/z81+HUr34rbLzRBuFD7/vXFeI/dsLnwp9vuTW8Zd/Xh223eW7/+le+8Z1w6eW/CAcf8I6w6SYbh0/2vp7393/4Y/j4Rz8UFi16qG+qrjpnTji299W64/3t0xV+YOYJvYB5gjQT2pBhbKyGwCm4xMaqANo4IXpjhUE6DqzMyxikmaAyh+lCNAZpJrQhw7QuYZAOATXCJQzSEWBlDNW6JMMxSDOgDRmib/gxSIeAGuGS1iUJoxA9AryGoVqX5DIGaQOkEU5xvzQCrMyh6FImqMxhWpckBIM0E9yQYbqOJ8PQpSGwMi6hSxmQRhiCLo0AK3MoupQJKnMYupQJaoRhXdOlKWuQXnzZleFr3zwzbPXsZ/W+7nb98Ieb/hTEnNxqy2eG5265eVh99dWGLotzzr0wfO/754c9/2GX8Mre/9LXOT+4IHyv978999g1vHL3l/Uv3/D7m8KJn/2f/pOlC+avFeRJU/lbpPL1vMf+58nh1tv+Gg5811vDM56+aZrOra8XMAapHSsbKztDnYGNlabh09YbKwxSH6YYpD4cYxZdiMYgjVTKj1qXMEjLOepIDFJNw97WuiTZMEhtTPUNPwapjWWM1rok5yhERzJlR61LkgGDtIxjjOJ+KZLwO6JLfiwlk9Yl6WOQCgXbS9fxJBO6ZOOJLtn4pdHoUkrE3keX7Ax1BnRJ0/Bpd02XpqxB+t2zfxjOPf+njati5owZ4cO9vxO6/nrrNF6Xk/Fp0De9ca+w0/YvXGFcNGB32G6bsO/erx27/ourrgkX/OTS/t8qfdYznhZe/9p/DBf+5LK+mfrSnV4U9v7nV42NnYiGXsAYpHbCbKzsDHUGNlaahk9bb6wwSH2YYpD6cIxZdCEagzRSKT9qXcIgLeeoIzFINQ17W+uSZMMgtTHVN/wYpDaWMVrrkpyjEB3JlB21LkkGDNIyjjGK+6VIwu+ILvmxlExal6SPQSoUbC9dx5NM6JKNJ7pk45dGo0spEXsfXbIz1BnQJU3Dp901XZqyBulPL7kiyP/mrjon7LrzjuFJ66/b/0rc/6/3ZKg8ySlPkx512EFh3txVG1fOZ085LVxz3Q3hnW/dJ2z9nC1WGHPVb64LX/if08OWWzwjvOsdb17hejzxl1tuC/9xwmfDmmusHo7u/bwZPXN2Il96AddskC5ZsnQophkzpg+97hX/0MOLw+IlS8Z+1uzZM8Os3hyurJ8/9oOTRq0/f9myR8MDva+bjq/p06f1C6exH49e8xfzpcda+cXPod+/3li13SB9z9a7hB02eFo4/YYrw5k3XhU/TuuOGKS+U6IL0TUYpOvOHv4NE/r3r4nURP/365HFS/qFKfnZbTdIX73pc8KbnvWicMmtN4ZPX3VhE65WnNMG6bRpq4R5vb3joNdkz38NP//Bhx4OUkiJL+EpXOVVw/uP77vpOBnvX//Ot90g3XL+BuGwF70y3Pbg38NBPzmjCWErzmldkjcUC9ET/d/vyVg/GvhE/fy0EB3vl/TPlvZE/fz4c6bK/KX3S1GX4Fd+/5/qUtM/3Jkq6yf+PqRHz/XTVIieNXN4ncvz56efTfq1z5+u48nnWX3e8nVK+I32+5/W8cb7hzu1r5+Jfv+rrLJKkLpTfKV1vIn++VNx/es6nnDV90uRczxOxc8fP5scPdaPvl+SnDN7mjRn1kxpsv8s9E/ue2BRn1/8v3i/FPtT7ThlDdJBE/Xww4+EY47/dO8Jz3vD2978hvCC5z+ncaj8/VH5O6Rv3ud1Yfttn7fCmMuu+FU47fT/Ddu+4LnhLf/y+hWuy4klS5eGo447sf+zPtj7mt0FC+aHy372y3Dzn/4SNtl4o7D9i54fVps3tzG29KTeWNVskOrP0cRivF9M4u9vwjZ2brL5xTeSbqzieeYvf/70xqrtBuk7Nt8pbLvuJuHshddgkMbFbjhutc5G4Yjt9wwLH7g3HHDBNwyZJjZUF6JrMEjnLBl+Az7Z//2Uf6UvhSl5td0gjf/Y4Gd3/DF88bcXT+xCM2TXBul4aSZ7/vn5w/8Bw1TfP7TdII2/S7cvui8cfuVZ4/06Tdp1rUvyJuLv1VRfP/FzDgJf+vlTg3RQ/on6+fHnlb5/4h8jMNX5xXmWY5NBOtU/v+fvX5NBGvemmrNue/58nTe2mb/8+kFkpo9Tnd94BulU//zW3z/5b+YwgxR+o//+6Tqe/l1salvnj/hu3z9a5z+uyfHyxHG1HjtnkMpEnfujn4bvfu+HYcfe1+P+i/p6XD2JZ55zXvjBeT8Jr9nzFWH33V6iL/XbMcc/vPylYa9XvnyF63LijG+fEy786WVhj5fvHPbYfedw7PGf6f9d0jh43XXmh0M/8O4gX/nr9dLCVLNBmv5LhZRP+i/q0ute8ct6T0Ase/TRsfTTp00Lq/SeglhZP3/sByeNYT//jkX3h/sfXP5feiThYbUBT07HcRMW30O5dNmysGD2vP6PGmSQes1f/DzpcRg/GVvTz9cbq7YbpPs/+yVhu/WfGr7zp19jkKaLsqCPQVoAbZyQk3bZO6wWZg0dNdn//RAdikWothukezxly/DGzbYJl99+c/j8tT8dynUyL0ZTR96D/Atp0aZBr8me/xp+fvqvgIWncJVXDe9/0NxP1vt/tLcPjU/ktt8gfVL4wPNfEcQg/fBl3xmGclKvDTJIa9r/NQGcrPefGqTxfil9j/z+L/9EWMonzp/+nZcxUZfgl8cv5Sr9VJeaDNLIvylezsH/Cf5NBqnc4w97we8Jfk2cdB1PrqdPjMFvOL/09zet441nkKbx6Rx1nf/cObOHGqTwG15/bVo/uo4n603fL7H+lifQxE+PkPWX7p2m9e49pz1+T58Tr/Ol7a7Gp3snDNJ0ZUyB/s9/dXX40v/9ZtjiWU8P795/v8ZPdNGlV4TTzzhr4Ffoxq/g3ecNrw4v3mHbFXL8/g9/DJ/8zH+H9dZdEA7/4L+H666/MUiMPHH65v/zT+Gr3/xuuLz3FKp8Pa98Ta/XS2+sajZIvXhY86Q3/ONtrKw/zyP+olt+Hz71y/M9Uk1IDl2IHmSQTsgPnqJJ9caq7QbpgdvsFnbacLNw2nWXY5A6rEcMUgeISQoxSDeYt2Zytl1drUttN0hfs9nWYd8ttgvoUrvW0ES/G61L8rOaCtET/R6mUn5diG67QVqjLslameo3/BP9+6B1SX5WDfdLE83Ekp+/9Wah1xyLLjVzKT2rdUly8DdIS0k+EafreHIWXXqCTUkLXSqhNjgGXRrMpvQKulRKrjkOXWrmYjnbNV2ask+Qihn5h5v+3PuK3H9a4W+Ifv1bZ/X/PulrXtV7OnTXFZ8OlQV0z71/D4ce9Yn+WjrhuEPDnN6/mImvh3p/W+l9hxzb7x57xMFhrTXXiJf6R/ka38OP+a/wwAMPho986D1h/fXWCeee33tq9ewfjhmi11z3u55h+pXw2lftHl6x64uXi7d09ALGILWQfCy2xo0VhWj7vNeUQW+sMEh9Zi5+LSiFaB+e+kmdGr5iF4PUZ94lCwapH8uaMmldkveNQWqbPX3Djy7ZWMZorUtyjkJ0JFN2rPF+qeyTrpwoCtH+nNElX6ZalyQzBqmdr67jSTZ0ycYUXbLxS6PRpZSIvY8u2RnqDOiSpuHT7pouTVmD9Pvn/Ticdc6Pwuqrzet/ja0c5XX1tdeHz33xq/32IQe/K2y04ZN6X1u1tPeVu+eF3jPZYa+eaTpj+mN/f+zkL5wWrv3tDWHTp24c3vvut4dpva+1W9b76pBPnvylnvn6p/DszZ8R/u2db+7n0v8X/37p6/baI+z2sh37ly6+7MrwtW+eGfbtPT26Q+9vj156+S/CV77xnTDoCVSdb5S2XsAYpKOQax5b48YKg7R5LqfqWb2xwiD1mWUMUh+OMYsuRGOQRirlR61LPEFazlFH8s0Gmoa9rXVJsmGQ2pjqG34MUhvLGK11Sc5RiI5kyo5alyQDT5CWcYxRFKIjCb8juuTHUjJpXZI+BqlQsL10HU8yoUs2nuiSjV8ajS6lROx9dMnOUGdAlzQNn3bXdGnKGqR/v+/+cNx/nhzuu/+B/soQI3TRokXhrrvv7fdf/Y+7hT1esXO//atfXxtOOfXr/fbb93tj2OZ5W/Xbt91+Rzj+xM8HeSJ09uxZYcMN1g8Lb719rP+BA/cPT1p/3f7Y+H/RgN1k443C+w9859jfXJJcH/34p/uG7a477xjO//El/fcmX7+b5oi5So56AVOILiG4fEyNGysM0uXncKr39MYKg9RntjFIfTjGLLoQjS5FKuVHrUsYpOUcdSQGqaZhb2tdkmwYpDam+oYfg9TGMkZrXZJzFKIjmbKj1iXJgEFaxjFGUYiOJPyO6JIfS8mkdUn6GKRCwfbSdTzJhC7ZeKJLNn5pNLqUErH30SU7Q50BXdI0fNpd06Upa5DKcniwZ4ie+pVv9f/+pzz5Ka9115kfXvaS7fv/65/o/d+dd90TPvqxk4L8YfkjPvyesM6C+fFS79rd4fNfOj3csvC2sXNitu7/tn3Cgvlrj52TxiOPLA4fOuLjYfHiJeHoww4Ka6+1/N8xE1P022ed238KVZ5Gla/XjU+YLpfI0NELmCdIDSAfD61xY4VBap/3mjLojRUGqc/MYZD6cIxZdCEagzRSKT9qXcIgLeeoI6NBevui+8LP7rg5zOn9o7i2vt74zBf039o3f/fztr7FfuH0RetsEtZbdfX+e8QgtU2VvuHHILWxjNFal+QchehIpuyodUkyYJCWcYxRFKIjCb+jvl+SrOiSja3WJcmEQWrjKdG6jid9dEkolL/QpXJ2TZHoUhMV2zl0ycYvjUaXUiL2ftd0aUobpHE5PNr76lwxOufNnRtWXXVOPL3cccmSJf3+jBkzljsfO0t6X8N75513hwUL1h77Ct54bZSjGLW3//VvYb11F4Tpj3+V7yjx443VCxiDdDxa41+vcWOFQTr+vE6lEXpjhUHqM7MYpD4cYxZdiMYgjVTKj1qXMEjLOepIbZAefuVZ+lKr2nNnzApf3uMt/fe03/dPDYuWPNKq96ffzDEvfDUGqQZiaOsbfgxSA0gVqnVJTlOIVnAKmlqXJByDtACiCqEQrWA4NfX9kqTEILWB1bokmTBIbTwlWtfxpI8uCYXyF7pUzq4pEl1qomI7hy7Z+KXR6FJKxN7vmi51wiC1L4t6MugFjEFqn7caN1YYpPZ5rymD3lhhkPrMHAapD8eYRReiMUgjlfKj1iUM0nKOOhKDVNPwaWOQ+nCULPqGH4PUh6vWJclIIdrGVeuSZMIgtfGkEG3j1xSt75fkOgZpE6X8c1qXJAqDNJ/doJG6jidj0KVBpPLOo0t5nHJHoUu5pPLHoUv5rHJGoks5lEYb0zVdwiAdbX20frRewBik9umqcWOFQWqf95oy6I0VBqnPzGGQ+nCMWXQhGoM0Uik/al3CIC3nqCMxSDUNnzYGqQ9HyaJv+DFIfbhqXZKMFKJtXLUuSSYMUhtPCtE2fk3R+n5JrmOQNlHKP6d1SaIwSPPZDRqp63gyBl0aRCrvPLqUxyl3FLqUSyp/HLqUzypnJLqUQ2m0MV3TJQzS0dZH60frBYxBap+uGjdWGKT2ea8pg95YYZD6zBwGqQ/HmEUXojFII5Xyo9YlDNJyjjoSg1TT8GljkPpwlCz6hh+D1Ier1iXJSCHaxlXrkmTCILXxpBBt49cUre+X5DoGaROl/HNalyQKgzSf3aCRuo4nY9ClQaTyzqNLeZxyR6FLuaTyx6FL+axyRqJLOZRGG9M1XcIgHW19tH60XsAYpPbpqnFjhUFqn/eaMuiNFQapz8xhkPpwjFl0IRqDNFIpP2pdwiAt56gjMUg1DZ92NEhFl+546H6fpBOQZb9nbx922nCzCcjsl1Lf8GOQ+nDVuiQZKUTbuGpdkkwYpDaeFKJt/Jqi9f2SXMcgbaKUf07rkkRhkOazGzRS1/FkDLo0iFTeeXQpj1PuKHQpl1T+OHQpn1XOSHQph9JoY7qmSxiko62P1o/WCxiD1D5dNW6sMEjt815TBr2xwiD1mTkMUh+OMYsuRGOQRirlR61LGKTlHHUkBqmm4dPWBun199zuk3QCshy4zW4YpI5ct1pno3DE9nuGhQ/cGw644BuOmX1TaV2SzBSibXy1LkkmDFIbTwrRNn5N0fp+Sa5jkDZRyj9HITqfVe5IXceTGHQpl1zzOHSpmUvpWXSplNzgOHRpMJuSK+hSCbXhMV3TJQzS4euhuqt6AWOQ2qevxo0VBql93mvKoDdWGKQ+M4dB6sMxZtGFaAzSSKX8qHUJg7Sco47EINU0fNoYpD4cJYu+4ecJUh+uWpckI4VoG1etS5IJg9TGk0K0jV9TtL5fkusYpE2U8s9pXZIoniDNZzdopK7jyRh0aRCpvPPoUh6n3FHoUi6p/HHoUj6rnJHoUg6l0cZ0TZcwSEdbH60frRcwBql9umrcWGGQ2ue9pgx6Y4VB6jNzGKQ+HGMWXYjGII1Uyo9alzBIyznqSAxSTcOnjUHqw1Gy6Bt+DFIfrlqXJCOFaBtXrUuSCYPUxpNCtI1fU7S+X5LrGKRNlPLPaV2SKAzSfHaDRuo6noxBlwaRyjuPLuVxyh2FLuWSyh+HLuWzyhmJLuVQGm1M13QJg3S09dH60XoBU4i2T1eNGysMUvu815RBb6wwSH1mDoPUh2PMogvR6FKkUn7UuoRBWs5RR2KQaho+bQxSH46SRd/wY5D6cNW6JBkpRNu4al2STBikNp4Uom38mqL1/ZJcxyBtopR/TuuSRGGQ5rMbNFLX8WQMujSIVN55dCmPU+4odCmXVP44dCmfVc5IdCmH0mhjuqZLGKSjrY/Wj9YLmCdI7dNV48YKg9Q+7zVl0BsrDFKfmcMg9eEYs+hCNAZppFJ+1LqEQVrOUUdikGoaPm0MUh+OkkXf8GOQ+nDVuiQZKUTbuGpdkkwYpDaeFKJt/Jqi9f2SXMcgbaKUf07rkkRhkOazGzRS1/FkDLo0iFTeeXQpj1PuKHQpl1T+OHQpn1XOSHQph9JoY7qmSxiko62P1o/WCxiD1D5dNW6sMEjt815TBr2xwiD1mTkMUh+OMYsuRGOQRirlR61LGKTlHHUkBqmm4dPGIPXhKFn0DT8GqQ9XrUuSkUK0javWJcmEQWrjSSHaxq8pWt8vyXUM0iZK+ee0LkkUBmk+u0EjdR1PxqBLg0jlnUeX8jjljkKXcknlj0OX8lnljESXciiNNqZruoRBOtr6aP1ovYAxSO3TVePGCoPUPu81ZdAbKwxSn5nDIPXhGLPoQjQGaaRSftS6hEFazlFHYpBqGj5tDFIfjpJF3/BjkPpw1bokGSlE27hqXZJMGKQ2nhSibfyaovX9klzHIG2ilH9O65JEYZDmsxs0UtfxZAy6NIhU3nl0KY9T7ih0KZdU/jh0KZ9Vzkh0KYfSaGO6pksYpKOtj9aP1gsYg9Q+XTVurDBI7fNeUwa9scIg9Zk5DFIfjjGLLkRjkEYq5UetSxik5Rx1JAappuHTxiD14ShZ9A0/BqkPV61LkpFCtI2r1iXJhEFq40kh2savKVrfL8l1DNImSvnntC5JFAZpPrtBI3UdT8agS4NI5Z1Hl/I45Y5Cl3JJ5Y9Dl/JZ5YxEl3IojTama7qEQTra+mj9aL2AMUjt01XjxgqD1D7vNWXQGysMUp+ZwyD14Riz6EI0BmmkUn7UuoRBWs5RR2KQaho+bQxSH46SRd/wY5D6cNW6JBkpRNu4al2STBikNp4Uom38mqL1/ZJcxyBtopR/TuuSRGGQ5rMbNFLX8WQMujSIVN55dCmPU+4odCmXVP44dCmfVc5IdCmH0mhjuqZLGKSjrY/Wj9YLGIPUPl01bqwwSO3zXlMGvbHCIPWZOQxSH44xiy5EY5BGKuVHrUsYpOUcdSQGqabh08Yg9eEoWfQNPwapD1etS5KRQrSNq9YlyYRBauNJIdrGryla3y/JdQzSJkr557QuSRQGaT67QSN1HU/GoEuDSOWdR5fyOOWOQpdySeWPQ5fyWeWMRJdyKI02pmu6hEE62vpo/Wi9gDFI7dNV48YKg9Q+7zVl0BsrDFKfmcMg9eEYs+hCNAZppFJ+1LqEQVrOUUdikGoaPm0MUh+OkkXf8GOQ+nDVuiQZKUTbuGpdkkwYpDaeFKJt/Jqi9f2SXMcgbaKUf07rkkRhkOazGzRS1/FkDLo0iFTeeXQpj1PuKHQpl1T+OHQpn1XOSHQph9JoY7qmSxiko62P1o/WCxiD1D5dNW6sMEjt815TBr2xwiD1mTkMUh+OMYsuRGOQRirlR61LGKTlHHUkBqmm4dPGIPXhKFn0DT8GqQ9XrUuSkUK0javWJcmEQWrjSSHaxq8pWt8vyXUM0iZK+ee0LkkUBmk+u0EjdR1PxqBLg0jlnUeX8jjljkKXcknlj0OX8lnljESXciiNNqZruoRBOtr6aP1ovYAxSO3TVePGCoPUPu81ZdAbKwxSn5nDIPXhGLPoQjQGaaRSftS6hEFazlFHYpBqGj5tDFIfjpJF3/BjkPpw1bokGSlE27hqXZJMGKQ2nhSibfyaovX9klzHIG2ilH9O65JEYZDmsxs0UtfxZAy6NIhU3nl0KY9T7ih0KZdU/jh0KZ9Vzkh0KYfSaGO6pksYpKOtj9aP1guYQrR9umrcWGGQ2ue9pgx6Y4VB6jNzGKQ+HGMWXYhGlyKV8qPWJQzSco46EoNU0/BpY5D6cJQs+oYfg9SHq9YlyUgh2sZV65JkwiC18aQQbePXFK3vl+Q6BmkTpfxzWpckCoM0n92gkbqOJ2PQpUGk8s6jS3mcckehS7mk8sehS/msckaiSzmURhvTNV3CIB1tfbR+tF7APEFqn64aN1YYpPZ5rymD3lhhkPrMHAapD8eYRReiMUgjlfKj1iUM0nKOOhKDVNPwaWOQ+nCULPqGH4PUh6vWJclIIdrGVeuSZMIgtfGkEG3j1xSt75fkOgZpE6X8c1qXJAqDNJ/doJG6jidj0KVBpPLOo0t5nHJHoUu5pPLHoUv5rHJGoks5lEYb0zVdwiAdbX20frRewBik9umqcWOFQWqf95oy6I0VBqnPzGGQ+nCMWXQhGoM0Uik/al3CIC3nqCMxSDUNnzYGqQ9HyaJv+DFIfbhqXZKMFKJtXLUuSSYMUhtPCtE2fk3R+n5JrmOQNlHKP6d1SaIwSPPZDRqp63gyBl0aRCrvPLqUxyl3FLqUSyp/HLqUzypnJLqUQ2m0MV3TJQzS0dZH60frBYxBap+uGjdWGKT2ea8pg95YYZD6zBwGqQ/HmEUXojFII5Xyo9YlDNJyjjoSg1TT8GljkPpwlCz6hh+D1Ier1iXJSCHaxlXrkmTCILXxpBBt49cUre+X5DoGaROl/HNalyQKgzSf3aCRuo4nY9ClQaTyzqNLeZxyR6FLuaTyx6FL+axyRqJLOZRGG9M1XcIgHW19tH60XsAYpPbpqnFjhUFqn/eaMuiNFQapz8xhkPpwjFl0IRqDNFIpP2pdwiAt56gjMUg1DZ82BqkPR8mib/gxSH24al2SjBSibVy1LkkmDFIbTwrRNn5N0fp+Sa5jkDZRyj+ndUmiMEjz2Q0aqet4MgZdGkQq7zy6lMcpdxS6lEsqfxy6lM8qZyS6lENptDFd0yUM0tHWR+tH6wWMQWqfrho3Vhik9nmvKYPeWGGQ+swcBqkPx5hFF6IxSCOV8qPWJQzSco46EoNU0/BpY5D6cJQs+oYfg9SHq9YlyUgh2sZV65JkwiC18aQQbePXFK3vl+Q6BmkTpfxzWpckCoM0n92gkbqOJ2PQpUGk8s6jS3mcckehS7mk8sehS/msckaiSzmURhvTNV3CIB1tfbR+tF7AGKT26apxY4VBap/3mjLojRUGqc/MYZD6cIxZdCEagzRSKT9qXcIgLeeoIzFINQ2fNgapD0fJom/4MUh9uGpdkowUom1ctS5JJgxSG08K0TZ+TdH6fkmuY5A2Uco/p3VJojBI89kNGqnreDIGXRpEKu88upTHKXcUupRLKn8cupTPKmckupRDabQxXdMlDNLR1kfrR+sFjEFqn64aN1YYpPZ5rymD3lhhkPrMHAapD8eYRReiMUgjlfKj1iUM0nKOOhKDVNPwaWOQ+nCULPqGH4PUh6vWJclIIdrGVeuSZMIgtfGkEG3j1xSt75fkOgZpE6X8c1qXJAqDNJ/doJG6jidj0KVBpPLOo0t5nHJHoUu5pPLHoUv5rHJGoks5lEYb0zVdwiAdbX20frRewBik9umqcWOFQWqf95oy6I0VBqnPzGGQ+nCMWXQhGoM0Uik/al3CIC3nqCMxSDUNnzYGqQ9HyaJv+DFIfbhqXZKMFKJtXLUuSSYMUhtPCtE2fk3R+n5JrmOQNlHKP6d1SaIwSPPZDRqp63gyBl0aRCrvPLqUxyl3FLqUSyp/HLqUzypnJLqUQ2m0MV3TJQzS0dZH60frBYxBap+uGjdWGKT2ea8pg95YYZD6zBwGqQ/HmEUXojFII5Xyo9YlDNJyjjoSg1TT8GljkPpwlCz6hh+D1Ier1iXJSCHaxlXrkmTCILXxpBBt49cUre+X5DoGaROl/HNalyQKgzSf3aCRuo4nY9ClQaTyzqNLeZxyR6FLuaTyx6FL+axyRqJLOZRGG9M1XcIgHW19tH60XsAUou3TVePGCoPUPu81ZdAbKwxSn5nDIPXhGLPoQjS6FKmUH7UuYZCWc9SRGKSahk8bg9SHo2TRN/wYpD5ctS5JRgrRNq5alyQTBqmNJ4VoG7+maH2/JNcxSJso5Z/TuiRRGKT57AaN1HU8GYMuDSKVdx5dyuOUOwpdyiWVPw5dymeVMxJdyqE02piu6RIG6Wjro/Wj9QLmCVL7dNW4scIgtc97TRn0xgqD1GfmMEh9OMYsuhCNQRqplB+1LmGQlnPUkRikmoZPG4PUh6Nk0Tf8GKQ+XLUuSUYK0TauWpckEwapjSeFaBu/pmh9vyTXMUibKOWf07okURik+ewGjdR1PBmDLg0ilXceXcrjlDsKXcollT8OXcpnlTMSXcqhNNqYrukSBulo66P1o/UCxiC1T1eNGysMUvu815RBb6wwSH1mDoPUh2PMogvRGKSRSvlR6xIGaTlHHYlBqmn4tDFIfThKFn3Dj0Hqw1XrkmSkEG3jqnVJMmGQ2nhSiLbxa4rW90tyHYO0iVL+Oa1LEoVBms9u0Ehdx5Mx6NIgUnnn0aU8Trmj0KVcUvnj0KV8Vjkj0aUcSqON6ZouYZCOtj5aP1ovYAxS+3TVuLHCILXPe5rh9/fckZ5qTf/BRQ+F2avMCOutunrAIPWZFgxSH44xiy5E12KQtvl3/uGHHwmPLF4Snrr6goBBGleZ7YhBauPXFI1B2kSl7Jy+4ccgLWOYRmldkmsUolNCo/VrvF8a7ROu3NEUov15U4j2Zap1STJjkNr56jqeZEOXbEzRJRu/NBpdSonY++iSnaHOgC5pGj7trukSBqnPumlNFr2AMUjt01LjxgqD1D7vaYb9vn9qWLTkkfR0a/q1FaJPu+7ycOaNV7WGX/pGMEhTIra+LkTXYpAedenZ4eo7F9o++ARGv2PzncK2626CQerEGIPUCaRKU5suqbfeuqa+4ccg9ZkerUuSkUK0jWuN90u2Tzyx0RSi/flSiPZlqnVJMmOQ2vnqOp5kQ5dsTNElG780Gl1Kidj76JKdoc6ALmkaPu2u6RIGqc+6aU0WvYAxSO3TUuPGCoPUPu9pBgzSlEhZ/8Btdgs7bbhZwCAt45dGbbXORuGI7fcMCx+4NxxwwTfSy63p60I0BqnPtGCQ+nCMWTBIIwm/IwapH0t9w49B6sNV65JkpBBt41rj/ZLtE09sNIVof74Uon2Zal2SzBikdr66jifZ0CUbU3TJxi+NRpdSIvY+umRnqDOgS5qGT7truoRB6rNuWpNFL2AMUvu01LixwiC1z3uaAYM0JVLWxyAt4zYoCoN0EJny8yftsnfYYN6agSdIyxnqyNdstnXYd4vtQi26dPui+8LhV56lP0Kr2nNnzApf3uMt/feELvlMTdQln2wTk0Xf8GOQ+jDGIPXhGLPUeL8U33sbjxSi/WeFQrQvU61LkhmD1M5X1/EkGwapjSm6ZOOXRqNLKRF7H12yM9QZ0CVNw6fdNV3CIPVZN63JohcwBql9WmrcWNVSiJbZmT59Wlhjtbn2iZrgDBSifQDHQjRPkPrwxCD14aizYJBqGvY2Bqmdoc6AQapp+LSjLvlkm5gs+oYfg9SHMQapD8eYpcb7pfje23ikEO0/KxSifZlqXZLMGKR2vrqOJ9kwSG1M0SUbvzQaXUqJ2Pvokp2hzoAuaRo+7a7pEgapz7ppTRa9gDFI7dNS48YKg9Q+72kGDNKUSFk/FqIxSMv4pVEYpCkRex+D1M5QZ8Ag1TTsbQxSO8M0Q9Sl9Hyb+vqGH4PUZ2YwSH04xiw13i/F997GI4Vo/1mhEO3LVOuSZMYgtfPVdTzJhkFqY4ou2fil0ehSSsTeR5fsDHUGdEnT8Gl3TZcwSH3WTWuy6AWMQWqflho3Vhik9nlPM2CQpkTK+rEQjUFaxi+NwiBNidj7GKR2hjoDBqmmYW9jkNoZphmiLqXn29TXN/wYpD4zg0HqwzFmqfF+Kb73Nh4pRPvPCoVoX6ZalyQzBqmdr67jSTYMUhtTdMnGL41Gl1Ii9j66ZGeoM6BLmoZPu2u6hEHqs25ak0Uv4AMuOSMsWrq4Ne8tfSOxEJ2eb1O/xo0VBqn/CsIg9WEaC9EYpD48MUh9OOosUZf4G6SaSnkbg7ScXVMkBmkTFdu5qEu2LBMbrW/4MUh9WGOQ+nCMWWq8X4rvvY1HCtH+s0Ih2pep1iXJjEFq56vreJINg9TGFF2y8Uuj0aWUiL2PLtkZ6gzokqbh0+6aLmGQ+qyb1mTRC5gnSO3TUuPGCoPUPu9pBgzSlEhZPxaiMUjL+KVRGKQpEXsfg9TOUGfAINU07G0MUjvDNEPUpfR8m/r6hh+D1GdmMEh9OMYsNd4vxffexiOFaP9ZoRDty1TrkmTGILXz1XU8yYZBamOKLtn4pdHoUkrE3keX7Ax1BnRJ0/Bpd02XMEh91k1rsugFjEFqn5YaN1YYpPZ5TzNgkKZEyvqxEI1BWsYvjcIgTYnY+xikdoY6AwappmFvY5DaGaYZoi6l59vU1zf8GKQ+M4NB6sMxZqnxfim+9zYeKUT7zwqFaF+mWpckMwapna+u40k2DFIbU3TJxi+NRpdSIvY+umRnqDOgS5qGT7truoRB6rNuWpNFL2AMUvu01LixwiC1z3uaAYM0JVLWj4VoDNIyfmkUBmlKxN7HILUz1BkwSDUNexuD1M4wzRB1KT3fpr6+4ccg9ZkZDFIfjjFLjfdL8b238Ugh2n9WKET7MtW6JJkxSO18dR1PsmGQ2piiSzZ+aTS6lBKx99ElO0OdAV3SNHzaXdMlDFKfddOaLHoBY5Dap6XGjRUGqX3e0wwYpCmRsn4sRGOQlvFLozBIUyL2PgapnaHOgEGqadjbGKR2hmmGqEvp+Tb19Q0/BqnPzGCQ+nCMWWq8X4rvvY1HCtH+s0Ih2pep1iXJjEFq56vreJINg9TGFF2y8Uuj0aWUiL2PLtkZ6gzokqbh0+6aLmGQ+qyb1mTRCxiD1D4tNW6sMEjt855mwCBNiZT1YyEag7SMXxqFQZoSsfcxSO0MdQYMUk3D3sYgtTNMM0RdSs+3qa9v+DFIfWYGg9SHY8xS4/1SfO9tPFKI9p8VCtG+TLUuSWYMUjtfXceTbBikNqboko1fGo0upUTsfXTJzlBnQJc0DZ9213QJg9Rn3bQmi17AGKT2aalxY4VBap/3NAMGaUqkrB8L0RikZfzSKAzSlIi9j0FqZ6gzYJBqGvY2BqmdYZoh6lJ6vk19fcOPQeozMxikPhxjlhrvl+J7b+ORQrT/rFCI9mWqdUkyY5Da+eo6nmTDILUxRZds/NJodCklYu+jS3aGOgO6pGn4tLumSxikPuumNVn0AsYgtU9LjRsrDFL7vKcZMEhTImX9WIjGIC3jl0ZhkKZE7H0MUjtDnQGDVNOwtzFI7QzTDFGXfvyX36WXWtNfsmRpeHjxkrDDepsGDFKfacEg9eEYs9R4vxTfexuPFKL9Z4VCtC9TCtG+PCWbruNJH4NUKJS/0KVydk2R6FITFds5dMnGL41Gl1Ii9n7XdAmD1L5mWpVBL2AMUvvU1LixwiC1z3uaAYM0JVLWj4VoDNIyfmkUBmlKxN7HILUz1BkwSDUNexuD1M4wzYAupURs/Rp1ST4xhWjbvNd4v2T7xBMbTSHany+FaF+mFKJ9eUo2XceTProkFMpf6FI5u6ZIdKmJiu0cumTjl0ajSykRe79ruoRBal8zrcqgFzAGqX1qatxYYZDa5z3NgEGaEinrU4gu4zYoqsZC9AGXnBEWLV086CNN+nkMUt8pwCD15YlB6stTsqFLvkxr1CUhQCHatg5qvF+yfeKJjaYQ7c+XQrQvUwrRvjwlm67jSR9dEgrlL3SpnF1TJLrURMV2Dl2y8Uuj0aWUiL3fNV3CILWvmVZl0Au4lkJ0qwAmb6bGjRUGaTKJDl0MUgeIvRQUon04xiw1FqJr0aWjLj07XH3nwoi6dcd3bL5T2HbdTcK3bvplOPcv17Xu/cU3hEEaSfgcMUh9OOos6JKmYW/XqEvyqSlE2+a+xvsl2yee2GgK0f58KUT7MqUQ7ctTsuk6nvTRJaFQ/kKXytk1RaJLTVRs59AlG780Gl1Kidj7XdMlDFL7mmlVBr2AeYLUPjU1bqwwSO3znmbAIE2JlPUpRJdxGxRVYyEag3TQbI52HoN0NF7jjd58rfXDe5+zW7h90X3h8CvPGm/4pF3HIPVHjy75Mq1Rl4QAhWjbOqjxfsn2iSc2mkK0P18K0b5MKUT78pRsuo4nfXRJKJS/0KVydk2R6FITFds5dMnGL41Gl1Ii9n7XdAmD1L5mWpVBL2AMUvvU1LixwiC1z3uaAYM0JVLWpxBdxm1QVI2FaAzSQbM52nkM0tF4jTcag3Q8QqNfP+aFrw7rrbp6OOE3PwrX33P76AlWUgS65Au6Rl0SAhSibeugxvsl2yee2GgK0f58KUT7MqUQ7ctTsuk6nvTRJaFQ/kKXytk1RaJLTVRs59AlG780Gl1Kidj7XdMlDFL7mmlVBr2AMUjtU1PjxgqD1D7vaQYM0pRIWZ9CdBm3QVE1FqIxSAfN5mjnMUhH4zXeaAzS8QiNfh2DdHRmwyJ2f/IW4fWbPj9ccccfwym/vXjY0Em9VqMuCTAK0bZlU+P9ku0TT2w0hWh/vhSifZlSiPblKdl0HU/66JJQKH+hS+XsmiLRpSYqtnPoko1fGo0upUTs/a7pEgapfc20KoNewBik9qmpcWOFQWqf9zQDBmlKpKyPQVrGbVBUjYVoDNJBsznaeQzS0XiNNxqDdDxCo1/HIB2d2bAIDNJhdEa/tuqMmeFTO7xhLJBC9BiKokaN90tFH3QlBVGI9gdNIdqXKYVoX56STdfxpI8uCYXyF7pUzq4pEl1qomI7hy7Z+KXR6FJKxN7vmi5hkNrXTKsy6AWMQWqfmho3Vhik9nlPM2CQpkTK+hikZdwGRWGQDiJTfv6kXfYOG8xbMxx16dnh6jsXliea4EgMUl/AGKS+PCUbBqkvUwxSX54YpL48a7xf8iXgm41CtC9PyUYh2pcphWhfnpJN1/Gkj0EqFMpf6FI5u6ZIdKmJiu0cumTjl0ajSykRe79ruoRBal8zrcqgFzAGqX1qatxYYZDa5z3NgEGaEinrY5CWcRsUhUE6iEz5eQzScnZNka/ZbOuw7xbbhVp06fZF94XDrzyr6aO04tzcGbPCl/d4S/+9oEs+U4Iu+XCMWWrUJXnvFKLjDJYda7xfKvukKyeKQrQ/ZwrRvkwpRPvylGy6jid9dEkolL/QpXJ2TZHoUhMV2zl0ycYvjUaXUiL2ftd0CYPUvmZalUEvYAxS+9TUuLGqpRAtszN9+rSwxmpz7RM1wRkoRPsAphDtwzFmqbEQzVfsxtmzHXmC1MYvjeYJ0pSIvc8TpHaGOgNPkGoa9jZPkNoZ6gw13i/p99+2NoVo/xmhEO3LlEK0L0/Jput40scgFQrlL3SpnF1TJLrURMV2Dl2y8Uuj0aWUiL3fNV3CILWvmVZl0AsYg9Q+NTVurDBI7fOeZsAgTYmU9TFIy7gNisIgHUSm/DxPkJaza4rkCdImKuXneIK0nN2gSHRpEJmy8zXqknxSCtFl8x2jarxfiu+9jUcK0f6zQiHalymFaF+ekk3X8aSPLgmF8he6VM6uKRJdaqJiO4cu2fil0ehSSsTe75ouYZDa10yrMugFjEFqn5oaN1YYpPZ5TzNgkKZEyvoUosu4DYqqsRDNE6SDZnO08zxBOhqv8UbzBOl4hEa/zhOkozMbFsETpMPojH6NJ0hHZzYsosb7pWGfZ7KvUYj2nwEK0b5MKUT78pRsuo4nfQxSoVD+QpfK2TVFoktNVGzn0CUbvzQaXUqJ2Ptd0yUMUvuaaVUGvYBrKUS3CmDyZmrcWGGQJpPo0MUgdYDYS4FB6sMxZsEgjST8jjxB6sdSMvEEqS9PniD15SnZ0CVfpjXqkhCgEG1bBzXeL9k+8cRGU4j250sh2pcphWhfnpJN1/Gkjy4JhfIXulTOrikSXWqiYjuHLtn4pdHoUkrE3u+aLnXKID3l1K+HhbfeHp680Qbh7fu9MWu1LF6yJJz5vfPCNdf9Ltzxt7vCuuvMD1tu8cyw154vDzNnzFghx48vujycd8FF4Z577wtPf9omYb83vS6svdaay437+S9/E87+/vnhJTtuG3bdecflrlk7egHzBKmVZgg1bqwwSO3znmbAIE2JlPUpRJdxGxRVYyG6ln+4c9SlZ4er71w4CP2kn+cJUt8p4AlSX56SjSdIfZnyBKkvT54g9eVZ4/2SLwHfbBSifXlKNgrRvkwpRPvylGy6jid9DFKhUP5Cl8rZNUWiS01UbOfQJRu/NBpdSonY+13Tpc4YpJdc9vPw1W9+t79CFsxfOxx92EHjrpaHHno4/Ndn/jvcsvC2/tjZs2eFhx9+pN/eaMMnhfe+++1hzpzZY3muvvb68LkvfjXIuKc8ecNww403h/Rn3fv3+8JhR58Qpk+bFo454uCw2ry5Y/EeDb2AMUjtRGvcWGGQ2uc9zYBBmhIp62OQlnEbFIVBOohM+XmeIC1n1xTJE6RNVMrP8QRpObtBkejSIDJl52vUJfmkFKLL5jtG1Xi/FN97G48Uov1nhUK0L1MK0b48JZuu40kfXRIK5S90qZxdUyS61ETFdg5dsvFLo9GllIi93zVd6oRBev/9D/RNSXkaVF6paTlo2Zx+xpnhokuvDKuvNi984KD9w/y11wp33X1POP6Tnw/39XK+eIcXhn3esNdY+Je/9v/Cz668Khxy8LuCGKifPeW03pOnN4Tjjnx/WHON1fvjPnHSKeGmm/8c9n/bm8Jzt9p8LNaroRcwBqmdao0bKwxS+7ynGTBIUyJlfQrRZdwGRdVYiOYJ0kGzOdp5niAdjdd4o3mCdDxCo1/nCdLRmQ2L4AnSYXRGv8YTpKMzGxZR4/3SsM8z2dcoRPvPAIVoX6YUon15SjZdx5M+BqlQKH+hS+XsmiLRpSYqtnPoko1fGo0upUTs/a7pUicM0i/8z+nhqt9cF7Z53lbhF7+6OssglSdFDz70uLBs2bJw5CEH9r9aNy4v+ardI487MUzrPQV6wnGHhFmzZvUvnXjyl/pPjX7mhKPCKqusEr591rn9r9v9YM9cfcrGG4ULf3pZOOPb54QX9N7H2zK/4jf+zNyjXsAYpLnUBo+rcWOFQTp4PkuvYJCWkls+DoN0eR7WHgapleCK8TxBuiITyxmeILXQWzGWJ0hXZGI9gy5ZCS4fX6MuySegEL38PI7aq/F+adTPuDLHU4j2p00h2pcphWhfnpJN1/Gkjy4JhfIXulTOrikSXWqiYjuHLtn4pdHoUkrE3u+aLk15g/Ta394QTv7Caf2nQA8+4B3hiGNPzDJIr/j5r8OpX/1W2Lj390o/9L5/XWFlfeyEz4U/33JreMu+rw/bbvPc/vWvfOM74dLLfxHk52y6ycbhk72v5/39H/4YPv7RD4VFix7qm6qrzpkTju19ta58De9EvPQCxiC1E65xY4VBap/3NAMGaUqkrE8huozboKgaC9E8QTpoNkc7zxOko/EabzRPkI5HaPTrPEE6OrNhETxBOozO6Nd4gnR0ZsMiarxfGvZ5JvsahWj/GaAQ7cuUQrQvT8mm63jSxyAVCuUvdKmcXVMkutRExXYOXbLxS6PRpZSIvd81XZrSBukjjywOh330hPDAAw+G9/zrW8L6660TDj3qE1kG6TnnXhi+9/3zw57/sEt4Ze9/6eucH1wQvtf735577BpeufvL+pdv+P1N4cTP/k//ydIF89cK8qSp/C1S+XreY//z5HDrbX8NB77rreEZT980TefW1wsYg9SOtcaNFQapfd7TDBikKZGyPgZpGbdBURikg8iUn+cJ0nJ2TZE8QdpEpfwcT5CWsxsUiS4NIlN2vkZdkk9KIbpsvmNUjfdL8b238Ugh2n9WKET7MqUQ7ctTsuk6nvTRJaFQ/kKXytk1RaJLTVRs59AlG780Gl1Kidj7XdOlKW2QytfZytfaylfrvr33lbb33Pv3bIM0Pg36pjfuFXba/oUrrKyLL7syfO2bZ4Ydttsm7Lv3a8eu/+Kqa8IFP7m0/7dKn/WMp4XXv/Yfw4U/uaxvpr50pxeFvf/5VWNjJ6KhFzAGqZ1wjRsrDFL7vKcZMEhTImV9CtFl3AZF1ViI5gnSQbM52nmeIB2N13ijeYJ0PEKjX+cJ0tGZDYvgCdJhdEa/xhOkozMbFlHj/dKwzzPZ1yhE+88AhWhfphSifXlKNl3Hkz4GqVAof6FL5eyaItGlJiq2c+iSjV8ajS6lROz9runSlDVIb1l4WzjuE58NM2fMCMce+f4wb+6qIxmknz3ltHDNdTeEd751n7D1c7ZYYWXJ3zSVv2265RbPCO96x5tXuB5P/OWW28J/nPDZsOYaq4ejDzsozOi9n4l86QVcs0G6ZMnSoZhmzJg+9LpX/EMPLw6LlywZ+1mzZ88Ms3pzuLJ+/tgPThrDfv5UMEi95i/BNtYdxk8GpT//7eedFh5c8shYfNsatRSi37P1LmGHDZ4WTr/hynDmjVe1DePY+6EQPYbCpaEL0TUYpOvOXi3zgFx/AAAS5ElEQVQc87NzwjV33ery+SciSS0G6as3fU5407NeFC659cbw6asunAgULjnrMUhnhi/v8db+Z+Yf7rhMfeAf7vhwjFm2nL9BOOxFrwy3Pfj3cNBPzoinW3fUuiRvLhai0/1f+sZH3T92JT4tRMf7pa58/vg5vdbPsmWPhgd6f54nvqZNWyXMW3VOq+8/5b16ff74udOj5ffvwYceDlLgj681Vpsbpk+fFrv9Y5vfv7xBy+f3jm8qRM+aObzO1ab335/w5P8me/51HU/e2urzVl3uHcJvtPpfWsebu+rsMHvWzOWY6s5kz3/bf/4qq6wSxNCLL/nvp/x3NL7a/v7b+PuTGqSi86L3Ta82vn/9Ptsw/48sXhJEm+JrZk+T5jz+Ow+/0f77GRne98Ci2Owf4/3ScienUGdKGqSPPvpoOPpjJ4W/3nFnePM+rwvbb/u8/pSN8gSp/P1R+TukOl7P+2VX/Cqcdvr/hm1f8Nzwln95vb401l6ydGk46rgTe0+T3hs+2Pua3QUL5ofLfvbLcPOf/hI22XijsP2Lnh9Wm/eEqIwFGhp6Y1WzQao/RxOO8X4xuxw/FQzSts1f202dWgzSaOqcvfAaDNKm/7CNeI4nSEcEljFcvmJ3zpLp4YRf/yhcf+/tGRGTMyT+Ln3rpl+Gc/9y3eS8iYyfWss/NqjFIBVT5/9ikGasvPwhGKT5rHJG1vS79Kkd3jD2keJ9Rdv2n2Nv8PFGfJ/p+difrPefGqTx/aTHtr7/+D4nix8//zECE80/cpZjk0E60T9/Kq3/JoNUF6Y169ieSp8/fiZ9ZP3cr3Gs0J7s+R/PIGX+hs+f/DdzmEEKv+H8mtZ/apCu8EujTjTFq8srPIGur0mb+NVSJMv1Wb/D12+ENd46iuNqPU5Jg/RHF14c/vfMH4SnbvLk8P4D3jk2N6MYpGeec174wXk/Ca/Z8xVh991eMpYjNs790U/Dd7/3w/APL39p2OuVL4+nlzvGr/jd4+U7hz123zkce/xn+n+XNA5ad5354dAPvLv/lGs8Zz3qX+y2mzrxb701feb0XyqkY9J/UZde94pf1vuXpst6hnt8TZ82LazS+1c9K+vnx5+bHof9/KlgkHrNX8ot9ofxkzHpz3/XT74eHlr6xL9GinnacqzFIN3/2S8J263/1PCdP/0ag9Rh8WCQOkBMUogurRZmheN/9cPw27tvS662p1uLQbrHU7YMb9xsm3D57TeHz1/70/YATN5JLaYOf4M0mTiHLgapA0SVYvO1nhQ+8PxXhNsX3Rc+fNl31JV2NQc9QZru/9J3Per+sSvxqUEa75e68vnj5/RaP/KPvfXTjvLkjjytw/pb/om6yD0eh/FPn25pMkiHxcvPgP8T/JsM0qXLnnhCN86JPsLvCX6aS2zrOp6cS594gt9wfunvb1rHG88gTePjvMRj1/nPnTN7qEEKv+WftIvrJh6b1k9qkIrOi943vZri9Tj4Lwrp3mlaj+W0x78pAn6j/fczrq1074RBGslUdDzwA0f3vxZ11Tlzwuqrzxt753Kjceddd/f76627IDx5ow36f5t0bIBqXHTpFeH0M84a+BW68St493nDq8OLd9hWRT7W/P0f/hg++Zn/DvJzDv/gv4frrr8xSIw8cfrm//NP4avf/G64vPcUqnw9r3xNr9dLb6xqfoLUi4c1T3rDP97GyvrzPOKngkHqwcEzB19l6EOTQrQPx5gFgzSS8DvGf7hz1KVnh6vvXOiX2DlTLQbpazbbOuy7xXahFl0SU+fwK89yni2/dBikfixjJnQpkvA51qhL8smn+g2/z+wOzlLj/dLgTzP5V/hbb/5zkBaimwxS/586dTM2GaRSJ+FVTkDX8SQLulTOUiLRJRu/NBpdSonY++iSnaHOgC5pGj7trunSlHyC9N8PPjIsG+dfsMlykSc4jzzkwMaVE582lYsnHHdomNP7FzPx9VDvb1i875Bj+91jjzg4rLXmGvFS//jww4+Ew4/5r/DAAw+Gj3zoPWH99dYJ557fe+L07B+OGaLXXPe7nmH6lfDaV+0eXrHri5eLt3T0AsYgtZB8LLbGjVUthWghnP7tAvuMTUwGDFIfrhSifTjGLDUWomv5ZgMM0rjKbEcMUhu/NBqDNCVi76NLdoY6Q426JO+fQrSexdHbNd4vjf4pV14EhWh/1hSifZlSiPblKdl0HU/66JJQKH+hS+XsmiLRpSYqtnPoko1fGo0upUTs/a7p0pQ0SAeZo3ff8/fwkZ5xOX/tNcNRhx7UXy3Tel+ZurT3t0K/+73zQu+Z7LDXq14RZkx/7A/YnvyF08K1v70hbPrUjcN73/323h9MntY3Xj958pfCH276U3j25s8I//bON6+w6uLfL33dXnuE3V62Y//6xZddGb72zTPDvr2nR3fo/e3RSy//RfjKN74TBj2BukLSzBN6AWOQZkIbMqzGjRUG6ZAJLbyEQVoILgmjEJ0AMXZrLERjkBon/fFwniD14Riz8BW7kYTfsZavfkeX/OZcMtWoS/K+KUQLhfJXjfdL5Z924iMpRPszphDty5RCtC9PyabreNJHl4RC+QtdKmfXFIkuNVGxnUOXbPzSaHQpJWLvd02XpqRBOmgZxKdCF8xfOxx92GMGqYz91a+vDaec+vV+2Nv3e2PY5nlb9du33X5HOP7Ezwd5InT27Flhww3WDwtvvX2s/4ED9w9PWn/d/tj4f1dfe3343Be/GjbZeKPw/gPfOfYd4pLrox//dFh9tXlh1513DOf/+JJw3/0P9L9+N80Rc5Uc9QLGIC0huHxMjRsrDNLl59Cjh0HqQTEECtE+HGOWGgvRGKRx9mxHDFIbvzQagzQlYu9jkNoZ6gy7P3mL8PpNnx+uuOOP4ZTfXqwvtapdoy4JQArRtmVU4/2S7RNPbDSFaH++FKJ9mVKI9uUp2XQdT/roklAof6FL5eyaItGlJiq2c+iSjV8ajS6lROz9rulSpwzSv993f/jwEceH1CC98657wkc/dlKQPyx/xIffE9ZZMH9sJcnfLP38l04Ptyy8bezcRhs+Kez/tn36ecZO9hqPPLI4fOiIj4fFi5f0Ddi111pTX+6bot8+69z+U6jyNKp8vW58wnS5gYaOXsAYpAaQj4fWuLGqxSCVv/X27Zt/FWbMmGGfqAnK8P4XvqKfGYPUBzAGqQ/HmKXGQjQGaZw92xGD1MYvjcYgTYnY+xikdoY6AwappmFvrzpjZvjUDm8YS0QhegxFUaPG+6WiD7qSgihE+4OmEO3LlEK0L0/Jput40keXhEL5C10qZ9cUiS41UbGdQ5ds/NJodCklYu93TZc6ZZAOWx5LlizpXx5k1izpfQ3vnXfeHRYsWHvsK3iH5Rt0Tb7+9/a//i2st+6C3t9ffOyrfAeNLTmvFzAGaQnB5WNq3FjVZJAefuVZywNvUY+/9eY/GRikvkwxSH15SraTdtk7bDCv9zX8l54drr5zof8PcMqIQeoE8vE0GKS+PCUbBqkvUwxSX54YpL48a7xf8iXgm41CtC9PyUYh2pcphWhfnpJN1/Gkj0EqFMpf6FI5u6ZIdKmJiu0cumTjl0ajSykRe79ruoRBal8zrcqgFzAGqX1qatxYYZDa510yYJD6cNRZMEg1DXsbg9TOMM2AQZoSsfVfs9nWYd8ttgvoko1jjEaXIgm/I7rkx1Iy1ahL8r4pRAuF8leN90vln3biIylE+zOmEO3LlEK0L0/Jput40keXhEL5C10qZ9cUiS41UbGdQ5ds/NJodCklYu93TZcwSO1rplUZ9ALGILVPTY0bKwrR9nmXDBSifTjqLBSiNQ17u8ZCNF+xa593ycATpD4cYxaeII0k/I48QerHUjLxBKkvT54g9eVZ4/2SLwHfbBSifXlKNgrRvkwpRPvylGy6jid9DFKhUP5Cl8rZNUWiS01UbOfQJRu/NBpdSonY+13TJQxS+5ppVQa9gDFI7VNT48YKg9Q+75IBg9SHo86CQapp2NsYpHaGaQaeIE2J2Po8QWrjl0ajSykRex9dsjPUGWrUJXn/FKL1LI7ervF+afRPufIiKET7s6YQ7cuUQrQvT8mm63jSR5eEQvkLXSpn1xSJLjVRsZ1Dl2z80mh0KSVi73dNlzBI7WumVRn0Aq7lSZ1WAUzeTI0bKwzSZBILuxSiC8ENCaMQPQROwaUaC9G16BJ/g7RgQTaEYJA2QDGcQpcM8AaEoksDwBSerlGX5KNSiC6c8MfDarxfsn3iiY2mEO3Pl0K0L1MK0b48JZuu40kfXRIK5S90qZxdUyS61ETFdg5dsvFLo9GllIi93zVdwiC1r5lWZdALmCdI7VNT48YKg9Q+75KBQrQPR52FQrSmYW/XWIjGILXPu2TgK3Z9OMYsfMVuJOF35Ct2/VhKJr5i15cnX7Hry7PG+yVfAr7ZKET78pRsFKJ9mVKI9uUp2XQdT/oYpEKh/IUulbNrikSXmqjYzqFLNn5pNLqUErH3u6ZLGKT2NdOqDHoBY5Dap6bGjRUGqX3eJQMGqQ9HnQWDVNOwtzFI7QzTDHzFbkrE1ucJUhu/NBpdSonY++iSnaHOUKMuyfunEK1ncfR2jfdLo3/KlRdBIdqfNYVoX6YUon15SjZdx5M+uiQUyl/oUjm7pkh0qYmK7Ry6ZOOXRqNLKRF7v2u6hEFqXzOtyqAXMAapfWpq3FhhkNrnXTJQiPbhqLNQiNY07O0aC9E8QWqfd8nAE6Q+HGMWniCNJPyOPEHqx1Iy8QSpL0+eIPXlWeP9ki8B32wUon15SjYK0b5MKUT78pRsuo4nfQxSoVD+QpfK2TVFoktNVGzn0CUbvzQaXUqJ2Ptd0yUMUvuaaVUGvYAxSO1TU+PGCoPUPu+SAYPUh6POgkGqadjbGKR2hmkGniBNidj6PEFq45dGo0spEXsfXbIz1Blq1CV5/xSi9SyO3q7xfmn0T7nyIihE+7OmEO3LlEK0L0/Jput40keXhEL5C10qZ9cUiS41UbGdQ5ds/NJodCklYu93TZcwSO1rplUZ9ALGILVPTY0bKwxS+7xLBgrRPhx1FgrRmoa9XWMhmidI7fMuGXiC1IdjzMITpJGE35EnSP1YSiaeIPXlyROkvjxrvF/yJeCbjUK0L0/JRiHalymFaF+ekk3X8aSPQSoUyl/oUjm7pkh0qYmK7Ry6ZOOXRqNLKRF7v2u6hEFqXzOtyqAXMAapfWpq3FhhkNrnXTJgkPpw1FkwSDUNexuD1M4wzcATpCkRW58nSG380mh0KSVi76NLdoY6Q426JO+fQrSexdHbNd4vjf4pV14EhWh/1hSifZlSiPblKdl0HU/66JJQKH+hS+XsmiLRpSYqtnPoko1fGo0upUTs/a7pEgapfc20KoNewBik9qmpcWOFQWqfd8lAIdqHo85CIVrTsLdrLETzBKl93iUDT5D6cIxZeII0kvA78gSpH0vJxBOkvjx5gtSXZ433S74EfLNRiPblKdkoRPsypRDty1Oy6Tqe9DFIhUL5C10qZ9cUiS41UbGdQ5ds/NJodCklYu93TZcwSO1rplUZ9ALGILVPTY0bKwxS+7xLBgxSH446CwappmFvY5DaGaYZeII0JWLr8wSpjV8ajS6lROx9dMnOUGeoUZfk/VOI1rM4ervG+6XRP+XKi6AQ7c+aQrQvUwrRvjwlm67jSR9dEgrlL3SpnF1TJLrURMV2Dl2y8Uuj0aWUiL3fNV3CILWvmVZl0AsYg9Q+NTVurDBI7fMuGShE+3DUWShEaxr2do2FaJ4gtc+7ZOAJUh+OMQtPkEYSfkeeIPVjKZl4gtSXJ0+Q+vKs8X7Jl4BvNgrRvjwlG4VoX6YUon15SjZdx5M+BqlQKH+hS+XsmiLRpSYqtnPoko1fGo0upUTs/a7pEgapfc20KoNewLUUolsFMHkzNW6sMEiTSSzsYpAWghsShkE6BE7BJQzSAmjjhPAE6TiARrzME6QjAhtnOLo0DqCCy+hSAbQhITXqknwcCtFDJjXjUo33Sxkfa9KGUIj2R08h2pcphWhfnpJN1/Gkjy4JhfIXulTOrikSXWqiYjuHLtn4pdHoUkrE3u+aLmGQ2tdMqzLoBcwTpPapqXFjhUFqn3fJQCHah6POQiFa07C3ayxE1/IPd4669Oxw9Z0L7ZM0QRl4gtQXLE+Q+vKUbDxB6suUJ0h9efIEqS/PGu+XfAn4ZqMQ7ctTslGI9mVKIdqXp2TTdTzpY5AKhfIXulTOrikSXWqiYjuHLtn4pdHoUkrE3u+aLmGQ2tdMqzLoBYxBap+aGjdWGKT2eZcMGKQ+HHUWDFJNw97GILUzTDPwBGlKxNbnCVIbvzQaXUqJ2Pvokp2hzlCjLsn7pxCtZ3H0do33S6N/ypUXQSHanzWFaF+mFKJ9eUo2XceTProkFMpf6FI5u6ZIdKmJiu0cumTjl0ajSykRe79ruvT/AwAA//9lXvcrAABAAElEQVTsnQmYpVV1rjfQdDeTQAOiECSamEg0aoiooEYFROJADNfhYtTr8ESeGK+KIWoQg6IQNaKoiFdRo6ISJYmRKYgMDhAGcYoCIihOIIhMAjI1eGsd3eXq1X9V19nfovz//t/zPEntdarW11Xv3u13zrfY1ev8cuZReKw1BK674abZn+Vl/31sufXOO2brvi3e9fhnlXtvtGnfvq1Vvp9f3HJbue323zDccINlZdnS9Vf5mr4VZ15+aXnn107v27c1+/08YLOtyyv/eLdy1S03ltedf/zs831bbLhkafnIns+ffFvPO/nD5ZaVt/ftW5z9ft70sKeWe26wSTnsm6eVi6+/avb5vi1eseNu5VHb/F45+qJzy3Hf/Ubfvr3Z72eP39mhPP2+f1K+fPUPylHfPmv2+b4tHrTltuWgRz65XHHzDeXlZ3yyb9/e7PezwZL1yzt3fsakfvmML90yAF96w9knlG9dc8Xsz9C3xV8/4FFlp622L/922dfKKT++qG/f3uz38xe/95DynB0eUfClWSTSAl+S8HU240udWJqfHKIv2Q+7+aYbN//MNJYyxPdLfd63O++8q/z8pl/MfovrrbduucfGG87WLKYnYDyNa30YT+PKo42A5SP2974+LB+xnIRHOwGf45kKvtTO0jrxJY1f7MaXIhG9xpd0hl4BX/I0ctZj86V1GJDmHJy+qPgDzIBU35UhvrAiiNb33RQIonM4ehWCaE9DXw8xiGZAqu+7KTAgzeFYVfgPdyqJvI/8hzt5LE2J/3Anl6f/D3dMmSBa4zvE90vaT3z3dhNE5/MliM5lShCdy9PUfI5nNb5kFNof+FI7u65OfKmLivYcvqTxi934UiSi12PzJQak+pnplYI/wAxI9a0Z4gsrBqT6vpsCA9Icjl6FAamnoa8ZkOoMo0L9zQbcII1k2mpukLZxm6sLX5qLTPvz+FI7u67OIfqS/RwE0V27ufDnhvh+aeE/3eJ/JUF0PnOC6FymBNG5PE3N53hW40tGof2BL7Wz6+rEl7qoaM/hSxq/2I0vRSJ6PTZfYkCqn5leKfgDzIBU35ohvrBiQKrvuykQROdw9CoE0Z6Gvh5iEM0NUn3fTYEbpDkcqwo3SCuJvI/cIM1jaUrcIM3lyQ3SXJ5DfL+USyBXjSA6l6epEUTnMiWIzuVpaj7Hs5oBqVFof+BL7ey6OvGlLirac/iSxi9240uRiF6PzZcYkOpnplcK/gAzINW3ZogvrBiQ6vtuCgxIczh6FQaknoa+ZkCqM4wK3CCNRLSaG6Qav9iNL0Uieo0v6Qy9whB9yb5/gmi/i9Ovh/h+afqfcvE6CKLzWRNE5zIliM7laWo+x7MaXzIK7Q98qZ1dVye+1EVFew5f0vjFbnwpEtHrsfkSA1L9zPRKwR9gBqT61gzxhRUDUn3fTYEgOoejVyGI9jT09RCDaG6Q6vtuCtwgzeFYVbhBWknkfeQGaR5LU+IGaS5PbpDm8hzi+6VcArlqBNG5PE2NIDqXKUF0Lk9T8zme1QxIjUL7A19qZ9fViS91UdGew5c0frEbX4pE9HpsvsSAVD8zvVLwB5gBqb41Q3xhxYBU33dTYECaw9GrMCD1NPQ1A1KdYVTgBmkkotXcINX4xW58KRLRa3xJZ+gVhuhL9v0TRPtdnH49xPdL0/+Ui9dBEJ3PmiA6lylBdC5PU/M5ntX4klFof+BL7ey6OvGlLirac/iSxi9240uRiF6PzZcYkOpnplcK/gAP5aZOrwCGb2aIL6wYkIZNbCwJohvBzdNGED0PnIZPDTGIHoovveHsE8q3rrmiYVcWp4UbpLmcuUGay9PUuEGay5QbpLk8uUGay3OI75dyCeSqEUTn8jQ1guhcpgTRuTxNzed4VjMgNQrtD3ypnV1XJ77URUV7Dl/S+MVufCkS0eux+RIDUv3M9ErBH2BukOpbM8QXVgxI9X03BQakORy9CgNST0NfMyDVGUYFbpBGIlrNDVKNX+zGlyIRvcaXdIZeYYi+ZN8/QbTfxenXQ3y/NP1PuXgdBNH5rAmic5kSROfyNDWf41mNLxmF9ge+1M6uqxNf6qKiPYcvafxiN74Uiej12HyJAal+Znql4A8wA1J9a4b4wooBqb7vpkAQncPRqxBEexr6eohBNDdI9X03BW6Q5nCsKtwgrSTyPnKDNI+lKXGDNJcnN0hzeQ7x/VIugVw1guhcnqZGEJ3LlCA6l6ep+RzPagakRqH9gS+1s+vqxJe6qGjP4Usav9iNL0Uiej02X2JAqp+ZXin4A8yAVN+aIb6wYkCq77spMCDN4ehVGJB6GvqaAanOMCpwgzQS0WpukGr8Yje+FInoNb6kM/QKQ/Ql+/4Jov0uTr8e4vul6X/KxesgiM5nTRCdy5QgOpenqfkcz2p8ySi0P/CldnZdnfhSFxXtOXxJ4xe78aVIRK/H5ksMSPUz0ysFf4AZkOpbM8QXVgxI9X03BYLoHI5ehSDa09DXQwyiuUGq77spcIM0h2NV4QZpJZH3kRukeSxNiRukuTy5QZrLc4jvl3IJ5KoRROfyNDWC6FymBNG5PE3N53hWMyA1Cu0PfKmdXVcnvtRFRXsOX9L4xW58KRLR67H5EgNS/cz0SsEfYAak+tYM8YUVA1J9302BAWkOR6/CgNTT0NcMSHWGUYEbpJGIVnODVOMXu/GlSESv8SWdoVcYoi/Z908Q7Xdx+vUQ3y9N/1MuXgdBdD5rguhcpgTRuTxNzed4VuNLRqH9gS+1s+vqxJe6qGjP4Usav9iNL0Uiej02X2JAqp+ZXin4A8yAVN+aIb6wYkCq77spEETncPQqBNGehr4eYhDNDVJ9302BG6Q5HKsKN0gribyP3CDNY2lK3CDN5ckN0lyeQ3y/lEsgV40gOpenqRFE5zIliM7laWo+x7OaAalRaH/gS+3sujrxpS4q2nP4ksYvduNLkYhej82XGJDqZ6ZXCv4AMyDVt2aIL6wYkOr7bgoMSHM4ehUGpJ6GvmZAqjOMCtwgjUS0mhukGr/YjS9FInqNL+kMvcIQfcm+f4Jov4vTr4f4fmn6n3LxOgii81kTROcyJYjO5WlqPsezGl8yCu0PfKmdXVcnvtRFRXsOX9L4xW58KRLR67H5EgNS/cz0SsEfYAak+tYM8YUVA1J9302BIDqHo1chiPY09PUQg2hukOr7bgrcIM3hWFW4QVpJ5H3kBmkeS1PiBmkuT26Q5vIc4vulXAK5agTRuTxNjSA6lylBdC5PU/M5ntUMSI1C+wNfamfX1YkvdVHRnsOXNH6xG1+KRPR6bL7EgFQ/M71S8AeYAam+NUN8YcWAVN93U2BAmsPRqzAg9TT0NQNSnWFU4AZpJKLV3CDV+MVufCkS0Wt8SWfoFYboS/b9E0T7XZx+PcT3S9P/lIvXQRCdz5ogOpcpQXQuT1PzOZ7V+JJRaH/gS+3sujrxpS4q2nP4ksYvduNLkYhej82XGJDqZ6ZXCv4AMyDVt2aIL6wYkOr7bgoE0TkcvQpBtKehr4cYRHODVN93U+AGaQ7HqsIN0koi7yM3SPNYmhI3SHN5coM0l+cQ3y/lEshVI4jO5WlqBNG5TAmic3mams/xrGZAahTaH/hSO7uuTnypi4r2HL6k8Yvd+FIkotdj8yUGpPqZ6ZWCP8AMSPWtGeILKwak+r6bAgPSHI5ehQGpp6GvGZDqDKMCN0gjEa3mBqnGL3bjS5GIXuNLOkOvMERfsu+fINrv4vTrIb5fmv6nXLwOguh81gTRuUwJonN5mprP8azGl4xC+wNfamfX1YkvdVHRnsOXNH6xG1+KRPR6bL7EgFQ/M71S8AeYAam+NUN8YcWAVN93UyCIzuHoVQiiPQ19PcQgmhuk+r6bAjdIczhWFW6QVhJ5H7lBmsfSlLhBmsuTG6S5PIf4fimXQK4aQXQuT1MjiM5lShCdy9PUfI5nNQNSo9D+wJfa2XV14ktdVLTn8CWNX+zGlyIRvR6bLzEg1c9MrxT8AWZAqm/NEF9YMSDV990UGJDmcPQqDEg9DX3NgFRnGBW4QRqJaDU3SDV+sRtfikT0Gl/SGXqFIfqSff8E0X4Xp18P8f3S9D/l4nUQROezJojOZUoQncvT1HyOZzW+ZBTaH/hSO7uuTnypi4r2HL6k8Yvd+FIkotdj8yUGpPqZ6ZWCP8AMSPWtGeILKwak+r6bAkF0DkevQhDtaejrIQbR3CDV990UuEGaw7GqcIO0ksj7yA3SPJamxA3SXJ7cIM3lOcT3S7kEctUIonN5mhpBdC5TguhcnqbmczyrGZAahfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8iQGpfmZ6peAPMANSfWuG+MKKAam+76bAgDSHo1dhQOpp6GsGpDrDqMAN0khEq7lBqvGL3fhSJKLX+JLO0CsM0Zfs+yeI9rs4/XqI75em/ykXr4MgOp81QXQuU4LoXJ6m5nM8q/Elo9D+wJfa2XV14ktdVLTn8CWNX+zGlyIRvR6bLzEg1c9MrxT8AWZAqm/NEF9YMSDV990UCKJzOHoVgmhPQ18PMYjmBqm+76bADdIcjlWFG6SVRN5HbpDmsTQlbpDm8uQGaS7PIb5fyiWQq0YQncvT1Aiic5kSROfyNDWf41nNgNQotD/wpXZ2XZ34UhcV7Tl8SeMXu/GlSESvx+ZLDEj1M9MrBX+AGZDqWzPEF1YMSPV9NwUGpDkcvQoDUk9DXzMg1RlGBW6QRiJazQ1SjV/sxpciEb3Gl3SGXmGIvmTfP0G038Xp10N8vzT9T7l4HQTR+awJonOZEkTn8jQ1n+NZjS8ZhfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8iQGpfmZ6peAPMANSfWuG+MKKAam+76ZAEJ3D0asQRHsa+nqIQTQ3SPV9NwVukOZwrCrcIK0k8j5ygzSPpSlxgzSXJzdIc3kO8f1SLoFcNYLoXJ6mRhCdy5QgOpenqfkcz2oGpEah/YEvtbPr6sSXuqhoz+FLGr/YjS9FIno9Nl9iQKqfmV4p+APMgFTfmiG+sGJAqu+7KTAgzeHoVRiQehr6mgGpzjAqcIM0EtFqbpBq/GI3vhSJ6DW+pDP0CkP0Jfv+CaL9Lk6/HuL7pel/ysXrIIjOZ00QncuUIDqXp6n5HM9qfMkotD/wpXZ2XZ34UhcV7Tl8SeMXu/GlSESvx+ZLDEj1M9MrBX+AGZDqWzPEF1YMSPV9NwWC6ByOXoUg2tPQ10MMorlBqu+7KXCDNIdjVeEGaSWR95EbpHksTYkbpLk8uUGay3OI75dyCeSqEUTn8jQ1guhcpgTRuTxNzed4VjMgNQrtD3ypnV1XJ77URUV7Dl/S+MVufCkS0eux+RIDUv3M9ErBH2AGpPrWDPGFFQNSfd9NgQFpDkevwoDU09DXDEh1hlGBG6SRiFZzg1TjF7vxpUhEr/ElnaFXGKIv2fdPEO13cfr1EN8vTf9TLl4HQXQ+a4LoXKYE0bk8Tc3neFbjS0ah/YEvtbPr6sSXuqhoz+FLGr/YjS9FIno9Nl9iQKqfmV4p+APMgFTfmiG+sGJAqu+7KRBE53D0KgTRnoa+HmIQzQ1Sfd9NgRukORyrCjdIK4m8j9wgzWNpStwgzeXJDdJcnkN8v5RLIFeNIDqXp6kRROcyJYjO5WlqPsezmgGpUWh/4Evt7Lo68aUuKtpz+JLGL3bjS5GIXo/NlxiQ6memVwr+ADMg1bdmiC+sGJDq+24KDEhzOHoVBqSehr5mQKozjArcII1EtJobpBq/2I0vRSJ6jS/pDL3CEH3Jvn+CaL+L06+H+H5p+p9y8ToIovNZE0TnMiWIzuVpaj7HsxpfMgrtD3ypnV1XJ77URUV7Dl/S+MVufCkS0eux+RIDUv3M9ErBH2AGpPrWDPGFFQNSfd9NgSA6h6NXIYj2NPT1EINobpDq+24K3CDN4VhVuEFaSeR95AZpHktT4gZpLk9ukObyHOL7pVwCuWoE0bk8TY0gOpcpQXQuT1PzOZ7VDEiNQvsDX2pn19WJL3VR0Z7DlzR+sRtfikT0emy+xIBUPzO9UvAHmAGpvjVDfGHFgFTfd1NgQJrD0aswIPU09DUDUp1hVOAGaSSi1dwg1fjFbnwpEtFrfEln6BWG6Ev2/RNE+12cfj3E90vT/5SL10EQnc+aIDqXKUF0Lk9T8zme1fiSUWh/4Evt7Lo68aUuKtpz+JLGL3bjS5GIXo/NlxiQ6memVwr+ADMg1bdmiC+sGJDq+24KBNE5HL0KQbSnoa+HGERzg1Tfd1PgBmkOx6rCDdJKIu8jN0jzWJoSN0hzeXKDNJfnEN8v5RLIVSOIzuVpagTRuUwJonN5mprP8axmQGoU2h/4Uju7rk58qYuK9hy+pPGL3fhSJKLXY/MlBqT6memVgj/ADEj1rRniCysGpPq+mwID0hyOXoUBqaehrxmQ6gyjAjdIIxGt5gapxi9240uRiF7jSzpDrzBEX7LvnyDa7+L06yG+X5r+p1y8DoLofNYE0blMCaJzeZqaz/GsxpeMQvsDX2pn19WJL3VR0Z7DlzR+sRtfikT0emy+xIBUPzO9UvAHmAGpvjVDfGHFgFTfd1MgiM7h6FUIoj0NfT3EIJobpPq+mwI3SHM4VhVukFYSeR+5QZrH0pS4QZrLkxukuTyH+H4pl0CuGkF0Lk9TI4jOZUoQncvT1HyOZzUDUqPQ/sCX2tl1deJLXVS05/AljV/sxpciEb0emy8xINXPTK8U/AFmQKpvzRBfWDEg1ffdFBiQ5nD0KgxIPQ19zYBUZxgVuEEaiWg1N0g1frEbX4pE9Bpf0hl6hSH6kn3/BNF+F6dfD/H90vQ/5eJ1EETnsyaIzmVKEJ3L09R8jmc1vmQU2h/4Uju7rk58qYuK9hy+pPGL3fhSJKLXY/MlBqT6memVgj/ADEj1rRniCysGpPq+mwJBdA5Hr0IQ7Wno6yEG0dwg1ffdFLhBmsOxqnCDtJLI+8gN0jyWpsQN0lye3CDN5TnE90u5BHLVCKJzeZoaQXQuU4LoXJ6m5nM8qxmQGoX2B77Uzq6rE1/qoqI9hy9p/GI3vhSJ6PXYfIkBqX5meqXgDzADUn1rhvjCigGpvu+mwIA0h6NXYUDqaehrBqQ6w6jADdJIRKu5Qarxi934UiSi1/iSztArDNGX7PsniPa7OP16iO+Xpv8pF6+DIDqfNUF0LlOC6FyepuZzPKvxJaPQ/sCX2tl1deJLXVS05/AljV/sxpciEb0emy8xINXPTK8U/AFmQKpvzRBfWDEg1ffdFAiiczh6FYJoT0NfDzGI5gapvu+mwA3SHI5VhRuklUTeR26Q5rE0JW6Q5vLkBmkuzyG+X8olkKtGEJ3L09QIonOZEkTn8jQ1n+NZzYDUKLQ/8KV2dl2d+FIXFe05fEnjF7vxpUhEr8fmSwxI9TPTKwV/gBmQ6lszxBdWDEj1fTcFBqQ5HL0KA1JPQ18zINUZRgVukEYiWs0NUo1f7MaXIhG9xpd0hl5hiL5k3z9BtN/F6ddDfL80/U+5eB0E0fmsCaJzmRJE5/I0NZ/jWY0vGYX2B77Uzq6rE1/qoqI9hy9p/GI3vhSJ6PXYfIkBqX5meqXgDzADUn1rhvjCigGpvu+mQBCdw9GrEER7Gvp6iEE0N0j1fTcFbpDmcKwq3CCtJPI+coM0j6UpcYM0lyc3SHN5DvH9Ui6BXDWC6FyepkYQncuUIDqXp6n5HM9qBqRGof2BL7Wz6+rEl7qoaM/hSxq/2I0vRSJ6PTZfWqsHpNdce1058eQzyve+/8NyzbXXl63vuWX5w/vfrzxlz13LBhssX9BpuWPlynLciaeWCy76Trn6Z9eWrbZcUR64wx+UvZ68e1l/yZLVNL5w5rnl1DPOLNffcGP5/fttX5737L3L5pttusrXfeVr3ywnnHx6ecwuO5VdH7vLKp9TC3+AGZCqNEsZ4gsrBqT6vpsCA9Icjl6FAamnoa8ZkOoMowI3SCMRreYGqcYvduNLkYhe40s6Q68wRF+y758g2u/i9Oshvl+a/qdcvA6C6HzWBNG5TAmic3mams/xrMaXjEL7A19qZ9fViS91UdGew5c0frEbX4pE9HpsvrTWDkgvuvjScuRRHyt33XXX5FQsW7a03Hbb7ZP1Fis2L6/ab9+y8UYbzntibr31tvL2Iz5YLr/iytU0tt3mXuWVL31RWb582azGty68uLz3Ax8v9mfd53e2KZd89/vF/qyDD9xv9mtu+PmN5cCDDyvrrbtuedNB+6/xe5htXODCH2AGpAuENs+XDfGFFQPSeTZ0ik8RRE8Ba4FfShC9QFAL/LIhBtHcIF3g5q7hy7hBugZAU36aG6RTAlvAl3ODdAGQpvgSbpBOAWsBX8oN0gVAmuJLhvh+aYofb9G/lCA6HzlBdC5TguhcnqbmczyrGZAahfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8aa0dkL7qdW8uN9/8i/LYRz+i7L3XE8uSmdueP/zR5eVDRx87uQn6uMc8sjzjL58074k55tjjyplnn1822XijyUB1xeablWuvu7689R3vKzfedHN59M4PK/s8Y69ZjY984t/Leed/oxyw/0uKDVCPPOromZunl5RDX//3ZdN7bDL5ure966hy2fd/VPZ94bPLgx/0gNnerIU/wAxIdapDfGHFgFTfd1NgQJrD0aswIPU09DUDUp1hVOAGaSSi1dwg1fjFbnwpEtFrfEln6BWG6Ev2/RNE+12cfj3E90vT/5SL10EQnc+aIDqXKUF0Lk9T8zme1fiSUWh/4Evt7Lo68aUuKtpz+JLGL3bjS5GIXo/Nl9bKAen3f/jj8s+Hv79sttk9yiH/uP8qp+IrX/9W+dBHP7Xazc5VvmimsNum+7/20MkN1Ncf8IrJr9atX2O/avf1hx5e1p25BXrYoQeUpUuXTj51+Hs+NLk1esRhbyjrrLNO+fTxp0x+3e6rZ26r3me7bcvnv3ROOfbTJ5U/feiDyguf98wql/rRH2AGpDraIb6wYkCq77spEETncPQqBNGehr4eYhDNDVJ9302BG6Q5HKsKN0gribyP3CDNY2lK3CDN5ckN0lyeQ3y/lEsgV40gOpenqRFE5zIliM7laWo+x7OaAalRaH/gS+3sujrxpS4q2nP4ksYvduNLkYhej82X1soB6cqZfzf0F7fcWpauv/4qvwLXjsfPrrm2HHTI4WsckH75K/9TPvzxfyvbbXvv8pq/+5vVTtabD3tv+dHlPynPf87Ty047Pnjy+Y998j/L2ed+tez/8r8u991+u/KOmV/Pe+n3flDe8sbXlFtmvh8bqm6wfHk5ZOZX69qv4b07Hv4AMyDVCQ/xhRUDUn3fTYEBaQ5Hr8KA1NPQ1wxIdYZRgRukkYhWc4NU4xe78aVIRK/xJZ2hVxiiL9n3TxDtd3H69RDfL03/Uy5eB0F0PmuC6FymBNG5PE3N53hW40tGof2BL7Wz6+rEl7qoaM/hSxq/2I0vRSJ6PTZfWisHpHMdA/v3SD96zH8UG34+YddHl6c9ZY+5vrScdMrny4knn16e/MTHlyfN/F98nPTZM8qJM//35D13LU/a43GTT19y6WXl8CP/ZXKzdIsVm01+la/9W6T2750e8s/vKT+58qflFS95Qbn/7983yqXV/gAzINWxDvGFFQNSfd9NgSA6h6NXIYj2NPT1EINobpDq+24K3CDN4VhVuEFaSeR95AZpHktT4gZpLk9ukObyHOL7pVwCuWoE0bk8TY0gOpcpQXQuT1PzOZ7VDEiNQvsDX2pn19WJL3VR0Z7DlzR+sRtfikT0emy+tNYPSO1X5Z72+bPKFTPDyW9886LJr8zdaKMNy2te+Tdlxeabznli6m3QZz9zr/KoRz5sta8765zzyyc+dVzZ+RE7luc862mzn//qNy4oZ3zx7Mm/VfqH979fefrT/rx8/ovnTIapf/aoh5dn/a+nzH7t3bHwB5gBqU54iC+sGJDq+24KDEhzOHoVBqSehr5mQKozjArcII1EtJobpBq/2I0vRSJ6jS/pDL3CEH3Jvn+CaL+L06+H+H5p+p9y8ToIovNZE0TnMiWIzuVpaj7HsxpfMgrtD3ypnV1XJ77URUV7Dl/S+MVufCkS0eux+dJaPyC99robyuveeNjsybB/N9RudNqvzp3vceRRR5cLLrqkvPgF+5SH/PEOq32pDVvf/y/HlAfucP/ykr9+7mqfr0/8+PIryz8ddmTZ9B6blIMP3K8sWbKkfupu+egP8JAHpCtX3jkvnyVL1pv381n9t952R7lj5lc218eyZeuXpTN7uFh/fv1z48f5/nwGpJFWW73hkvXLB3d/3qT5RaceXX6x8vY2oUXoGspNnZc95PFl53vfrxxzyfnluO9+YxHItP0R3NRp4zZXl7+pM4QbpFst27i86byTygXX/mSuH+m3/vxQbpA+9b5/XJ79hw8v//2T75Z3f+Pzv3Vuc30Dw7lBun75yJ4vmPwYzzv5w+UWfGmuLV3w8wxIF4xqQV/4wBX3Lgc+/Enlyl/8vOz3xWMX1PPb+CLvS/bn1yA66/3DXD/TfK/frWeof34Mouv7pchhbf3568+ZtX933fXLcvPMP89TH+uuu07ZaIPlvX7/ad9r1s9ff+74UTk/v7j1tmIBf33cY+MNy3rrrVvLycc+f//2DSo/f3Z/VxC9dP35c64+ff+TDQ//77e9/z7Hs29tk402WOU7hN90+V/M8TbcYFlZtnT9VZj64re9/33/89dZZ53JTfzKzP730/53tD76/v338e9PHJCaz5vfdz36+P3777MP+3/7HSuLeVN9rD/jSct//XceftP972dleOPNt9Tl5GN9v7TKk2tRsdYPSG+f+QvyzQsvLj/96c+K3e684idXTbZvt8c9quy91xPn3Er790ftV/E+d5+9yyN3euhqX3fOl79ejp75db07/emDy/P/6umrfd6eWHnnneUNM//uqA1pXz0zlN1iixXlnPO+Vr7/wx+X7bfbtjzy4X9SNp65zZr58C+shjwg9T9HF581/cUccz8D0q4TM/1zPjzr+1BnKAPSOtQ54YoLGJBOfyRX6xjiTZ2+/12yG6TLV65XDvvmaeXi63/1emE18D14ov5d+rfLvlZO+fFFPfiOur+F+h8bnHf1D8oHvn1W9xf14NmhDEjNlz7KgDT1xDAgTcVZhvR36Z07P2P2h6/vK8b8/sFgtP78cUA6CzYsKufw9GzZ+udXAfpvqig6P46dv4fSNSDl/Cz8/HQNSH0w7VnX9djPHz//xvUodH68u//+rWlAenf/+UPff/vfTBvo1UcckMJv4f/7WRnGAWl9vuvj0M8P3/9v93//VP71TK5Jp37dUD+u9QPSuDFXXnX15N8DtX+P9O3/dGBZtmxp/JJJfdxJp5bPnvrF8hdPfkLZY7fHrPY1p5z2pfKZEz9Xnrj7n5W9nrT7ap+3J4799Enl8186p+y5+2PLnns8thzy1iMm/y5p/eKttlxRXvuql5b1E2+VemMa8oA0/pcKlVn9GP+Luvp8/ZjVf9fMf2l61y9/WWXLejM3kNeZ+a96FuvPn/2Dw2K+P58BaYDVWNqvMjziMc+adL/ki/9abr3zN/81UqPk3dY2lAHpvn/0mPKIrX+3/OcP/4cBacJpYECaADFI2IB047K0vPXrnyvfvu7K8Nn+lEMZkO55nweWZ/7ejuXcq75f3nfhl/oDMHwnQxnq8Ct2w8YllAxIEyA6iQdsdq/yqj95QrnqlhvLP5zzn+4z/Vr6/wjOvrP6hj/r/cNcP+18r9+tZ6h/fhyQ1vdLkcPa+vPXnzNr/345897T33a0mzsWRsNv1Rt1lXv9OB//eLula0A6X7/9GfD/Df+uAemdM/nafA/4/YZfFyef49nn440n+M3PL/79jTnemgaksT/u0dj5b7h82bwDUvitetNuIecnDkjN583vux5jP38L+fnja6d1Z1iu++vfFLGQ/i7u9bmx9sfXTvX9UuWytn0c3YDUNtB+Na79ily7+Wk3QLseZ5795XLMscfP+St066/g3ecZTy2P3nmn1SQu/d4PyjuO+GC551ZblNe9+v+Wiy7+brEe+/Oe+7//snz8U58p587cQrVfz2u/pjfr4V9YDXlAmsVD1Ylv+Nf0wkr98zL6GZBmUOTfIM2huKoKQfSqPNSKAalKcPV+/g3S1Zkoz/BvkCr0Vu9lQLo6E/UZfEkluGr/EH3JfoK1/Q3/qruUXw3x/VI+hTxF/q23PJZVKQbRXQPS+rV8XDOBrgGp5SQ82gn4HM9U8KV2ltaJL2n8Yje+FInoNb6kM/QK+JKnkbMemy+tlQPS4086rXzhzHPLE3Z99OSGZzwaR7zvozMDy0vLi/7Ps8qOD3lg/PSkvv6Gn5fXvuFtk/Vhh762LJ/5L2bq49aZf8Pi7w44ZFIectD+ZbNN71E/Nfl42223l9e96e3l5pt/Uf7xNS8rW99zy3LK6TM3Tk/43OxA9IKLvjMzMP1YedpT9ph8n6sICIU/wAxIBZC/bh3iCysGpPq+mwJBdA5Hr0IQ7Wno6yEG0UP4Fbv33mjT8oazTyjfuuYKfZPuJoWh3CBlQJp7APClXJ6mhi/lMh2iLxkBgmjtHAzx/ZL2E9+93QTR+XwJonOZEkTn8jQ1n+NZjS8ZhfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8aa0ckH7n0svKO4/8l8mvrn35S15Q7vu7201OxsqVK8t5M/+u6Mc/+atf+VR/xe6dM/9W6GdOPLWUmV9ns9dTnlCWrPerf8D2Pe8/ulz47Usm/a986Ytm/sHkdYv9at53vOdD5XuX/bD80QPuX/72xc9d7dTVf7907732LLs9bpfJ58865/zyiU8dV54zc3t055l/e/Tsc79aPjbzfcx1A3U10QU+4Q8wA9IFQpvny4b4wooB6TwbOsWnCKKngLXALyWIXiCoBX7ZEINoBqQL3Nw1fBkD0jUAmvLT/IrdKYEt4MuH8qvf8aUFbOYUXzJEX7IfjyB6ik3u+NIhvl/q+DF68xRBdP5WEETnMiWIzuVpaj7HsxpfMgrtD3ypnV1XJ77URUV7Dl/S+MVufCkS0eux+dJaOSC13z19+MwQ037NrT02WL683OteW5Uf/PDyyYDTntt7ryfODC8fZcvy9f+5sBz14X+drF/0vGeWHR/6oMna/r3Stx7+vmI3Qu3fKt3m3luXK35y1Wz9qlfsW+619VaTr63/71sXXlze+4GPl+2327b8/StePPs7xE3rjW95d9lk443Kro/dpZz+hf8uN9508+TX70aNqtXy0R9gBqQtBFftGeILKwakq+5ha8WAtJXc3H0E0XOzafnMEINoBqQtO716DwPS1ZkozzAgVeh19zIg7ebS+uwev7NDefp9/6R8+eoflKO+fVarzN3eN0RfMigE0drRGOL7Je0nvnu7CaLz+RJE5zIliM7laWo+x7MaXzIK7Q98qZ1dVye+1EVFew5f0vjFbnwpEtHrsfnSWjkgtWNgQ9KTPntG+dJ/f3kyiKxHw/5N0L986hPLgx/0gPpUueba68sb3/yuYv+w/EH/8LKy5RYr3OeuK+/70DHl8iuunH1u223uVfZ94T5lixWbzz5ni9tvv6O85qC3lDvuWFkOPnC/svlmm67yeRuKfvr4UyZDWruNar9et94wXeULhcIfYAakAshftw7xhRUDUn3fTYEBaQ5Hr8KA1NPQ10MMohmQ6vtuCgxIczhWFQaklUTeRwakeSxNiQFpLs8Nlqxf3rnzM2ZFCaJnUTQthvh+qekHXaQmguh80ATRuUwJonN5mprP8azGl4xC+wNfamfX1YkvdVHRnsOXNH6xG1+KRPR6bL601g5I/VG49bbbyvXX/7xsteWKst6vf32u/7yt7dfv2mPJkiWTj/H/rZz5NbzXXHNd2WKLzWd/BW/8moXU9it6r/rpz4oNauf6XhaiM9fX+APMgHQuSgt/fogvrBiQLnx/5/tKBqTz0Wn7HAPSNm5zdTEgnYtM+/PvevyzCv8GaTu/2Mm/QRqJaDW+pPHr6saXuqi0PzdEX7KfliC6fc+tc4jvl7Sf+O7tJojO50sQncuUIDqXp6n5HM9qfMkotD/wpXZ2XZ34UhcV7Tl8SeMXu/GlSESvx+ZLoxiQ6sdiOAr+ADMg1fdtiC+sGJDq+24KBNE5HL0KQbSnoa+HGERzg1Tfd1PgBmkOx6rCDdJKIu8jN0jzWJoSN0hzeXKDNJfnEN8v5RLIVSOIzuVpagTRuUwJonN5mprP8axmQGoU2h/4Uju7rk58qYuK9hy+pPGL3fhSJKLXY/MlBqT6memVgj/ADEj1rRniCysGpPq+mwID0hyOXoUBqaehrxmQ6gyjAjdIIxGt5gapxi9240uRiF7jSzpDrzBEX7LvnyDa7+L06yG+X5r+p1y8DoLofNYE0blMCaJzeZqaz/GsxpeMQvsDX2pn19WJL3VR0Z7DlzR+sRtfikT0emy+xIBUPzO9UvAHmAGpvjVDfGHFgFTfd1MgiM7h6FUIoj0NfT3EIJobpPq+mwI3SHM4VhVukFYSeR+5QZrH0pS4QZrLkxukuTyH+H4pl0CuGkF0Lk9TI4jOZUoQncvT1HyOZzUDUqPQ/sCX2tl1deJLXVS05/AljV/sxpciEb0emy8xINXPTK8U/AFmQKpvzRBfWDEg1ffdFBiQ5nD0KgxIPQ19zYBUZxgVuEEaiWg1N0g1frEbX4pE9Bpf0hl6hSH6kn3/BNF+F6dfD/H90vQ/5eJ1EETnsyaIzmVKEJ3L09R8jmc1vmQU2h/4Uju7rk58qYuK9hy+pPGL3fhSJKLXY/MlBqT6memVgj/ADEj1rRniCysGpPq+mwJBdA5Hr0IQ7Wno6yEG0dwg1ffdFLhBmsOxqnCDtJLI+8gN0jyWpsQN0lye3CDN5TnE90u5BHLVCKJzeZoaQXQuU4LoXJ6m5nM8qxmQGoX2B77Uzq6rE1/qoqI9hy9p/GI3vhSJ6PXYfIkBqX5meqXgDzADUn1rhvjCigGpvu+mwIA0h6NXYUDqaehrBqQ6w6jADdJIRKu5Qarxi934UiSi1/iSztArDNGX7PsniPa7OP16iO+Xpv8pF6+DIDqfNUF0LlOC6FyepuZzPKvxJaPQ/sCX2tl1deJLXVS05/AljV/sxpciEb0emy8xINXPTK8U/AFmQKpvzRBfWDEg1ffdFAiiczh6FYJoT0NfDzGI5gapvu+mwA3SHI5VhRuklUTeR26Q5rE0JW6Q5vLkBmkuzyG+X8olkKtGEJ3L09QIonOZEkTn8jQ1n+NZzYDUKLQ/8KV2dl2d+FIXFe05fEnjF7vxpUhEr8fmSwxI9TPTKwV/gBmQ6lszxBdWDEj1fTcFBqQ5HL0KA1JPQ18zINUZRgVukEYiWs0NUo1f7MaXIhG9xpd0hl5hiL5k3z9BtN/F6ddDfL80/U+5eB0E0fmsCaJzmRJE5/I0NZ/jWY0vGYX2B77Uzq6rE1/qoqI9hy9p/GI3vhSJ6PXYfIkBqX5meqXgDzADUn1rhvjCigGpvu+mQBCdw9GrEER7Gvp6iEE0N0j1fTcFbpDmcKwq3CCtJPI+coM0j6UpcYM0lyc3SHN5DvH9Ui6BXDWC6FyepkYQncuUIDqXp6n5HM9qBqRGof2BL7Wz6+rEl7qoaM/hSxq/2I0vRSJ6PTZfYkCqn5leKfgDzIBU35ohvrBiQKrvuykwIM3h6FUYkHoa+poBqc4wKnCDNBLRam6QavxiN74Uieg1vqQz9ApD9CX7/gmi/S5Ovx7i+6Xpf8rF6yCIzmdNEJ3LlCA6l6ep+RzPanzJKLQ/8KV2dl2d+FIXFe05fEnjF7vxpUhEr8fmSwxI9TPTKwV/gBmQ6lszxBdWDEj1fTcFgugcjl6FINrT0NdDDKK5QarvuylwgzSHY1XhBmklkfeRG6R5LE2JG6S5PLlBmstziO+XcgnkqhFE5/I0NYLoXKYE0bk8Tc3neFYzIDUK7Q98qZ1dVye+1EVFew5f0vjFbnwpEtHrsfkSA1L9zPRKwR9gBqT61gzxhRUDUn3fTYEBaQ5Hr8KA1NPQ1wxIdYZRgRukkYhWc4NU4xe78aVIRK/xJZ2hVxiiL9n3TxDtd3H69RDfL03/Uy5eB0F0PmuC6FymBNG5PE3N53hW40tGof2BL7Wz6+rEl7qoaM/hSxq/2I0vRSJ6PTZfYkCqn5leKfgDzIBU35ohvrBiQKrvuykQROdw9CoE0Z6Gvh5iEM0NUn3fTYEbpDkcqwo3SCuJvI/cIM1jaUrcIM3lyQ3SXJ5DfL+USyBXjSA6l6epEUTnMiWIzuVpaj7Hs5oBqVFof+BL7ey6OvGlLirac/iSxi9240uRiF6PzZcYkOpnplcK/gAzINW3ZogvrBiQ6vtuCgxIczh6FQaknoa+ZkCqM4wK3CCNRLSaG6Qav9iNL0Uieo0v6Qy9whB9yb5/gmi/i9Ovh/h+afqfcvE6CKLzWRNE5zIliM7laWo+x7MaXzIK7Q98qZ1dVye+1EVFew5f0vjFbnwpEtHrsfkSA1L9zPRKwR9gBqT61gzxhRUDUn3fTYEgOoejVyGI9jT09RCDaG6Q6vtuCtwgzeFYVbhBWknkfeQGaR5LU+IGaS5PbpDm8hzi+6VcArlqBNG5PE2NIDqXKUF0Lk9T8zme1QxIjUL7A19qZ9fViS91UdGew5c0frEbX4pE9HpsvsSAVD8zvVLwB5gBqb41Q3xhxYBU33dTYECaw9GrMCD1NPQ1A1KdYVTgBmkkotXcINX4xW58KRLRa3xJZ+gVhuhL9v0TRPtdnH49xPdL0/+Ui9dBEJ3PmiA6lylBdC5PU/M5ntX4klFof+BL7ey6OvGlLirac/iSxi9240uRiF6PzZcYkOpnplcK/gAzINW3ZogvrBiQ6vtuCgTRORy9CkG0p6GvhxhEc4NU33dT4AZpDseqwg3SSiLvIzdI81iaEjdIc3lygzSX5xDfL+USyFUjiM7laWoE0blMCaJzeZqaz/GsZkBqFNof+FI7u65OfKmLivYcvqTxi934UiSi12PzJQak+pnplYI/wAxI9a0Z4gsrBqT6vpsCA9Icjl6FAamnoa8ZkOoMowI3SCMRreYGqcYvduNLkYhe40s6Q68wRF+y758g2u/i9Oshvl+a/qdcvA6C6HzWBNG5TAmic3mams/xrMaXjEL7A19qZ9fViS91UdGew5c0frEbX4pE9HpsvsSAVD8zvVLwB5gBqb41Q3xhxYBU33dTIIjO4ehVCKI9DX09xCCaG6T6vpsCN0hzOFYVbpBWEnkfuUGax9KUuEGay5MbpLk8h/h+KZdArhpBdC5PUyOIzmVKEJ3L09R8jmc1A1Kj0P7Al9rZdXXiS11UtOfwJY1f7MaXIhG9HpsvMSDVz0yvFPwBZkCqb80QX1gxINX33RQYkOZw9CoMSD0Nfc2AVGcYFbhBGoloNTdINX6xG1+KRPQaX9IZeoUh+pJ9/wTRfhenXw/x/dL0P+XidRBE57MmiM5lShCdy9PUfI5nNb5kFNof+FI7u65OfKmLivYcvqTxi934UiSi12PzJQak+pnplYI/wAxI9a0Z4gsrBqT6vpsCQXQOR69CEO1p6OshBtHcINX33RS4QZrDsapwg7SSyPvIDdI8lqbEDdJcntwgzeU5xPdLuQRy1Qiic3maGkF0LlOC6FyepuZzPKsZkBqF9ge+1M6uqxNf6qKiPYcvafxiN74Uiej12HyJAal+Znql4A8wA1J9a4b4wooBqb7vpsCANIejV2FA6mnoawakOsOowA3SSESruUGq8Yvd+FIkotf4ks7QKwzRl+z7J4j2uzj9eojvl6b/KRevgyA6nzVBdC5Tguhcnqbmczyr8SWj0P7Al9rZdXXiS11UtOfwJY1f7MaXIhG9HpsvMSDVz0yvFPwBZkCqb80QX1gxINX33RQIonM4ehWCaE9DXw8xiOYGqb7vpsAN0hyOVYUbpJVE3kdukOaxNCVukOby5AZpLs8hvl/KJZCrRhCdy9PUCKJzmRJE5/I0NZ/jWc2A1Ci0P/CldnZdnfhSFxXtOXxJ4xe78aVIRK/H5ksMSPUz0ysFf4AZkOpbM8QXVgxI9X03BQakORy9CgNST0NfMyDVGUYFbpBGIlrNDVKNX+zGlyIRvcaXdIZeYYi+ZN8/QbTfxenXQ3y/NP1PuXgdBNH5rAmic5kSROfyNDWf41mNLxmF9ge+1M6uqxNf6qKiPYcvafxiN74Uiej12HyJAal+Znql4A8wA1J9a4b4wooBqb7vpkAQncPRqxBEexr6eohBNDdI9X03BW6Q5nCsKtwgrSTyPnKDNI+lKXGDNJcnN0hzeQ7x/VIugVw1guhcnqZGEJ3LlCA6l6ep+RzPagakRqH9gS+1s+vqxJe6qGjP4Usav9iNL0Uiej02X2JAqp+ZXin4A8yAVN+aIb6wYkCq77spMCDN4ehVGJB6GvqaAanOMCpwgzQS0WpukGr8Yje+FInoNb6kM/QKQ/Ql+/4Jov0uTr8e4vul6X/KxesgiM5nTRCdy5QgOpenqfkcz2p8ySi0P/CldnZdnfhSFxXtOXxJ4xe78aVIRK/H5ksMSPUz0ysFf4AZkOpbM8QXVgxI9X03BYLoHI5ehSDa09DXQwyiuUGq77spcIM0h2NV4QZpJZH3kRukeSxNiRukuTy5QZrLc4jvl3IJ5KoRROfyNDWC6FymBNG5PE3N53hWMyA1Cu0PfKmdXVcnvtRFRXsOX9L4xW58KRLR67H5EgNS/cz0SsEfYAak+tYM8YUVA1J9302BAWkOR6/CgNTT0NcMSHWGUYEbpJGIVnODVOMXu/GlSESv8SWdoVcYoi/Z908Q7Xdx+vUQ3y9N/1MuXgdBdD5rguhcpgTRuTxNzed4VuNLRqH9gS+1s+vqxJe6qGjP4Usav9iNL0Uiej02X2JAqp+ZXin4A8yAVN+aIb6wYkCq77spEETncPQqBNGehr4eYhDNDVJ9302BG6Q5HKsKN0gribyP3CDNY2lK3CDN5ckN0lyeQ3y/lEsgV40gOpenqRFE5zIliM7laWo+x7OaAalRaH/gS+3sujrxpS4q2nP4ksYvduNLkYhej82XGJDqZ6ZXCv4AMyDVt2aIL6wYkOr7bgoMSHM4ehUGpJ6GvmZAqjOMCtwgjUS0mhukGr/YjS9FInqNL+kMvcIQfcm+f4Jov4vTr4f4fmn6n3LxOgii81kTROcyJYjO5WlqPsezGl8yCu0PfKmdXVcnvtRFRXsOX9L4xW58KRLR67H5EgNS/cz0SsEfYAak+tYM8YUVA1J9302BIDqHo1chiPY09PUQg2hukOr7bgrcIM3hWFW4QVpJ5H3kBmkeS1PiBmkuT26Q5vIc4vulXAK5agTRuTxNjSA6lylBdC5PU/M5ntUMSI1C+wNfamfX1YkvdVHRnsOXNH6xG1+KRPR6bL7EgFQ/M71S8AeYAam+NUN8YcWAVN93U2BAmsPRqzAg9TT0NQNSnWFU4AZpJKLV3CDV+MVufCkS0Wt8SWfoFYboS/b9E0T7XZx+PcT3S9P/lIvXQRCdz5ogOpcpQXQuT1PzOZ7V+JJRaH/gS+3sujrxpS4q2nP4ksYvduNLkYhej82XGJDqZ6ZXCv4AMyDVt2aIL6wYkOr7bgoE0TkcvQpBtKehr4cYRHODVN93U+AGaQ7HqsIN0koi7yM3SPNYmhI3SHN5coM0l+cQ3y/lEshVI4jO5WlqBNG5TAmic3mams/xrGZAahTaH/hSO7uuTnypi4r2HL6k8Yvd+FIkotdj8yUGpPqZ6ZWCP8AMSPWtGeILKwak+r6bAgPSHI5ehQGpp6GvGZDqDKMCN0gjEa3mBqnGL3bjS5GIXuNLOkOvMERfsu+fINrv4vTrIb5fmv6nXLwOguh81gTRuUwJonN5mprP8azGl4xC+wNfamfX1YkvdVHRnsOXNH6xG1+KRPR6bL7EgFQ/M71S8AeYAam+NUN8YcWAVN93UyCIzuHoVQiiPQ19PcQgmhuk+r6bAjdIczhWFW6QVhJ5H7lBmsfSlLhBmsuTG6S5PIf4fimXQK4aQXQuT1MjiM5lShCdy9PUfI5nNQNSo9D+wJfa2XV14ktdVLTn8CWNX+zGlyIRvR6bLzEg1c9MrxT8AWZAqm/NEF9YMSDV990UGJDmcPQqDEg9DX3NgFRnGBW4QRqJaDU3SDV+sRtfikT0Gl/SGXqFIfqSff8E0X4Xp18P8f3S9D/l4nUQROezJojOZUoQncvT1HyOZzW+ZBTaH/hSO7uuTnypi4r2HL6k8Yvd+FIkotdj8yUGpPqZ6ZWCP8AMSPWtGeILKwak+r6bAkF0DkevQhDtaejrIQbR3CDV990UuEGaw7GqcIO0ksj7yA3SPJamxA3SXJ7cIM3lOcT3S7kEctUIonN5mhpBdC5TguhcnqbmczyrGZAahfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8iQGpfmZ6peAPMANSfWuG+MKKAam+76bAgDSHo1dhQOpp6GsGpDrDqMAN0khEq7lBqvGL3fhSJKLX+JLO0CsM0Zfs+yeI9rs4/XqI75em/ykXr4MgOp81QXQuU4LoXJ6m5nM8q/Elo9D+wJfa2XV14ktdVLTn8CWNX+zGlyIRvR6bLzEg1c9MrxT8AWZAqm/NEF9YMSDV990UCKJzOHoVgmhPQ18PMYjmBqm+76bADdIcjlWFG6SVRN5HbpDmsTQlbpDm8uQGaS7PIb5fyiWQq0YQncvT1Aiic5kSROfyNDWf41nNgNQotD/wpXZ2XZ34UhcV7Tl8SeMXu/GlSESvx+ZLDEj1M9MrBX+AGZDqWzPEF1YMSPV9NwUGpDkcvQoDUk9DXzMg1RlGBW6QRiJazQ1SjV/sxpciEb3Gl3SGXmGIvmTfP0G038Xp10N8vzT9T7l4HQTR+awJonOZEkTn8jQ1n+NZjS8ZhfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8iQGpfmZ6peAPMANSfWuG+MKKAam+76ZAEJ3D0asQRHsa+nqIQTQ3SPV9NwVukOZwrCrcIK0k8j5ygzSPpSlxgzSXJzdIc3kO8f1SLoFcNYLoXJ6mRhCdy5QgOpenqfkcz2oGpEah/YEvtbPr6sSXuqhoz+FLGr/YjS9FIno9Nl9iQKqfmV4p+APMgFTfmiG+sGJAqu+7KTAgzeHoVRiQehr6mgGpzjAqcIM0EtFqbpBq/GI3vhSJ6DW+pDP0CkP0Jfv+CaL9Lk6/HuL7pel/ysXrIIjOZ00QncuUIDqXp6n5HM9qfMkotD/wpXZ2XZ34UhcV7Tl8SeMXu/GlSESvx+ZLDEj1M9MrBX+AGZDqWzPEF1YMSPV9NwWC6ByOXoUg2tPQ10MMorlBqu+7KXCDNIdjVeEGaSWR95EbpHksTYkbpLk8uUGay3OI75dyCeSqEUTn8jQ1guhcpgTRuTxNzed4VjMgNQrtD3ypnV1XJ77URUV7Dl/S+MVufCkS0eux+RIDUv3M9ErBH2AGpPrWDPGFFQNSfd9NgQFpDkevwoDU09DXDEh1hlGBG6SRiFZzg1TjF7vxpUhEr/ElnaFXGKIv2fdPEO13cfr1EN8vTf9TLl4HQXQ+a4LoXKYE0bk8Tc3neFbjS0ah/YEvtbPr6sSXuqhoz+FLGr/YjS9FIno9Nl9iQKqfmV4p+AM8lAHpIef9V68Y+m/mzpV3lkfe875lp622nzy94QbLyrKl6/sv6d2aAWnOlhBE53D0KgTRnoa+HmIQzQ1Sfd9NgRukORyrCjdIK4m8j9wgzWNpStwgzeXJDdJcngTRGc3KCQAAQABJREFUuTwJonN5mhpBdC5TguhcnqbmczyrGZAahfYHvtTOrqsTX+qioj2HL2n8Yje+FIno9dh8iQGpfmZ6peAP8FAGpG84+4TyrWuu6BVH/83UINqeY0DqybStCaLbuM3XRRA9H53pP0cQPT2z+Tp8EM2AdD5SC/9c9aV/u+xr5ZQfX7TwxkX+Sm6Q5gLnP9zJ5Wlq/Ic7uUyH+B/uGAGCaO0cEERr/GI3QXQkotcE0TpDr0AQ7WnkrH2OZ4r4ksYVX9L4xW58KRLRa3xJZ+gV8CVPI2c9Nl9iQJpzbnqj4g8wA9KcbalBtKkxINWZMiDVGUYFBqSRiFYzINX4xW4GpJGIXldfYkCqszQFfCmHo1fBlzwNfY0v6Qy9gvcle54g2tOZfk0QPT2z+ToIouej0/Y5gug2bnN1EUTPRab9eZ/jmQq+1M7SOvEljV/sxpciEb3Gl3SGXgFf8jRy1mPzJQakOeemNyr+ADMgzdmWGkSbGgNSnSlBtM4wKhBERyJaTRCt8YvdPojmBmmk01ZXX2JA2sYvduFLkYhe40s6Q6+AL3ka+tr7kqkRRGtMCaI1frGbIDoS0WuCaJ2hVyCI9jRy1j7HM0V8SeOKL2n8Yje+FInoNb6kM/QK+JKnkbMemy8xIM05N71R8QeYAWnOttQg2tQYkOpMCaJ1hlGBIDoS0WqCaI1f7PZBNAPSSKetrr7EgLSNX+zClyIRvcaXdIZeAV/yNPS19yVTI4jWmBJEa/xiN0F0JKLXBNE6Q69AEO1p5Kx9jmeK+JLGFV/S+MVufCkS0Wt8SWfoFfAlTyNnPTZfYkCac256o+IPMAPSnG2pQbSpMSDVmRJE6wyjAkF0JKLVBNEav9jtg2gGpJFOW119iQFpG7/YhS9FInqNL+kMvQK+5Gnoa+9LpkYQrTEliNb4xW6C6EhErwmidYZegSDa08hZ+xzPFPEljSu+pPGL3fhSJKLX+JLO0CvgS55GznpsvsSANOfc9EbFH2AGpDnbUoNoU2NAqjMliNYZRgWC6EhEqwmiNX6x2wfRDEgjnba6+hID0jZ+sQtfikT0Gl/SGXoFfMnT0Nfel0yNIFpjShCt8YvdBNGRiF4TROsMvQJBtKeRs/Y5niniSxpXfEnjF7vxpUhEr/ElnaFXwJc8jZz12HyJAWnOuemNij/ADEhztqUG0abGgFRnShCtM4wKBNGRiFYTRGv8YrcPohmQRjptdfUlBqRt/GIXvhSJ6DW+pDP0CviSp6GvvS+ZGkG0xpQgWuMXuwmiIxG9JojWGXoFgmhPI2ftczxTxJc0rviSxi9240uRiF7jSzpDr4AveRo567H5EgPSnHPTGxV/gBmQ5mxLDaJNjQGpzpQgWmcYFQiiIxGtJojW+MVuH0QzII102urqSwxI2/jFLnwpEtFrfEln6BXwJU9DX3tfMjWCaI0pQbTGL3YTREciek0QrTP0CgTRnkbO2ud4pogvaVzxJY1f7MaXIhG9xpd0hl4BX/I0ctZj8yUGpDnnpjcq/gAzIM3ZlhpEmxoDUp0pQbTOMCoQREciWk0QrfGL3T6IZkAa6bTV1ZcYkLbxi134UiSi1/iSztAr4Euehr72vmRqBNEaU4JojV/sJoiORPSaIFpn6BUIoj2NnLXP8UwRX9K44ksav9iNL0Uieo0v6Qy9Ar7kaeSsx+ZLDEhzzk1vVPwBZkCasy01iDY1BqQ6U4JonWFUIIiORLSaIFrjF7t9EM2ANNJpq6svMSBt4xe78KVIRK/xJZ2hV8CXPA197X3J1AiiNaYE0Rq/2E0QHYnoNUG0ztArEER7Gjlrn+OZIr6kccWXNH6xG1+KRPQaX9IZegV8ydPIWY/NlxiQ5pyb3qj4A8yANGdbahBtagxIdaYE0TrDqEAQHYloNUG0xi92+yCaAWmk01ZXX2JA2sYvduFLkYhe40s6Q6+AL3ka+tr7kqkRRGtMCaI1frGbIDoS0WuCaJ2hVyCI9jRy1j7HM0V8SeOKL2n8Yje+FInoNb6kM/QK+JKnkbMemy8xIM05N71R8QeYAWnOttQg2tQYkOpMCaJ1hlGBIDoS0WqCaI1f7PZBNAPSSKetrr7EgLSNX+zClyIRvcaXdIZeAV/yNPS19yVTI4jWmBJEa/xiN0F0JKLXBNE6Q69AEO1p5Kx9jmeK+JLGFV/S+MVufCkS0Wt8SWfoFfAlTyNnPTZfYkCac256o+IPMAPSnG2pQbSpMSDVmRJE6wyjAkF0JKLVBNEav9jtg2gGpJFOW119iQFpG7/YhS9FInqNL+kMvQK+5Gnoa+9LpkYQrTEliNb4xW6C6EhErwmidYZegSDa08hZ+xzPFPEljSu+pPGL3fhSJKLX+JLO0CvgS55GznpsvrRWD0iv+unPymdP+2K55NLLyvU33Fjus9025cEPfEDZY7fHlHXWWWdBJ+aOlSvLcSeeWi646Dvl6p9dW7backV54A5/UPZ68u5l/SVLVtP4wpnnllPPOHPy5/3+/bYvz3v23mXzzTZd5eu+8rVvlhNOPr08Zpedyq6P3WWVz6mFP8AMSFWav+qvQbRVDEh1pgTROsOoQBAdiWg1QbTGL3b7IJoBaaTTVldfYkDaxi924UuRiF7jSzpDr4AveRr62vuSqRFEa0wJojV+sZsgOhLRa4JonaFXIIj2NHLWPsczRXxJ44ovafxiN74Uieg1vqQz9Ar4kqeRsx6bL621A9If/ujy8vZ3f7DYgNMe6667brnrrrsm6wfucP+y7wufXdZbb71JPdf/u/XW28rbj/hgufyKKydfsmzZ0nLbbbdP1ttuc6/yype+qCxfvmy2/VsXXlze+4GPF/u6+/zONuWS736/bLFi83LwgfvNfs0NP7+xHHjwYWW9me/nTQftXzbeaMPZz2Us/AFmQJpBtJQaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmS2vtgPS1B7+tXH/9z8vDH/aQ8tQ/321yi/PiS75XPvDhT5Zbbr21/NWznlZ2ecSO856aY449rpx59vllk403Kq/ab9+yYvPNyrXXXV/e+o73lRtvurk8eueHlX2esdesxkc+8e/lvPO/UQ7Y/yXFBqhHHnX0zM3TS8qhr//7suk9Npl83dvedVS57Ps/mgxoH/ygB8z2Zi38AWZAmkO1BtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+dJaOSD9+Y03lX846K2TW6NvO+SAyY3OejxOOf1L5TMnfG7yq3b3fdGz69OrfbSbovu/9tDJrdPXH/CKya/WrV9kv2r39YcePtE/7NADytKlSyefOvw9H5rcGj3isDdMfoXvp48/ZfLrdl89M1y9z3bbls9/6Zxy7KdPKn/60AeVFz7vmVUu9aM/wAxIc9DWINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X1orB6TXXHvdzGDyrLLNvbee/Duf/mh8/4c/Lv98+PvLdtveu7zm7/7Gf2qV9Ze/8j/lwx//tzm/7s2Hvbf86PKflOc/5+llpx0fPOn92Cf/s5x97lfL/i//63Lf7bcr75j59byXfu8H5S1vfE255ZZbJ0PVDZYvL4fM/Gpd+zW8d8fDH2AGpDmEaxBtagxIdaYE0TrDqEAQHYloNUG0xi92+yCaAWmk01ZXX2JA2sYvduFLkYhe40s6Q6+AL3ka+tr7kqkRRGtMCaI1frGbIDoS0WuCaJ2hVyCI9jRy1j7HM0V8SeOKL2n8Yje+FInoNb6kM/QK+JKnkbMemy+tlQPS+Y7C8SedVk4+9QuTX69rv2Z3rsdJp3y+nHjy6eXJT3x8edLM/8XHSZ89o5w4839P3nPX8qQ9Hjf59CWXXlYOP/JfJjdLt1ixWbGbpvZvkdqv5z3kn99TfnLlT8srXvKCcv/fv2+US6v9AWZAmoO1BtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+dKoBqRX/fRn5eA3v2tyUv7xNS8rW99zyzlPTb0N+uxn7lUe9ciHrfZ1Z51zfvnEp44rO8/8O6bPcYPWr37jgnLGF8+e/Fulf3j/+5WnP+3Py+e/eM5kmPpnj3p4edb/espqWplP+APMgDSHbA2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/Ol0QxIb775F+WNb3l3ufGmm8tuj92l7P0Xe857Yo486uhywUWXlBe/YJ/ykD/eYbWv/cY3Lyrv/5djygN3uH95yV8/d7XP1yd+fPmV5Z8OO7Jseo9NysEH7leWLFlSP3W3fPQHmAFpDuIaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmS6MYkN5++x3lrYe/b/Irbv9g5tfbvuxvnl/WWWedeU+M/fuj9u+QPnefvcsjd3roal97zpe/Xo4+5j/KTn/64PL8v3r6ap+3J1beeWd5w6GHz9wmvaG8eubX7G6xxYpyznlfK/bvoG6/3bblkQ//k7LxRht29rY+6Q8wA9JWiqv21SDaP7umF6x+H3xfXd+d/Wdefml559dOr39U7z4OJYj24VnfhzpDCaLr36UTrrigHPfdb/TubNZviCC6ksj5OKS/S+96/LPK8pXrlcO+eVq5+PqrcgDcDSr171LfB6T179J5V/+gfODbZ90NJHIkh+RLH93zBZMf+nknf7jcsvL2HAB3g8pQfOkVO+5WHrXN75WjLzoXX0o4B0P6u/TOnZ8x+xPX1+W/zdfv9s0M9c+PQfQs2LConMPTs+VQf/76A/D931RRdH78be+//6busfGGZb311vVPDfbvX/0hFvP8dQXR9tx8j9/2/vPnbzzf9qz1539NFx0W8+9P10b0/c+3/820gV592P9+2nP10ffvv49//+OAtLLs+tjH799/n+x/v1//qOen7vWadOrXDfXjWj8gveuuu8o7Z/5d0Eu/94Oy1ZYrygH7v6QsXbp0jft13Emnls+e+sXyF09+Qtljt8es9vWnnPal8pkTP1eeuPuflb2etPtqn7cnjv30SeXzXzqn7Ln7Y8ueezy2HPLWIyb/Lmn9Yvt+Xvuql5b1E2+V+v9hYkBaSWsfaxDtVdb0Pwx+H3xfXd+d/QxIK2Xt45CGOkMJouvfJQak2tms3Q/actty0COfXK64+Yby8jM+WZ/u3cch/V1iQJp7fBiQ5vK0v0sMSHOZMiDN5cmAdO0OSOZ6/8KA9Fd/j36b7//sO+DPn//vn/9fOwaknsav1tOcHwakGr/Vu/n7O835a+HHgFQbkDMg1fh1vX5iQPqbv8l399//Lv6/+dP539818a+s1sSxft1QP67VA9Jf/vKX5agP/2uxX4e7ycYbTYaR9nEhjzPP/nI55tjj5/wVuvVX8O7zjKeWR++802qSNpB9xxEfLPfcaovyulf/33LRxd8t1mM3Tp/7v/+yfPxTnynnztxCtV/Pa7+mN+vhDzYD0hyqdahjamt6YZXzJ2oqDEg1frV7wyVLy0f2fP6k5KZOpaJ9JIjW+MVuBqSRiF7bgPTeG21a3nD2CeVb11yhC95NCtWX+n6D9C9+7yHlOTs8ouBLOQcBX8rh6FXwJU9DXw/Rl+ynXtvf8Os7O79CHJAO4f3S/D/Rb/ez/CrDfP4xiO4akOb/qWuvYteA1P7e82gn4HM8U8GX2llaJ76k8Yvd+FIkotf4ks7QK+BLnkbOemy+tFYPSD/57yeUL551Xtlg+fKZ4ejfls0323TBp+T6G35eXvuGt02+/rBDX1uWL//NC75bb72t/N0Bh0w+d8hB+5fNNr3HKrq33XZ7ed2b3l7s3z39x9e8rGx9zy3LKafP3Dg94XOzA9ELLvrOzMD0Y+VpT9mjPGHXR6/SrxT+ADMgVUj+prcG0fbMEN7wE0T/Zu+UFUG0Qq+7lyC6m0vrs0MMovv+66oZkLaexu4+BqTdXFqfxZdayc3dhy/NzablM0P0Jfs5CaJbdvs3PQTRv2GRsSKIzqC4qgZB9Ko81IogWiW4er/P8eyz+NLqjKZ5Bl+ahtaavxZfWjOjab8CX5qW2Pxfjy/Nz6fls2PzpbV2QHry575Qjv+v0ya/vvYfZn6trg0p53rcOfNvhX7mxFNLmblxutdTnlCWrLfe5Evf8/6jy4XfvqTc93e3K6986YvKuuuuW+xX9r7jPR8q37vsh+WPHnD/8rcvfu5qsvXfL917rz3Lbo/bZfL5s845v3ziU8eV58zcHt155t8ePfvcr5aPffI/y1w3UFcTXeAT/gAzIF0gtDV8GQPSNQCa8tND+fVrBNFTbuwCvpwgegGQpviSIQbRDEin2OB5vrT6EjdI54E0xafwpSlgLfBLh/Kr3/GlBW7oAr9siL5kPxpB9AI3eI4vI4ieA0zj0wTRjeDmaSOIngdOw6cIohugraHF53j2pfjSGoCt4dP40hoATflpfGlKYAv4cnxpAZCm+BJ8aQpYC/zSsfnSWjkg/fZ3vlve/f8+Mtly+/c9N9ts1Rue9SwcsP/fzvx7pOuXr//PhZNfxWvPv+h5zyw7PvRBky+58qqry1sPf1+xG6HLli0t29x763LFT66arV/1in3LvbbeqspNPn7rwovLez/w8bL9dtuWv3/Fi8s666wzq/XGt7x78qt+d33sLuX0L/x3ufGmmye/fjdqrCI4ZeEPMAPSKeHN8eU1iLZPc4N0DkhTPE0QPQWsBX4pQfQCQS3wy+q/m/jlq39Qjvr2WQvsWvwvG2IQzYA055xUX2JAmsMTX8rh6FXwJU9DX+NLOkOv4P9tbHueINrTmX5NED09s/k6CKLno9P2OYLoNm5zdRFEz0Wm/Xmf45kKvtTO0jrxJY1f7MaXIhG9xpd0hl4BX/I0ctZj86W1ckB67vlfLx/9xH+s8US8/Z8OnAw+r7n2+vLGN7+r3DlzO/Sgf3hZ2XKLFbO911x7XXnfh44pl19x5exz225zr7LvC/cpW6zYfPY5W9x++x3lNQe9pdxxx8py8IH7rfYrfW0o+unjT5ncQrXbqPbrdesN01WEhMIfYAakAkjXWoNoe4oBqQPTuCSIbgQ3TxtB9DxwGj5FEN0AbZ4WH0QzIJ0H1BSfqr7EgHQKaPN8Kb40D5zGT+FLjeDmaMOX5gDT+LT3JZMgiG4E+es2gmiNX+wmiI5E9JogWmfoFQiiPY2ctc/xTBFf0rjiSxq/2I0vRSJ6jS/pDL0CvuRp5KzH5ktr5YC05SisXLly0rZk5sZp12PlzK/hveaa68oWW2w++yt4u75uTc/Zr+i96qc/K/fcaouy3q9/le+aeqb5vD/ADEinITf319Yg2r6CAencnBb6GYLohZJa+NcRRC+c1UK+kiB6IZQW/jU+iGZAunBu831l9SUGpPNRWvjn8KWFs1roV+JLCyW1sK/DlxbGaaFf5X3JegiiF0qu++sIoru5tD5LEN1Kbu4+gui52bR8hiC6hdr8PT7Hs6/El+bntabP4ktrIjTd5/Gl6Xgt5KvxpYVQWvjX4EsLZ7XQrxybLzEgXejJGMjX+QPMgDRn02oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02X2JAmnNueqPiDzAD0pxtqUG0qTEg1ZkSROsMowJBdCSi1QTRGr/Y7YNoBqSRTltdfYkBaRu/2IUvRSJ6jS/pDL0CvuRp6GvvS6ZGEK0xJYjW+MVuguhIRK8JonWGXoEg2tPIWfsczxTxJY0rvqTxi934UiSi1/iSztAr4EueRs56bL7EgDTn3PRGxR9gBqQ521KDaFNjQKozJYjWGUYFguhIRKsJojV+sdsH0QxII522uvoSA9I2frELX4pE9Bpf0hl6BXzJ09DX3pdMjSBaY0oQrfGL3QTRkYheE0TrDL0CQbSnkbP2OZ4p4ksaV3xJ4xe78aVIRK/xJZ2hV8CXPI2c9dh8iQFpzrnpjYo/wAxIc7alBtGmxoBUZ0oQrTOMCgTRkYhWE0Rr/GK3D6IZkEY6bXX1JQakbfxiF74Uieg1vqQz9Ar4kqehr70vmRpBtMaUIFrjF7sJoiMRvSaI1hl6BYJoTyNn7XM8U8SXNK74ksYvduNLkYhe40s6Q6+AL3kaOeux+RID0pxz0xsVf4AZkOZsSw2iTY0Bqc6UIFpnGBUIoiMRrSaI1vjFbh9EMyCNdNrq6ksMSNv4xS58KRLRa3xJZ+gV8CVPQ197XzI1gmiNKUG0xi92E0RHInpNEK0z9AoE0Z5GztrneKaIL2lc8SWNX+zGlyIRvcaXdIZeAV/yNHLWY/MlBqQ556Y3Kv4AMyDN2ZYaRJsaA1KdKUG0zjAqEERHIlpNEK3xi90+iGZAGum01dWXGJC28Ytd+FIkotf4ks7QK+BLnoa+9r5kagTRGlOCaI1f7CaIjkT0miBaZ+gVCKI9jZy1z/FMEV/SuOJLGr/YjS9FInqNL+kMvQK+5GnkrMfmSwxIc85Nb1T8AWZAmrMtNYg2NQakOlOCaJ1hVCCIjkS0miBa4xe7fRDNgDTSaaurLzEgbeMXu/ClSESv8SWdoVfAlzwNfe19ydQIojWmBNEav9hNEB2J6DVBtM7QKxBEexo5a5/jmSK+pHHFlzR+sRtfikT0Gl/SGXoFfMnTyFmPzZcYkOacm96o+APMgDRnW2oQbWoMSHWmBNE6w6hAEB2JaDVBtMYvdvsgmgFppNNWV19iQNrGL3bhS5GIXuNLOkOvgC95Gvra+5KpEURrTAmiNX6xmyA6EtFrgmidoVcgiPY0ctY+xzNFfEnjii9p/GI3vhSJ6DW+pDP0CviSp5GzHpsvMSDNOTe9UfEHmAFpzrbUINrUGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02XxrVgPTKq64uxxx7XPn5jTeVJ+z6mLLLI3Zc46m5Y+XKctyJp5YLLvpOufpn15attlxRHrjDH5S9nrx7WX/JktX6v3DmueXUM84s199wY/n9+21fnvfsvcvmm226ytd95WvfLCecfHp5zC47lV0fu8sqn1MLf4AZkKo0f9Vfg2irGJDqTAmidYZRgSA6EtFqgmiNX+z2QTQD0kinra6+xIC0jV/swpciEb3Gl3SGXgFf8jT0tfclUyOI1pgSRGv8YjdBdCSi1wTROkOvQBDtaeSsfY5niviSxhVf0vjFbnwpEtFrfEln6BXwJU8jZz02XxrFgPSXv/xl+eypXyzH/9dps6fkibv/WdnrSbvP1l2LW2+9rbz9iA+Wy6+4cvLpZcuWlttuu32y3nabe5VXvvRFZfnyZbOt37rw4vLeD3y82Nfd53e2KZd89/tlixWbl4MP3G/2a274+Y3lwIMPK+utu25500H7l4032nD2cxkLf4AZkGYQLaUG0abGgFRnShCtM4wKBNGRiFYTRGv8YrcPohmQRjptdfUlBqRt/GIXvhSJ6DW+pDP0CviSp6GvvS+ZGkG0xpQgWuMXuwmiIxG9JojWGXoFgmhPI2ftczxTxJc0rviSxi9240uRiF7jSzpDr4AveRo567H50lo/IL3lllvLWw9/X/np1deUdWeGklus2GxyE3QhA1K7bXrm2eeXTTbeqLxqv33Lis03K9ded3156zveV2686eby6J0fVvZ5xl6zJ+8jn/j3ct753ygH7P+SYgPUI486eubm6SXl0Nf///bOA96OovrjExKS0EsoQgxFREF6r9KbNAEpgoCICooIAULvLdTQpEgRQUAEBCSUPyBNaujSQXonQiCICIQk/PdsmPvOm7f3vrt75t53997vfj7Jm9ndObv73Zn7mz1nZ3ZfN9OMM6T7nXzG+e7V1950u+68nVt80YUqZWMldAUmQBqHqndEizUCpHamOKLtDEMLOKJDIrY8jmgbv7C0dkQTIA3pFMt7XSJAWoxfWApdConY8+iSnaG2gC5pGva01iWxhiPaxhRHtI1fWBpHdEjEnscRbWeoLeCI1jTipLUfTyyiSzau6JKNX1gaXQqJ2PPokp2htoAuaRpx0p2mS20fIJXA6JHHne7mm/eb7uc7buPuumeMu/2u+1xvAVIZKTri4JFu8uTJ7oiDhqdT6/oqJlPtHjHytDTgOmrkQW7gwIHpptPOujAdNXrmqCNdv3793LXX35pOt7t/ElydZ9jQ9NhXXXuTW2bJRd3OO27tzUX9qyswAdI4aL0jWqwRILUzxRFtZxhawBEdErHlcUTb+IWltSOaAGlIp1je6xIB0mL8wlLoUkjEnkeX7Ay1BXRJ07CntS6JNRzRNqY4om38wtI4okMi9jyOaDtDbQFHtKYRJ639eGIRXbJxRZds/MLS6FJIxJ5Hl+wMtQV0SdOIk+40XWr7AKlMafvk08+n3/uUKnLN6FvqCpA+/OiT7qLL/uqGDZ3LHbDPr3vUruNHnePefPtdt9P2W7rlll483X7pFX9zDzz4mBux5y/d/PMOc6cm0/O+9Mrr7oSjD3AyklWCqtMMHuyOTabWlWl4G7HoCkyANA5h74gWawRI7UxxRNsZhhZwRIdEbHkc0TZ+YWntiCZAGtIplve6RIC0GL+wFLoUErHn0SU7Q20BXdI07GmtS2INR7SNKY5oG7+wNI7okIg9jyPazlBbwBGtacRJaz+eWESXbFzRJRu/sDS6FBKx59ElO0NtAV3SNOKkO02X2j5AGlaLegOkN916l7vx5jvcRuuv6TZM/oXLTbfc6W5M/m20wVpuw/XWSDe/+NKr7rSz/9htKl/5FqlMz3vsSWe5d9/7txu+28/cgt+ePzQXLa8rMAHSOFi9I1qsESC1M8URbWcYWsARHRKx5XFE2/iFpbUjmgBpSKdY3usSAdJi/MJS6FJIxJ5Hl+wMtQV0SdOwp7UuiTUc0TamOKJt/MLSOKJDIvY8jmg7Q20BR7SmESet/XhiEV2ycUWXbPzC0uhSSMSeR5fsDLUFdEnTiJPuNF0iQFql3vjRoNttvalbZcVle+x135hH3J+vHO1WWmFpt/02m1W2P/bEM+7Oux9Iv1X63QW/5bbc7AfurrvHpMHU1VZZ3m3zo40r+zYioSswAdI4hL0jWqwRILUzxRFtZxhawBEdErHlcUTb+IWltSOaAGlIp1je6xIB0mL8wlLoUkjEnkeX7Ay1BXRJ07CntS6JNRzRNqY4om38wtI4okMi9jyOaDtDbQFHtKYRJ639eGIRXbJxRZds/MLS6FJIxJ5Hl+wMtQV0SdOIk+40XSJAWqXenH3+Je6Z5150u/xsW7fEYgv32OuJp55z5/3xcrfIwgu63X65Q4/tfsVbb7/njht1tptpxhncUYfs5QYMGOA3NeSvrsAESOMg9o5osUaA1M4UR7SdYWgBR3RIxJbHEW3jF5bWjmgCpCGdYnmvSwRIi/ELS6FLIRF7Hl2yM9QW0CVNw57WuiTWcETbmOKItvELS+OIDonY8zii7Qy1BRzRmkactPbjiUV0ycYVXbLxC0ujSyERex5dsjPUFtAlTSNOutN0iQBplXoj3x+V75DusO0WbsXlluyx15iH/+kuufwat9wyi7udfrJlj+2yYuKkSe7I5LujH370sds/mWZ3yJBZ3ZiHHnevvfGWm3fYULfi8ku56aebNrNs0ZW6AhMgLUqxeznviNZre+uw6vugy/l0I8vf+/ZL7vTH7/CHarm/ZXFEa+dZqwd1yuKI9m3phneecaNffqLl6qY/IRzRnkScv2VqS2esuY0bPLG/G/XU7e6F8WPjAGiAFd+WWj1A6tvSQ++/7i54/r4GkIhjsky69KcNfpZe9I43X+Q+mzghDoAGWCmLLg1fem23ytwLuEueexBdilAPytSWTl9pq8oV+355X/bf5WTKevzQEV0BGyQ852B1JVvW6/cXwPn/16PI/NvX91+f1IzTT+v6959Krypt+/MX0cz6l+WIlnW1lr6+/xx/+lq3p+3rf28DHZrZfrJuRKsfX34zJaDnF/n9lHV+afXzb8X2HwZIPcusv614/vo8uf+t3f+x1h9/r3uz4/cr618CpFXu3OibbnO33Ha3++FG67r11v5+j71uvf0ed92Nf3frr7Oa23TDdXpslxVXXXuTu+ueMW6DdVZ3G6y3ujv2xDPd+x98WNl39tlmdQfvt7ubOuKoUv3DRIC0gtqU8I5obaS3HwZ9H3Q5n25keQKknrLtb5mCOmVxRPu2RIDUVjd96UVnG+oOX3Ej986nH7s977zCr265v2VqSwRI41YfAqRxeUpbIkAalykB0rg8CZC2t4Ok2vMLAdIp7agvn//kDDh+7fanf+0IkGoaU9J56g8BUhu/nqVpv3nqXxF+BEhtAXICpDZ+Wf0nAqRdLbnR7T+Lf9fR+f3tjb9n1RtHv19Z/xIgrXLn7n3gYXf5VddXnULXT8G77VabuFVXWq6HlZdeed2deuYf3ByzD3GH7v9b99wLLzspIyNOd/jx5u6yK69zDyajUGV6XpmmN9aiKzYB0jhUfVBHrPXWsYpzRJsVAqQ2fr70tAMGuiz303YAAEAASURBVIs32CnNMlLHU7H9xRFt4xeWJkAaErHnJUA613QzuSMfuME9Pe4du8EGWfC61OojSH+4wBJu+4VXcOhSnIqALsXhqK2gS5qGPV1GXZKrbvcHfvudrW0hDJCW4Xmp9hX17VamMozPP3REZwVI4x+1fS1mBUil3bMUJ6D9eGIFXSrOUkqiSzZ+YWl0KSRiz6NLdobaArqkacRJd5ouESCtUm/Gf/wfd/CRJ6dbR4082A0e3NXh+/zzL9w+Bx2bbjv28BFu5plm7Gbliy8muEOPOcV9+un/3GEH7OHmnGM2d+sdyYjTG/5eCYg+89y/koDppW6zjddz6661arfyloyuwARILSS7ynpHtKwpwwM/juiue2dJ4Yi20MsuiyM6m0vRtWV0RLf6dNUESIvWxuxyBEizuRRdiy4VJVe9HLpUnU2RLWXUJblOHNFF7nZXGRzRXSxipHBEx6DY3QaO6O48rDkc0VaCPctrP55sRZd6MsqzBl3KQ6v3fdGl3hnl3QNdykus9v7oUm0+RbZ2mi4RIE1qyaTkW6HX3Xibc1995TbdeF03oH//tO6cdd4l7tnnX3TzzzfM7b37z91UU03lJk+e7E4960L3yqtvuO8ttKD7zS479Khn/vulW2y6gVt7jZXT7feNecT9+crRbvtk9OhKybdHH3jwMXfpFX9z1Uag9jBa5wpdgQmQ1gmtl90IkPYCKOfmsky/hiM6542tY3cc0XVAyrFLGR3RBEhz3OAau3pdYgRpDUg5NqFLOWDVuWtZpn5Hl+q8oXXuVkZdkkvDEV3nDa6yG47oKmAKrsYRXRBcjWI4omvAKbAJR3QBaL0U0X482RVd6gVYL5vRpV4A5dyMLuUEVsfu6FIdkHLsgi7lgFXnrp2mSwRIk4rxzyefdedf9Je0ivx8x63d0ksumqbfG/u+O/G0c52MCB00aKCbe6453Tvvjq3k9xu+q/vGnLN3q1pPP/uCO+eCy9y8w4a6fYfv4vr161exdfQJv3MzTD+dW2v1ld0d/7jfffLfT9Ppd0Mb3QzmzOgKTIA0J7wqu3tHtGxmBGkVSDlW44jOAavOXXFE1wmqzt38dxMffv91d/7z99VZqvm7ldERTYA0Tj3xukSANA5PdCkOR20FXdI07Gl0yc5QW9Dfxpb1OKI1nfxpHNH5mdUqgSO6Fp1i23BEF+NWrRSO6Gpkiq/Xfjyxgi4VZykl0SUbv7A0uhQSsefRJTtDbQFd0jTipDtNlwiQJvVm3Ifj3dHHn+EmJaNDDz9wDzfbkFkrtWnchx+5cy+83L39znuVdUPn/obbdedt3ZBZZ6msk8SECV+6Aw4/wX355UR31CF7uVlmnqnbdgmKXnv9rekoVBmNKtPr+hGm3XY0ZHQFJkBqAKmKeke0rCJAqsAUTOKILgiuRjEc0TXgFNiEI7oAtBpFtCOaAGkNUDk2eV0iQJoDWo1d0aUacApuQpcKgqtSDF2qAqbgaq1LYgJHdEGQXxfDEW3jF5bGER0SsedxRNsZags4ojWNOGntxxOL6JKNK7pk4xeWRpdCIvY8umRnqC2gS5pGnHSn6VLHBUirVZOJEyemmwYMGJC5y8RkGt5x4z5yQ4bMUpmCN3PHXlbKFL1j//2Bm2P2Ia7/11P59lIk12ZdgQmQ5kJXdWfviJYdCJBWxVT3BhzRdaOqe0cc0XWjqmtHHNF1Yap7J+2IJkBaN7aaO3pdIkBaE1PdG9GlulHVvSO6VDequnZEl+rCVPdOWpekEI7outFl7ogjOhNL4ZU4ogujq1oQR3RVNIU24IguhK1mIe3Hkx3RpZq4et2ILvWKKNcO6FIuXHXtjC7VhanundClulHVvWOn6RIB0rqrRjl21BWYAGmce+Yd0WKNAKmdKY5oO8PQAo7okIgtjyPaxi8srR3RBEhDOsXyXpcIkBbjF5ZCl0Ii9jy6ZGeoLaBLmoY9rXVJrOGItjHFEW3jF5bGER0SsedxRNsZags4ojWNOGntxxOL6JKNK7pk4xeWRpdCIvY8umRnqC2gS5pGnHSn6RIB0jj1pmWs6ApMgDTObfGOaLFGgNTOFEe0nWFoAUd0SMSWxxFt4xeW1o5oAqQhnWJ5r0sESIvxC0uhSyERex5dsjPUFtAlTcOe1rok1nBE25jiiLbxC0vjiA6J2PM4ou0MtQUc0ZpGnLT244lFdMnGFV2y8QtLo0shEXseXbIz1BbQJU0jTrrTdIkAaZx60zJWdAUmQBrntnhHtFgjQGpniiPazjC0gCM6JGLL44i28QtLa0c0AdKQTrG81yUCpMX4haXQpZCIPY8u2RlqC+iSpmFPa10SaziibUxxRNv4haVxRIdE7Hkc0XaG2gKOaE0jTlr78cQiumTjii7Z+IWl0aWQiD2PLtkZagvokqYRJ91pukSANE69aRkrugITII1zW7wjWqwRILUzxRFtZxhawBEdErHlcUTb+IWltSOaAGlIp1je6xIB0mL8wlLoUkjEnkeX7Ay1BXRJ07CntS6JNRzRNqY4om38wtI4okMi9jyOaDtDbQFHtKYRJ639eGIRXbJxRZds/MLS6FJIxJ5Hl+wMtQV0SdOIk+40XSJAGqfetIwVXYEJkMa5Ld4RLdYIkNqZ4oi2Mwwt4IgOidjyOKJt/MLS2hFNgDSkUyzvdYkAaTF+YSl0KSRiz6NLdobaArqkadjTWpfEGo5oG1Mc0TZ+YWkc0SERex5HtJ2htoAjWtOIk9Z+PLGILtm4oks2fmFpdCkkYs+jS3aG2gK6pGnESXeaLhEgjVNvWsaKrsAESOPcFu+IFmsESO1McUTbGYYWcESHRGx5HNE2fmFp7YgmQBrSKZb3ukSAtBi/sBS6FBKx59ElO0NtAV3SNOxprUtiDUe0jSmOaBu/sDSO6JCIPY8j2s5QW8ARrWnESWs/nlhEl2xc0SUbv7A0uhQSsefRJTtDbQFd0jTipDtNlwiQxqk3LWNFV2ACpHFui3dEizUCpHamOKLtDEMLOKJDIrY8jmgbv7C0dkQTIA3pFMt7XSJAWoxfWApdConY8+iSnaG2gC5pGva01iWxhiPaxhRHtI1fWBpHdEjEnscRbWeoLeCI1jTipLUfTyyiSzau6JKNX1gaXQqJ2PPokp2htoAuaRpx0p2mSwRI49SblrGiKzAB0ji3xTuixRoBUjtTHNF2hqEFHNEhEVseR7SNX1haO6IJkIZ0iuW9LhEgLcYvLIUuhUTseXTJzlBbQJc0DXta65JYwxFtY4oj2sYvLI0jOiRiz+OItjPUFnBEaxpx0tqPJxbRJRtXdMnGLyyNLoVE7Hl0yc5QW0CXNI046U7TJQKkcepNy1jRFZgAaZzb4h3RYo0AqZ0pjmg7w9ACjuiQiC2PI9rGLyytHdEESEM6xfJelwiQFuMXlkKXQiL2PLpkZ6gtoEuahj2tdUms4Yi2McURbeMXlsYRHRKx53FE2xlqCziiNY04ae3HE4voko0rumTjF5ZGl0Ii9jy6ZGeoLaBLmkacdKfpEgHSOPWmZazoCkyANM5t8Y5osUaA1M4UR7SdYWgBR3RIxJbHEW3jF5bWjmgCpCGdYnmvSwRIi/ELS6FLIRF7Hl2yM9QW0CVNw57WuiTWcETbmOKItvELS+OIDonY8zii7Qy1BRzRmkactPbjiUV0ycYVXbLxC0ujSyERex5dsjPUFtAlTSNOutN0iQBpnHrTMlZ0BSZAGue2eEe0WCNAameKI9rOMLSAIzokYsvjiLbxC0trRzQB0pBOsbzXJQKkxfiFpdClkIg9jy7ZGWoL6JKmYU9rXRJrOKJtTHFE2/iFpXFEh0TseRzRdobaAo5oTSNOWvvxxCK6ZOOKLtn4haXRpZCIPY8u2RlqC+iSphEn3Wm6RIA0Tr1pGSu6AhMgjXNbvCNarBEgtTPFEW1nGFrAER0SseVxRNv4haW1I5oAaUinWN7rEgHSYvzCUuhSSMSeR5fsDLUFdEnTsKe1Lok1HNE2pjiibfzC0jiiQyL2PI5oO0NtAUe0phEnrf14YhFdsnFFl2z8wtLoUkjEnkeX7Ay1BXRJ04iT7jRdIkAap960jBVdgQmQxrkt3hEt1giQ2pniiLYzDC3giA6J2PI4om38wtLaEU2ANKRTLO91iQBpMX5hKXQpJGLPo0t2htoCuqRp2NNal8QajmgbUxzRNn5haRzRIRF7Hke0naG2gCNa04iT1n48sYgu2biiSzZ+YWl0KSRiz6NLdobaArqkacRJd5ouESCNU29axoquwARI49wW74gWawRI7UxxRNsZhhZwRIdEbHkc0TZ+YWntiCZAGtIplve6RIC0GL+wFLoUErHn0SU7Q20BXdI07GmtS2INR7SNKY5oG7+wNI7okIg9jyPazlBbwBGtacRJaz+eWESXbFzRJRu/sDS6FBKx59ElO0NtAV3SNOKkO02XCJDGqTctY0VXYAKkcW6Ld0SLNQKkdqY4ou0MQws4okMitjyOaBu/sLR2RBMgDekUy3tdIkBajF9YCl0Kidjz6JKdobaALmka9rTWJbGGI9rGFEe0jV9YGkd0SMSexxFtZ6gt4IjWNOKktR9PLKJLNq7oko1fWBpdConY8+iSnaG2gC5pGnHSnaZLBEjj1JuWsaIrMAHSOLfFO6LFGgFSO1Mc0XaGoQUc0SERWx5HtI1fWFo7ogmQhnSK5b0uESAtxi8shS6FROx5dMnOUFtAlzQNe1rrkljDEW1jiiPaxi8sjSM6JGLP44i2M9QWcERrGnHS2o8nFtElG1d0ycYvLI0uhUTseXTJzlBbQJc0jTjpTtMlAqRx6k3LWNEVmABpnNviHdFijQCpnSmOaDvD0AKO6JCILY8j2sYvLK0d0QRIQzrF8l6XCJAW4xeWQpdCIvY8umRnqC2gS5qGPa11SazhiLYxxRFt4xeWxhEdErHncUTbGWoLOKI1jThp7ccTi+iSjSu6ZOMXlkaXQiL2PLpkZ6gtoEuaRpx0p+kSAdI49aZlrOgKTIA0zm3xjmixRoDUzhRHtJ1haAFHdEjElscRbeMXltaOaAKkIZ1iea9LBEiL8QtLoUshEXseXbIz1BbQJU3Dnta6JNZwRNuY4oi28QtL44gOidjzOKLtDLUFHNGaRpy09uOJRXTJxhVdsvELS6NLIRF7Hl2yM9QW0CVNI06603SJAGmcetMyVnQFJkAa57Z4R7RYI0BqZ4oj2s4wtIAjOiRiy+OItvELS2tHNAHSkE6xvNclAqTF+IWl0KWQiD2PLtkZagvokqZhT2tdEms4om1McUTb+IWlcUSHROx5HNF2htoCjmhNI05a+/HEIrpk44ou2fiFpdGlkIg9jy7ZGWoL6JKmESfdabpEgDROvWkZK7oCEyCNc1u8I1qsESC1M8URbWcYWsARHRKx5XFE2/iFpbUjmgBpSKdY3usSAdJi/MJS6FJIxJ5Hl+wMtQV0SdOwp7UuiTUc0TamOKJt/MLSOKJDIvY8jmg7Q20BR7SmESet/XhiEV2ycUWXbPzC0uhSSMSeR5fsDLUFdEnTiJPuNF0iQBqn3rSMFV2BCZDGuS3eES3WCJDameKItjMMLeCIDonY8jiibfzC0toRTYA0pFMs73WJAGkxfmEpdCkkYs+jS3aG2gK6pGnY01qXxBqOaBtTHNE2fmFpHNEhEXseR7SdobaAI1rTiJPWfjyxiC7ZuKJLNn5haXQpJGLPo0t2htoCuqRpxEl3mi4RII1Tb1rGiq7ABEjj3BbviBZrBEjtTHFE2xmGFnBEh0RseRzRNn5hae2IJkAa0imW97pEgLQYv7AUuhQSsefRJTtDbQFd0jTsaa1LYg1HtI0pjmgbv7A0juiQiD2PI9rOUFvAEa1pxElrP55YRJdsXNElG7+wNLoUErHn0SU7Q20BXdI04qQ7TZcIkMapNy1jRVdgAqRxbot3RIs1AqR2pjii7QxDCziiQyK2PI5oG7+wtHZEEyAN6RTLe10iQFqMX1gKXQqJ2PPokp2htoAuaRr2tNYlsYYj2sYUR7SNX1gaR3RIxJ7HEW1nqC3giNY04qS1H08soks2ruiSjV9YGl0Kidjz6JKdobaALmkacdKdpksESOPUm5axoiswAdI4t8U7osUaAVI7UxzRdoahBRzRIRFbHke0jV9YWjuiCZCGdIrlvS4RIC3GLyyFLoVE7Hl0yc5QW0CXNA17WuuSWMMRbWOKI9rGLyyNIzokYs/jiLYz1BZwRGsacdLajycW0SUbV3TJxi8sjS6FROx5dMnOUFtAlzSNOOlO0yUCpHHqTctY0RWYAGmc2+Id0WKNAKmdKY5oO8PQAo7okIgtjyPaxi8srR3RBEhDOsXyXpcIkBbjF5ZCl0Ii9jy6ZGeoLaBLmoY9rXVJrOGItjHFEW3jF5bGER0SsedxRNsZags4ojWNOGntxxOL6JKNK7pk4xeWRpdCIvY8umRnqC2gS5pGnHSn6RIB0jj1pmWs6ApMgDTObfGOaLFGgNTOFEe0nWFoAUd0SMSWxxFt4xeW1o5oAqQhnWJ5r0sESIvxC0uhSyERex5dsjPUFtAlTcOe1rok1nBE25jiiLbxC0vjiA6J2PM4ou0MtQUc0ZpGnLT244lFdMnGFV2y8QtLo0shEXseXbIz1BbQJU0jTrrTdIkAaZx60zJWdAUmQBrntnhHtFgjQGpniiPazjC0gCM6JGLL44i28QtLa0c0AdKQTrG81yUCpMX4haXQpZCIPY8u2RlqC+iSpmFPa10SaziibUxxRNv4haVxRIdE7Hkc0XaG2gKOaE0jTlr78cQiumTjii7Z+IWl0aWQiD2PLtkZagvokqYRJ91pukSANE69aRkrugITII1zW7wjWqwRILUzxRFtZxhawBEdErHlcUTb+IWltSOaAGlIp1je6xIB0mL8wlLoUkjEnkeX7Ay1BXRJ07CntS6JNRzRNqY4om38wtI4okMi9jyOaDtDbQFHtKYRJ639eGIRXbJxRZds/MLS6FJIxJ5Hl+wMtQV0SdOIk+40XSJAGqfetIwVXYEJkMa5Ld4RLdYIkNqZ4oi2Mwwt4IgOidjyOKJt/MLS2hFNgDSkUyzvdYkAaTF+YSl0KSRiz6NLdobaArqkadjTWpfEGo5oG1Mc0TZ+YWkc0SERex5HtJ2htoAjWtOIk9Z+PLGILtm4oks2fmFpdCkkYs+jS3aG2gK6pGnESXeaLhEgjVNvWsaKrsAESOPcFu+IFmsESO1McUTbGYYWcESHRGx5HNE2fmFp7YgmQBrSKZb3ukSAtBi/sBS6FBKx59ElO0NtAV3SNOxprUtiDUe0jSmOaBu/sDSO6JCIPY8j2s5QW8ARrWnESWs/nlhEl2xc0SUbv7A0uhQSsefRJTtDbQFd0jTipDtNlwiQxqk3LWNFV2ACpHFui3dEizUCpHamOKLtDEMLOKJDIrY8jmgbv7C0dkQTIA3pFMt7XSJAWoxfWApdConY8+iSnaG2gC5pGva01iWxhiPaxhRHtI1fWBpHdEjEnscRbWeoLeCI1jTipLUfTyyiSzau6JKNX1gaXQqJ2PPokp2htoAuaRpx0p2mSwRI49SblrGiKzAB0ji3xTuixRoBUjtTHNF2hqEFHNEhEVseR7SNX1haO6IJkIZ0iuW9LhEgLcYvLIUuhUTseXTJzlBbQJc0DXta65JYwxFtY4oj2sYvLI0jOiRiz+OItjPUFnBEaxpx0tqPJxbRJRtXdMnGLyyNLoVE7Hl0yc5QW0CXNI046U7TJQKkcepNy1jRFZgAaZzb4h3RYo0AqZ0pjmg7w9ACjuiQiC2PI9rGLyytHdEESEM6xfJelwiQFuMXlkKXQiL2PLpkZ6gtoEuahj2tdUms4Yi2McURbeMXlsYRHRKx53FE2xlqCziiNY04ae3HE4voko0rumTjF5ZGl0Ii9jy6ZGeoLaBLmkacdKfpEgHSOPWmZazoCkyANM5t8Y5osUaA1M4UR7SdYWgBR3RIxJbHEW3jF5bWjmgCpCGdYnmvSwRIi/ELS6FLIRF7Hl2yM9QW0CVNw57WuiTWcETbmOKItvELS+OIDonY8zii7Qy1BRzRmkactPbjiUV0ycYVXbLxC0ujSyERex5dsjPUFtAlTSNOutN0iQBpnHrTMlZ0BSZAGue2eEe0WCNAameKI9rOMLSAIzokYsvjiLbxC0trRzQB0pBOsbzXJQKkxfiFpdClkIg9jy7ZGWoL6JKmYU9rXRJrOKJtTHFE2/iFpcvqiH507OvhpbRM/n+fT3BzDJrezTHNDOk5zTj9tK5//6la5vzKdiI4ouPfMe3HE+voko0xumTjF5Yuqy6F19FKeQKkce8GuhSXp1jrNF0iQBq/DvWpRV2BCZDGuRXeES3WCJDameKItjMMLeCIDonY8jiibfzC0toRTYA0pFMs73WJAGkxfmEpdCkkYs+jS3aG2gK6pGnY01qXxBqOaBtTHNE2fmHpsjqid7z5IvfZxAnh5bRM3uuSnBABUtttwRFt45dVWvvxZDu6lEWp/nXoUv2s6tmzrLpUz7X11T4ESOOSR5fi8hRrnaZLBEjj16E+tagrMAHSOLfCO6LFGgFSO1Mc0XaGoQX/wD/qqdvdC+PHhptbJj986bXdKnMv4C557kE3+uUnWua8whPBER0SseW1I5oAqY2lL+11iQCpJ2L7iy7Z+GWVRpeyqBRfhy4VZ5dVUuuSbMcRnUWp/nU4outnVc+eZXVEEyCt5+62xz44ouPfR+3HE+voko0xumTjF5Yuqy6F19FKeQKkce8GuhSXp1jrNF0iQBq/DvWpRV2BCZDGuRXeES3WCJDameKItjMMLeCIDonY8jiibfzC0toRTYA0pFMs73WJAGkxfmEpdCkkYs+jS3aG2gK6pGnY01qXxBqOaBtTHNE2fmHpsjqiCZCGd7J98zii499b7ccT6+iSjTG6ZOMXli6rLoXX0Up5AqRx7wa6FJenWOs0XSJAGr8O9alFXYEJkMa5Fd4RLdYIkNqZ4oi2Mwwt4IgOidjyOKJt/MLS2hFNgDSkUyzvdYkAaTF+YSl0KSRiz6NLdobaArqkadjTWpfEGo5oG1Mc0TZ+YemyOqIJkIZ3sn3zOKLj31vtxxPr6JKNMbpk4xeWLqsuhdfRSnkCpHHvBroUl6dY6zRdIkAavw71qUVdgQmQxrkV3hEt1giQ2pniiLYzDC3giA6J2PI4om38wtLaEU2ANKRTLO91iQBpMX5hKXQpJGLPo0t2htoCuqRp2NNal8QajmgbU+2IFl0aN+FT13+q/jajDSo913Qzuu0XXqFB1uOYLasjmgBpnPvvrcgnSd779D8+21J/J0+e7GYdOK3bcv6l3MPvv+4eG/em69+/Ndu8gNt32XVbil/WyWg/nmxHl7Io1b9O65KUKosf74F3X63/Ipu451dfTXYTJ05yv/7eaulR+/efKv2WcxNPoe0ORYA07i0lQBqXp1jrNF0iQBq/DvWpRV2BCZDGuRXeES3WytKxOv3xO+JcfAOs4IiODxVHdFymOKLj8tSOaAKkcdh6XSJAGocnuhSHo7aCLmka9jS6ZGeoLWhdkvU4ojWd/GntiC6LLuW/yuaVIEDaGNZel8T6jNNPmwT0pmrMgSJZlQDp6JefiGQtvpmy6VJ8AnEtaj+eWEaXbHy1Lokl/Hg2nlLaPy9JmgCpULAtBEht/MLSBEhDIvZ8p+kSAVJ7nWkpC7oCEyCNc2u8I1qs0bGyM/Udq7GffeIOfeR6u8EGWZh2wEB38QY7pdbL8kb0qKdudy+MH9sgInazw5de260y9wKOB347S7Gw6GxD3eErbuTe+fRjt+edV8Qx2gAr2hFNgDQOYK9LZXFE3/v2S44Xd+z3Hl2yMwwtoEshEVu+jLokV4wj2nbftSO6LLpku+LGliZA2hi+BEjjciVAGpen9uOJZXTJxlfrkljCj2fjKaW9H0/SBEiFgm0hQGrjF5YmQBoSsec7TZcIkNrrTEtZ0BWYAGmcW+Md0WKNjpWdqe9YESC1s/QW/AM/AVJPxPa3bA/8BEht91uXPmPNbdxc083kjnzgBvf0uHf0ppZKe10qiyOaAGmc6kOANA5HbYUAqaZhTxMgtTMsowXtiC6LLrUyZwKkjbk7/nlJrDOC1M64bM9L9iturAXtx5MjESC18da6JJbw49l4Smnvx5M0AVKhYFsIkNr4haUJkIZE7PlO0yUCpPY601IWdAUmQBrn1nhHtFijY2Vn6jtWBEjtLL0F/8BPgNQTsf0t2wM/AVLb/dalCZBqGvb0DxdYIv3WGwFSO0uxQIA0DkdthQCppmFPlzFA+r+JE9zMM05nv/gGWphu6kENtG43rR3RBEjtPHWAVOqnOKJnmG4au+EGWfD1sywz7ggGAqT2ylC25yX7FTfWgvbjyZEIkNp4a10SS/jxbDyltPfjSZoAqVCwLQRIbfzC0gRIQyL2fKfpEgFSe51pKQu6AhMgjXNrCJDG4eit+I4VAVJPxP6XAKmdobZQtgd+AqT67tnSBEht/MLSBEhDIrY8AVIbv6zSBEizqBRfV8YAaVmel4rflcaX1I5oAqR23jpAyvOSnae34J+XJE+A1FMp/rdsz0vFr7Q5JbUfT45IgNTGXeuSWCJAauMppb0fT9IESIWCbSFAauMXliZAGhKx5ztNlwiQ2utMS1nQFbgsD/xlmcpQbjQdK3t19x0rHvjtLL0F/8DPCFJPxPa3bA/8BEht91uXJkCqadjTBEjtDLUFAqSaRpw0AdI4HL2VMgZIy/JtbM+4Ff9qRzQBUvsdIkBqZ5hlwT8vyTYCpFmE8q0r2/NSvqtr/t7ajydHJ0Bquwdal8QSfjwbTynt/XiSJkAqFGwLAVIbv7A0AdKQiD3fabpEgNReZ1rKgq7ABEjj3BpGkMbh6K34jhUBUk/E/tc/8BMgtbMUC2V74CdAGue+ixUCpPFYiiUCpHF5EiCNy1OsESCNy7SMAdKyPC/FvVNxrWlHNAFSO1sCpHaGWRb885JsI0CaRSjfurI9L+W7uubvrf14cnQCpLZ7oHVJLBEgtfGU0t6PJ2kCpELBthAgtfELSxMgDYnY852mSwRI7XWmpSzoClyWB35GkMatQnzrLQ5PHNFxOGorOKI1DXu6jI7osozUKYsulcURjS7Z27tYQJficNRW0CVNw54uoy6V5XnJfncaZ0E7osuiS42jYbdMgNTOMMsCAdIsKsXXESAtzi6rpPbjyXYCpFmU6l+ndUlKESCtn121PQmQViNTbD0B0mLcqpUiQFqNTPH1naZLBEiL15WWLKkrcFke+MviiJYbTsfKXu19x4oRpHaW3oJ/4GcEqSdi+1u2B35GkNruty7NCFJNw55mBKmdobZAgFTTiJMmQBqHo7dCgNSTiPfX61I8i/EtaUc0AVI7XwKkdoZZFvzz0q1vPecGDxroppqqX9ZupnVfffWVqbwUHjLN9G6VuRdwlzz3oBv98hNme40yULbnpUZxiGVX+/HEJgFSG1mtS9LmBw4c4Ab0728zmlE6RpsXs5susIQrywulcr5lGUF6/StPyulGX2Lc988nfOmWmGWom2OaGdLzK8PMBtFBRjSoA6QPv/+6+2TSF27g1AMiHmGKqRj3XixJmxc/3qNjX49+jmIwxnl+9vmEdHY9f4LtrksESP2dbpO/umNFgDTOTWWK3TgcvRUCpJ5EvL/+gZ8AaRymZXvgJ0Aa576LFe+ILsuLO2VxRJflgZ8Xd+K1JXQpHkuxhC7F5TnNgKnd6SttlRoty/NSXAJxrWlHdFl0KS6BuNYIkMbl6a2hS55EnL9l06U4V904K9qPJ0dpd0d040hOsVxGXSrL85IQLkuAdMebL3KfTZzQ6OpW2L7XJTFAgLQwxrRgGCA9//n7bAYbWLqML5QKjnbXJQKkDaz0fWFad6zK8sBfFke03E9GkNprNQFSO8PQgu9YESANyRTLl+2BnwBpsfucVYoAaRaV4usYQVqcXVZJRpBmUbGtYwSpjV9YuowP/GV5XgpZt1K+jI7oVuIXngsB0pBInDzPS3E4eitle17y592qf7UfT86x3R3Rjb4PZdQlAqTxawUB0vhMW9WiDpA+lIwgvYAAqflW6RdKxVi76xIBUnOVaS0DumNVlgd+AqRx61BZOlaM1Il333ngj8dSLJXtgZ8Aabz7T4A0HkuxRIA0Lk8CpHF5ijUCpHGZljFAWpZvY8e9U3GtldERHZdAXGsESOPy9NZ4XvIk4vwt2/NSnKtunBXtx5OjtLsjunEkp1guoy6VxY8nhBlBGqcGe10Sa4wgtTHVAVKZYpcRpDaeUpoAqZ0hFvqQgO5YESCNcyOYYjcOR2+FEaSeRLy/vmPFCNI4TMv2wE+ANM59FysESOOxFEsESOPyJEAal6dYI0AalykB0rg8xZrXpfiW41ksoyM63tXHt0SAND5TscjzUlyuZXteinv18a1pP55YJ0BqY1xGXSJAarvnWaUZQZpFpT3XESCNf18JkMZnisUmEtAdKwKkccATII3D0VshQOpJxPvLA388lmKpbA/8BEjj3X/viC7LzAZl+dZbWR74mdkgXltCl+KxFEvoUlye+oG/LCNIRZfGf/G/uCAiWZv81Vduo2GLuuVmn9eVSZeufvGxSATimvnK9XMzDBjo9l5sbYcuxWOLLsVjKZbKqEsnPXxLXAgRrU2aPNkduczGFYtlCJCiS5XbZUqU8YXSs5+92/Wfqp/puhtZ+NQ1tk7NEyBtJOXWsq0DpEyxG+fe6OclsVgGXbJcOVPsWui1YFkCpPFvCgHSuEwJkMblKdZ44I/LtIwP/HveeUVcCBGt6Y5VmRzRT497JyKFuKa8LpXJEX3643fEhRDRGroUEebXptCluEzRpbg80aW4PMUauhSXKboUl6dYQ5fiMkWX4vLUuiSWy+CI5oXSOHWgjAHSQx+5Ps7FN8BKGWfcEQxMsWurDDpAyhS7Npa+dBl1yZ97kb8ESItQa+EyBEjj3xz/wC+Wp51mkBs0cOr4B4lokZE6cWCWsWPFFLtx7j0P/HE4eiu6Y0WA1FOx/fW6RIDUxtGXxhHtScT7iyM6HkuxhC7F5YkuxeUp1tCluEzRpbg8xRq6FJcpuhSXp9YlsUyA1M4XXbIz1BbQJU0jTtrrklgjQGpjSoDUxi+rdBl1Kes66l1HgLReUiXZjwBp/BvlO1ZimQCpnS8dKzvD0ILvWBEgDckUy/PAX4xbtVK6Y0WAtBqlfOu9LhEgzcet2t7oUjUyxdejS8XZZZVEl7KoFF+HLhVnV60kulSNTLH16FIxbrVKoUu16OTfhi7lZ1arhNYl2Y8AaS1a9W1Dl+rjVO9e6FK9pOrfz+uSlCBAWj+3rD0JkGZRsa0roy5ZrpgAqYVeC5YlQBr/pviO1cv/+cANGjS1Gzj1gPgHiWTxu7PM6RhBGgcmI0jjcNRWhi+9tltl7gXcJc896Ea//ITe1FJpHvjj3g7dsSJAGoet1yUCpHF48sAfh6O24h/4eXFHUymeRpeKs8sqiS5lUbGtQ5ds/MLS6FJIxJ5Hl+wMtQV0SdOwp7Uuid9phumnsRttkIUZBw52c003k2OK3TiAmWI3DkdvpYx+PGnz00072E3Vwt91FV9zKy8ESOPfHa1LYr0ML+5YKLR1gPTLiRPd6Btvc8889y/3/gcfutlnm9UtsvB33KYbreOmHlBfkCuvjX/c+6C77c573fiPP3Hf/ta8bsfttnCzzDxTt3v06ONPuRtuvsN9f+Xl3Fqrr9xtmzVDgNRKsGd5Hvh7MrGs4YHfQi+7LA/82VyKruWBvyi57HK6Y0WANJtR3rXoUl5itfdHl2rzKbIVXSpCrXoZdKk6myJb0KUi1GqXQZdq88m7FV3KS6z3/dGl3hnl2QNdykOr9321Lu1x/1Xu80lf9l6oj/Y4Y81tCJBGZE+ANCLMxFQZA6RleaE07p2Ka40AaVyeYk3rkuQJkAqFEi6ff/6FO+XMP7i333kvPftBgwa6L76YkKaHzv0Nt/fuP3eDBw+qeWV5bTz97AvunAsuS0YZDnTzfHNu9+LLr7khs87ijjpkr8pxPv7PJ+6Qo0a5/lNN5Y45fISbfrppK9tiJAiQxqDY3QYP/N15WHM88FsJ9izPA39PJpY1PPBb6PUsqztWBEh78imyBl0qQq16GXSpOpuiW9ClouSyy6FL2VyKrkWXipKrXg5dqs6myBZ0qQi12mXQpdp88m5Fl/ISq70/ulSbT5Gt6FIRatXLoEvV2RTdUjZdKnqdzShHgDQ+Za1LYp0AaXzGTbF4+VWj3b0PPJJMTTGd22+vXd2ss8zsPvxovDvx1HPdJ//91K260rJu2602rXkueW1c/Oer3UOPPOEOGrGbkyDs2edfkoxefdGNPGJfN9OMM6THOvmM892rr73pdt15O7f4ogvVPH6RjQRIi1CrXYaOVW0+ebfSscpLrPf9y9axYord3u9pPXssOttQd/iKG7l3Pv3Y7XnnFfUU6ZN9dMeKAGmcW4AuxeHoraBLnkS8v+hSPJZiCUd0XJ5alxipE4ctuhSHo7eCLnkS8f6iS/FYiiV0KS5PdCkuT7GGLsVlii7F5SnWyqZL8QnEs0iANB5Lb0nrkqwjQOrJlOivjBQdcfBIN3nyZHfEQcPTqXX96ctUu0eMPC2Z23sqN2rkQW7gwIF+U7e/RWycdtaF6ajRM0cd6fr16+euvf7WdLrd/ZMA7TzDhrq77hnjrrr2JrfMkou6nXfcutvxYmUIkMYi2WWHjlUXixgpOlYxKHa3UbaOFQHS7vevaI4AaVFy1csxZVR1NkW2MGVUEWrVyzBlVHU2Rbfwbeyi5LLLoUvZXCxr0SULvZ5l0aWeTCxr0CULveyy6FI2l6Jr0aWi5KqXQ5eqsymyBV0qQq16GXSpOpuiW7wuFS3fjHIESONTJkAan2nTLT786JPuosv+6oYNncsdsM+vexz/+FHnuDffftfttP2WbrmlF++xXVYUsXHpFX9zDzz4mBux5y/d/PMOc6cmU/y+9Mrr7oSjD3CfffZ5GpidZvBgd2wyta5Mw9uIhQBpfKoESOMyJUAal6dYI0AalylvRMflqTtWjCCNwxZdisPRW0GXPIl4f9GleCzFEroUl6fWJUaQxmGLLsXh6K2gS55EvL/oUjyWYgldistT6xLPS3HYoktxOHor6JInEe9vGXXpv19+EQ9AREuTJ012A/v1d1vOv5R7+P3X3fnP3xfRelxTZXxxRwgwgjRuPWiKtZtuvcvdePMdbqP113QbJv/C5aZb7nQ3Jv822mAtt+F6a4Sb03wRGy++9Ko77ew/pqNTh8w6s5PRqvItUpni99iTznLvvvdvN3y3n7kFvz1/5jFjrCRAGoNidxt0rLrzsOboWFkJ9ixfxo7V6Jef6HkhLbKGB/64N4IH/rg8xRq6FJcpuhSXp1hDl+IyRZfi8kSX4vIUa+hSXKboUlyeYg1dissUXYrLE12Ky1OsoUtxmaJLcXmKNXQpLlN0KS5PrUtimQBpXL5NseZHcm639aZulRWX7XHM+8Y84v585Wi30gpLu+232azHdllR1MZjTzzj7rz7gfR7p99d8Ftuy81+4O66e0wakF1tleXdNj/aOPN4sVYSII1FsssOHasuFjFSdKxiUOxug45Vdx7WHB0rK8Hu5XXHijeiu7MpmkOXipLLLocuZXOxrEWXLPR6lkWXejKxrEGXLPSyy6JL2VyKrkWXipKrXg5dqs6myBZ0qQi16mW0LjGzQXVOebagS3lo9b4vutQ7o7x7oEt5idXeH12qzSfvVq1LUpYAaV6CLbD/2edf4p557kW3y8+2dUsstnCPM3riqefceX+83C2y8IJut1/u0GO7rIhhQ+y89fZ77rhRZ7uZZpzBHXXIXm7AgAGyumELAdL4aOlYxWVKxyouT7FGxyouUzpWcXnqjhUB0jhs0aU4HL0VdMmTiPcXXYrHUiyhS3F5al3CER2HLboUh6O3gi55EvH+okvxWIoldCkuT3QpLk+xhi7FZYouxeUp1tCluEzRpbg8tS6JZQKkcfk2xZp8f1S+IbrDtlu4FZdbsscxxzz8T3fJ5de45ZZZ3O30ky17bJcVMWxMnDTJHTnytGQ06cdu/2Sa3SFDZnVjHnrcvfbGW27eYUPdissv5aafbtrM4xddWaYAaUUMnrzdvfDx2KKX3PByZelYeTF4KJlv/YIWnm+9LB0rLQatHtSptKWnkrY0nrZk/VHwbanVv11AW7Le6Z7laUs9mVjW+LaELlkodpVFl7pYxEqVrY+HLsW587ottXqAtKJLPC9FufnoUhSMFSO6LfG8VMFiSqBLJnw9CpfxeQld6nEbC60oW1vieanQbe5RCF3qgcS8omxtiecl8y1PDei2JCsIkMbh2lQro2+6zd1y293uhxut69Zb+/s9jn3r7fe46278u1t/ndXcphuu02O7rIhh46prb3J33TPGbbDO6m6D9VZ3x554ZvpdUn/A2Web1R283+5u6gaMKtWBUn88/kIAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCECgGoF2D4z66+73VbL4TLv8vfeBh93lV11fdQpdP33utltt4lZdabnMy7baeOmV192pZ/7BzTH7EHfo/r91z73wcjptr4xa3eHHm7vLrrzOPZiMZJUpfmWqXxYIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQKDxBNoyQDr+4/+4g488OaU3auTBbvDgQRWSn3/+hdvnoGPT/LGHj3AzzzRjZZtOWGx88cUEd+gxp7hPP/2fO+yAPdycc8zmbr0jGbV6w98rAdFnnvtXEjC91G228Xpu3bVW1YcmDQEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEINIhAWwZIhdVZ513inn3+RTf/fMPc3rv/3E011VRu8uTJ7tSzLnSvvPqG+95CC7rf7LJDinVS8q3Q6268zblkMO2mG6/rBvTvn67PYyMt8PV//vulW2y6gVt7jZXTtfeNecT9+crRbvtk9OhKybdHH3jwMXfpFX9ztUaxapukIQABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABO4G2DZC+N/Z9d+Jp5zoZzTlo0EA391xzunfeHVvJ7zd8V/eNOWdPCf7zyWfd+Rf9JU3/fMet3dJLLpqm89jwt+LpZ19w51xwmZt32FC37/BdXL9+/Sq2jj7hd26G6adza62+srvjH/e7T/77aTr9rj8Pb4O/EIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIBAYwi0bYBUcI378CN37oWXu7ffea9Cb+jc33C77rytGzLrLJV14z4c744+/gw3KRlheviBe7jZhsyqttVnQwpMmPClO+DwE9yXX050Rx2yl5tl5pkqdiQhQdFrr781HckqI1plel0/wrTbjmQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAIGGEGjrAKknNjGZQnfcuI/ckCGzVKbP9dv834kTJ6bJAQMG+FXd/tZjo1uBKhmZ5nfsvz9wc8w+xPX/eirfKruyGgIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQiEygIwKkkZlhDgIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQKCkBAqQlvXGcNgQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgkJ8AAdL8zCgBAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQiUlAAB0pLeOE4bAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhDIT4AAaX5mlIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABEpKgABpSW8cpw0BCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCOQnQIA0PzNKQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACJSVAgLSkN47ThgAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAE8hMgQJqfGSUgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAIGSEiBAWtIbx2lDAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAL5CRAgzc+MEhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAQEkJECAt6Y3jtCEAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAgfwECJDmZ0YJCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCECgpAQIkJb0xnHaEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIBAfgIESPMza9kSL7z4irv9rvvcS6+8np7jt781r1t7jVXcdxf8Vsuec+wT++yzz90V19zgXn/jbfedb8/vtt1q07oO8Y97H3QPP/ZkWm6G6adLy26y4TpuyKwzZ5Yf9+F4d/1Nt7l/vfSq++S/n7p55xnqllt6cbf6qitk7i8r8x6jqqEmbPjiiwnuxpvvcM/962X33tj33WxDZnELf/fbbqP113TTTTdt3WeQt05+OXGiG33jbe6Z5/7l3v/gQzf7bLO6RRb+jtt0o3Xc1AMGZB437zEyjTRhpZznXXePca++/qb79H+fufnm/aZbYtGFkza6suvXr19dZ9AMPkWOUdfJN3inv99xr7v/wUdTlgfs/Ws3cODUdR0xb7ts17Z/590PuLvve6gqM/ktld/U3hZ4did0/4OPuYce+ad77fW33ODBg9y35p/HbbDOam6eYUO771gl14z6VuQYVU63Yas//Ohj97vfX9Sr/U0T3V5qiUUy9ytync2oz5kn26SVLyZ9mDvvGZP2Gyckuj9s2Nxu6YTfmqutVPcZwLUL1Tvv/tvdc/9DSR/mRffR+I/TPuSySd9ww/XWcFNNNVXXjjVSRTQ4bz+oyDFqnHK0TfX04WOdezPadt5jRAMZGPrqq6/cLbff7R58+J9u6qmndgeN2C3YY0r2qWdecKOTZ5uJSV/8lzv92M0915yZ++mVndb+5Zno8qtGu/988l+37lrfdyuvsLTGkaal/d97/8PuxZdfc5O/muzkeXzF5ZdOf1t77FxlRZF6XsbfgXrrprSlx594Ju1LDUieBxdImK6y4jJu8UUXqkKw5+pm8Ml7jJ5naV+Ttx1/+un/3OnnXOS+/PJL9/2Vl3Nrrb5yXSfRKW2/tzo6adIkd+xJZznZL2uZ6xtzuF1+tm3Wpm7rOqXNy0XXU0elD3XjLXe6FxJf1PiPP3HfnPsbbrGkvcszVL39qbztsRn3oNtNj5ypxlV+O0Xbe1t++6ud3KyzzJS5Wyex7K3NCyDpJ92Q+Eqff+Fl9/a7Y93MM82Q6tIP1l3DzTnHbJkMs1bm7Sc243c36zyt6+rpOz397L9Sn8nzic9UngeGJn3Qddda1S2z1GJ1H74ZfIoco+4LqGNH8dn988ln07jFtNNOk/rn1l5zFTds6FyZpfO23SwjeW2U+beUAGlWDSjhukcee8r98dKr0jP3nYbJkyen+Z9tv5Vbdun6f1hKePnpKT/59PPuosv+6iS4J8s835zb7b/3r9J0tf9EAP/y1+vdvQ88ku4iQThp0LIMGjTQjdhjl8RBMEea9/+JA+zkM86rHEeXWXWlZd2Pt9ykW8CryDH8sfrirzwonXzG+e7f749LDy/1ydelmWacIWUqf3tb8tbJzz//wp1y5h/c2++8l5oW/v5eDk06xXvv/vM0wKCPm/cYumwz07fcdnelYxq2z6WXXNTtvMNW3epM1rk1g0+RY2Sda7PXjf33B+6o48+oHHbUcQe7wYMGVfJZiSLtsp3b/nl/vNw98dRzWajSdbvuvF1NRxQ8e6K7+rqb3R3/uD/doH9HJS3OksUW+W7PQmpNM+pb3mOo02tqMmzj1Q6+1eYbujW+v2KPzXmvsxn1ucdJNnnFmCRYcsnl11SOquvokot/z/18x617dULBtYIv6buMdcefck6lv6R5Dpl1Fnfwvr9J+5VdJXqmimhw3n5QkWP0PNP4a+rpw8c492a07SLHiE90ikVxSom+y2+oX8465SifTP/+77PP3J+vHJ0GoPyG4b/Z2S24wHw+m/m3k9q/3FPpy1//f7dXWKyfOOrlpRy93DfmkZSlXufTm228Xurs8/lqf4vU8zL+DtRTN+WZ/IKL/uLEcSqLfuaWvDxzS1Cvt6UZfPIeo7dzzru9aDu+4OIrKm1f/Bj1vFzeKW2/njr6wbgP3eHHnlb1dsnL3kccNLzqdtnQKW2+3joqPqgTTz3Xffb55yk33Z+SF05+s8uOvb4Inbc9NuMe1KwEho29cb0reRHyqmtv6vUIhx2wR2Zwr5NY1tPmZaDDqYnP8t33/t2jfopG7fHrndIXomsBL9JPbMbvbq1zLrKt3r5T+Eyqj7XcMou7nX6ypV6VmW4Gn7zHyDzRgiuF5cV/vto9/OiTqQX9uyhpqXdhvz1v2806tbw2yvxbKtdPgDSrFpRsnYxgPOCwE9KzlpF26665apr++533pqPxJHP8Ufs7GRnZrosERv2Phbw98ebb79YVIJW3L85PHrxk+e2vfuoW+s4C7vMvvnB/uPhK9+zzLyZv/8/ijjpkr27YDjvmVDfuw4/c9xZa0P3ip9ukDq/nk7fbfvf7i9P95K1rcS76pcgxfNm++HvpX651Dzz0uJOg5LZbbeLmn3eYeyd5M+qyK69L39yVgJ44TmstReqkvJEtgWqpp/vttWvyBtvM7sOPxqcdZLEXPrQVOUatc27UNhn5dOjRo1Lz2/94c7fickumb5lK/Tr3wstTZ+qvf7G9W/R736l5Cs3gk/cYNU+4iRuPH3VO2ub9IesJkBZpl+3c9uXtZ2nnByQvlUjbDxfpeNVa4Nmdju9MyoPS7om2LJCMHP04eQP6hptvT39fZf0pxx9SMwDVjPqW9xjdr7K5Of+iTnhUeZHmwMNPTF9u2nf4Lm6+eb4Z7uLyXmcz6nOPk2ziChnxMHz/o1P9WX/t1dxayUwG0yQjnJ99/qU0mCKs69EluE65aeLE3/egkWkdlL7h9j/ezMmLZBI0Peu8P7mP//NJOqPLFpuuX/Mu59XgIv2gvMeoecKRNtbbh49x7s1o20WOEQllNzM6WDdvMmvB62++nW7XAdI3knWnnf3H9IVEmSFm8qTJqVO6ngBpp7R/Gclw4mnnpi+OSl9IZheSWW7CAKluj1tu9gO3UjJqVGaIeeyfT7tLr/hbyv7oQ/epOkLH37y89Vwft14/QN5j+HOL9beeuinHeiCZhUPYSd3c7Zfbp/ouzrd7khG6f7vh1vR0TjnukJovnzSDT5FjxGIpdoq2YxkVckYyetQv4bO2Xx/+7YS2X28d9T4gmbFt9113DFGlvwG9zRSVtz0WqW95j9HjQowr8tTRg444Ke03Lb/sEm6bLTZOg6HPvfCS+8Ofrky1Sn5fa8100gw+RY5hRJhZvB6uEliRf1mLzGx2yu/+kL58cuIxB/YIPBe5zrx1rcgxsq7Fuq7eNn/TrXelM+1JP//nP93afWu+edJZY/76t/9LXzafY/Yh7vAD96x5OkX6ic343a150jk31tt3eu2Nt9xJp52XWt9og7Xc2sksBlNPPSB9MUr89PJMKr+tMpthraUZfPIeo9b55t326ONPuQsvuSrt7+y47RbpwAVpOzf//R/pLHDSTzpd8BTaAAApd0lEQVTx6AMqZmO0qyI2ytr+PTgCpJ5Eif/K26zSMJZYbOEeU3j4UUEbrLu62+QHa5f4Kmuf+t4HHuMGJtNGScBSHFVnnvunugKk8naaOAzkbUl5KPDLxMR5KJ0zGU25VzJyUd5Wk0WmL5Y3huQHaOQR+7oB/fv7ImlwT34QxAkhAT6/5D2GL9dXfyXYLj+Ge+72s25TakrQWQJRMrJTHkZrLXnrpDi4Rxw8MhVAectS3rb0izghjhh5WhpIGDXyoKTjNjDdlPcY3l6z/9582z+S6ZhvTxwlSyVO0827HV4e+uXhX95+lregqy3N4FPkGNXOt5nr733g4WS6s+vToN74j/+Tttl6AqR522W7t/0RiXNf3tQdNTIZfZsESvIu8OxOzAecR+z5y/QlE79VOvmiLfIbW2tUbjPqW5Fj+Otopb//lzyoyjRHotOi1+FS5DqbUZ/D82xm3jtFpxk82J107IHdZjD4c/Iy1H1jHnUrJVNHbr/NZlVPC65daDxPmZpM+jD9Vd9QdOngI09Od5YHV+k/Zi1FNDhvP6jIMbLONfa6evrwsc69GW077zFi8/T2zrngsvRlTxlZL/3M3fc5PN2kA6QyvduV19yYPgP96Ic/cCedfl76slRvAdJOav8ymunI405PP43x8x23cTIaRz5pEwZIH3r0CXfxZVen05wdsM+v/W1I/56eBKHlsyzb/Ghjt9oqy3fbpjNF6nkZfwfqqZvCRZ65pa7JTDvhNHsHH3WyGz/+P6nvQ3wg1ZZm8Ml7jGrnWnR9kXYsU0QectSotD8qLz9LIL+eAGmntP1666i83C3+n3rYZd3fTmnz9dZRH3CWT5Ls89tfdEPmX5jobVRu3vbYjHvQ7UIiZurlWu2QMmvcq6+9mc6GIJoWLp3Est4271/MD2cw+CSZev+A5IVdWU5IBidNX2NwUt5+YjN+d8N7b83X23eSl53kU1lZvlKZHlpmOegt6NwMPkWOYWWoy/uXSddLPu/ww43XrWySuMWIA49NYyDaj5637VYMqkReG2X+LfWXTYDUkyjxX/+W1fAkoLVg8I04+b6UvBksb7hIQK9dF/m2zprfX6nyhlk9AVL5foyMOpG3gXXgzTOSb2GK3RWWXdLtuN0W6eo//fka92DyPTkZcSFv6eplwoQJbp8kyCAO8OOO3M/NOMP06Tdq8h5D22x2Wt4uk7efhImMdAjfePztiCPS6/vdyUfUHPmUt07K6F/50ZfRv6FTQRj4jshO22+ZfutV1uU9hpTpi0VGJE+Y8KWbZprBPb6jKm9AyxTPvQVIm8GnyDH6gqc+pnRED0ocz9LmDt3/t+kUzfJSQ28BUtq+puhSftK2pd1L2867wLM7MZme5+gTfufku0OH7Ld7941JTjqPXyR6Id+N0C/Z6B2boTV5j6HPr1XSwnL/Q49PHwr2T15Myvq2a97rbEZ97mt+vm+YNUuGBJsl6Czf1vtJjQApXLvu4nU3/N3desc9bp3kGzCbb9JzlKh3hNQKOhXR4Lz9oCLH6LrKxqXq6cPHOPdmtO0ix2gU2fuTFx0WXujbbpaZZ0pHj2QFSCW4LwF9/yKof7mnVl2V8+2k9i8jwGUKaD+V6zWjb8kMkMoIJ9lPZhGS0WR68S9Lho4tvY+ki9TzMv4O1FM3hcd/kz699PFldqHwmdS/BC6fLKgVIG0Gn7zHkGuLuRRpx9ckn4G4PfkMhLBbfNGF0yn36wnydUrbr7eOXnv9re62ZNa2H260rltv7e/nvq2d0ubrraNnn39J+h333+yyQzpbmwYqfip5wVQ0a7rkGarakrc9NuMeVDtX6/p6uWYd55XX3nCjzrig6uhRKdNJLOtt894vGWqP+Pv2OejYVLNOSF6InL7KC5FF+onN+N3NqiOWdfX2nTxPP5ujPqbMeLTHvkemq84cdWSPfoDftxl88h7Dn1usv/JynnwuQ3RG+vV68S+T6QFOeduutufTeW2U+bfUXzMBUk+ixH9/s/dh6dln/WhIRyLrgbjEl9vrqcsDaj0BUnlbSt6amm/eb7p999ylh13faZh/vmHJt0h/mW73b1nts8cv0ukUwkLy5vVrr7+V7i/lihwjtNkq+Zdefs2detaF6dRQMkVUrSVvnfRTVWy0/ppuw+RfuNx0y53uxuSfTLuw4XprpJvzHiO02dd5mXbiuGRErkzXLHPGh84UfX7N4FPkGPoc+yItb/o9/ewLzjuc9ksCJfUESIu0y3Zu+/Kx+cOOOSV1QP0gaV8yzeYXSWBfpopcbNGF3Fxzzl7z9sKzO55Hk7fwL0ymgZJ6udqqy7uHH3vSPf/Cy+nIscUXWShh+t1ev5HbjPqW9xjdr7I1cjcmwTz57Vow+VaeOPSzlrzX2Yz6nHWezVwnDuc99zsqfYjXD1PyQs8hR45KR5P3Np0RXLvumH+hbp3kExebb7Je14avUyNPPjv9vvpPtv6hW3nFZXpslxVFNDhvP6jIMTJPtoErq/XhY5x7M9p2kWM0EGfFdL3Pg/UGSDu5/VcLkFZgZyROOOX37o233kmm49vGLb3EIhl7TFlVpJ6X/Xeg3rqpocknIeQZSrTs1OMP7TEtpN63GXzyHkOfXyPSvbVj4Sf7yOcejjl8RDqVoXyTvJ4AaSe2/Vp1VKaAlOkyZba2/ybBu7feeS99QXLRhb+TPkcNHDh1zVvciW1egFSro35kuLywK98eluf8d5MXT8VPskTyTDrsm3PX5Ckb87bHZtyDXk860g7VuGaZ935LGfQhgz+ylk5lWavNy/fIR990W+pD3juZucjPGnPbnfe5a6+/peoL0p5vkX5iM353/fk16m+1vpMPkGb5Q2VmyOHJ86osRx+6d/oJtqzzawafvMfIOs9GrBOfsvhApT+kZyrK23azzi2vjXb4LSVAmlUTSrROPhK93yHHJd+OGuxOTqYfzVr81Ikyr3ytt62yypZxXTXnSngtMpWMfMtA3vSV74aGiw8azDzzjO7Yw0akm32n7ahD9k6/QROW8Z1k+Uann64m7zFCm62QF3GSaW5lKqNwOuLw/IrUST/V7HZbb+pWWbFrqmNv238TwE/5V+QY3lZf/pUO/iNJsESCzTJNgywSSJfOlYzeq7Y0g0/eY1Q712atl4emcy64NB0df1TSYZKRePUGSGn73e+STPsm079VW/zvWbXt8OxOxj8gye/VI8noePn91ItMw3nAPrvV1ONmaE3eY+hraIW0BPP2Pfi49IGg2uhROc+819mM+twK/OQtzz8lDlF5oJpzjtnSt1FlajNZ5MUxmdqsli7Btesu+t9QGZF7xEF7duP2wbgP3eHHnpbuXG2EqWzMq8FF+kF5j9F1hc1LVevDxzj3ZrTtIsdoBt1azj59/Hqdq53c/qs5+TRHnR7z8D/T0XlZn2fR+0k6bz1vh9+BeuvmM8/9K52mWEbpytR9soTTHKcr1X/N4FPkGOoUG5Ks1Y6Ft8xyIiNRZBp96av6OlpPgLQT236tOuqd+1k3UmaS2W/4LpXPA2Xt04ltXjhUq6Myo5F8f3DJxb6XztoWMuttmvIi7bEZ9yC8jkblq3ENj+enC5WXJLK+PSr7dzLLWm1eXsb//YV/dq+8+kba35cXyt9MXoCSEZPy3LTrztu6Rb/33RB5JV+kn9iM393KCTYoUa3v5Gfh8X5effgHHnrcXfqXa9NVWSNM/b7N4JP3GP7cGv1XXsqXl/P15xaLtN3wPIvYaIffUgKkYU0oWV4CLsckndysadL8pfiPCcsUlN/oZSSQL1Pmv9WcK+E13Xn3A+l0stWmN5Wp++S7SNJxOO3EKaN05Q0WcXbLNzjlW5zhItOlyrSp8r2fNb6/oityjNBmX+elg3DWeZc44Tr3XHO6g0bsVnV6AznXInXST6cSTlXhr/2Jp55zMpXSIgsv6Hb75Q6FjuFt9eXf+5PvjV6WfHfUL/INDRm9XO2bZH6/ZvDJewx/bn3xV6azPuiIk9NRTnoauHoDpEXaZTu3fRktf3Uy1ZZMDbP6qiu4BZJvOX6cfDdPfsvkrWhZ9LeYw3sOz+5Errr2pvQbZbJWHpRkuvKFvvtt9+57/3bXjr7ZffjRx+l3luU7EdWWZtS3vMeodq59tV6+7SzTFtYaPSrnlvc6m1Gf+4qZPq44mCVAKm8y60X6PLskD/fywF9rgWsXHfmWm7yMKP1D6afIi2QzzzSjezlxnvw+melAvu8sy5qrreS23OwHXQVVKq8GN6OvpU6vaclqffi8fLJOuBltu8gxss419rpazj59rHqdq53c/qs5+TRHn/YjRSQvzy/y+1BryVvP2+F3oN66KS8ci2PZL8stvXj6CZxaL/I0g0+RY/hraNTfWu3Y/0bNO2yo2y/5NIEseQKkndj2a9VR+W67BJvmGTa3WzV5yVu+OygvTcl39cSXJNOXyzNUtaUT27ywyKqj0oeS+uWX7ySfDpPpJIWpvNQn336WpZq/SLYVaY/NuAdybs1YsrhmHdfPalBrauhOZlmrzcs2Gbxx+VXX90AruiR+4Fq+Pf8b3Gk+6Gp9p9feeMuddNp5KcuNk9kC5VlJdP2x5PujMrOBX2r1oTpRl4SL/CYKV3l2P/KQvdKBI7K+SNuVcnopYqMdfksJkOpaUMK0n8NcfoRlSHXW4oMG/ruYWfu007pqzpXwGh969Al38WVXu2WWWsztvMNW4WY3PgkQHJx831C+e3J88qFtWQ447IT02wfHJtPRiPMrXC685Cr36ONPuZ/+5Edu+WWWcEWOEdrs6/zlV4129z7wSCr0EmQXHrWWInXSf3R6h223cCsut2QP8/7BbbllFnc7/WTLyrddy1bvP/xofPK22Zvu1dffdPLRcf+mmYzQk5HM1ZZm8Ml7jGrn2oz1V15zo/vHvQ+m36OV79L6xf/W9fYN0iLtshPbvnD1v2krLb+U2/7Hm3vU3f7CsxuO5IFpym+mrN0rmfb12wvMV9lBvpt7eDIaX5wm8n1Sebs8a2lGfct7jKzz7Kt1n3+ejB5NZs+Q0Y8H7P2rmlNu5b3OZtTnvuLmjyvac/gxp6YBPfn29wqJ7so3cWUE6UOPPJHu9otkKsilakwFCVdPc8rft5Np9Y5PptGUOhku4iAVB+oWm27g1l5j5XBzms+rwc3oa2WeaINXVuvD5+WTdZrNaNtFjpF1rrHX1XL26WPV61zt5PZfzcmnOUpaXkIZmUxjKk7/TTdMpjBcJ3sKQ10ubz1vh9+BeuumOFHfG/uBezYZSSqjSIWrPAfKZ3DmmH2IxlhJN4NPkWNUTrBBiWrtWLT/kKNGpTp15MHD3WxDZk3PwD9n1zOCtBPbfr11VN9OeSlSpteXPsEJiR9JgnxZSye2eeGQVUelby/fcJRF+k3yCQj9AsQNyWc1/i/5rIa8wCffKM1airTHZtyDrHNtxLosruFxXkwC+KclM0fVGj0qZTqZZa02Ly8//P2Oe9O6KS+Wz5/MuvPBuI/c3fc/lM62J3okz/h+6t2Qf5F+YjN+d8PzjJ2v1Xd6IBlEIqMPw0VmyZx++mnd+x986A7e9zfpYJ1wH8k3g0/eY2SdZ8x1EkD+w8VXpCbDgQxF2m54bkVstMNvKQHSsCaULO9/vKXzIHP1Zy0yVYV0zrK+UZq1f9nXVXOuhNf1YjLN6WnJNzWrjT6RqRLE2TVP8q2D/RMHrCz+batqDlmxJ3b9qLYixwjPsy/z/tufUr9ElOoZgVykTso8/jKff7W32G69/R533Y1/r0ylVOQYfcmx2rEffOSfTj74LUES6UhVW5rBJ+8xqp1ro9f7dimd+pFH7uumnWaayiHrDZAWaZed1vY9VM9bpoWt9u1heHpaU/76KXZl2tLDDtij+8YkJ1PFyJQxMpJM3pLMWppR3/IeI+s8+2qdn45H3i4XB0qtJe91NqM+1zrfZmy7+M9Xp4FQmQLqVz/frtusEF6XZJYMmS2j2gLXnmTEISoj75965nn3RTIiX+rnmqutmORfSJ0ptb4/mFeDi/SD8h6j5xU2fk21PnyMc29G2y5yjMZTdc7XFznWWad0jdAJj12Pc1XKdHL7r+Xk8zwlEHX08b9LR48vv+wS7qfb/chvqvk3bz339zWPHyDvMWqecISN/hrEVK26qQ8lZUTHZFTZ2quv7Lb44QZ6cyXtbTeST5FjVE6wQYlq7fh3v784fRFqo/XXdBsm//ySJ0DaiW3f32PhVW8dlX29XwjtFxrdl2p11Psts0aLyTde908GK4gPwM/u1t1ql9Z1Wpv3HKpx9dvlr58W+ocbr+vWW+v7elO3tK/3ncjSX7sA0W1etP2gI05KOYWfd5FPvwhbCeZtvcVG6axc3YB+nSnST2zG727WucZc11vf6ZnnXnQPPvy4e/b5l9w00wxKX4T4wbpruLOTT2rJS6gnHXtgN7+fPrdm8Ml7DH1+sdMvvPiKO+Oci1KzfmCWPoavv3nari4v6SI28vYvixwjPM/YeQKksYn2gT3/jdGs0Sh+aHStb5T2wSk39JDVnCvhQf13oaSTdeoJh3ZzEMq+fvoDPZ+3TPMq071mObalgctbbzIyyL+VWeQY4Xn2VV6cfDJlsCzyLbJvzT9P3aeSt07e+8DD6TQVfgrd8EB+uP62W23iVl1puXRz3mOENlsl769j5BH7VqZFCM+tGXyKHCM8z2bkzzz3T+l0zyL4sw2Zpdsh/TeJZOrifv36uYOSoL6073Ap0i47qe1rXv77A7UeRuGpibl0ZMO5ybdJqr3h7IN766y5qtt8k/W6F/4614z6lvcYmSfaByv/99lnbv9DT0hf/Dpgn187GQFZa8l7nc2oz7XOtxnbDj16VDrVc/jGqRxb+jJ77X90OjrH92WyzgmuWVSy1518xvnpVMYHJt8e/ubQb2TuVESDff+h3v5/kWNknmwDV1brw8c492a07SLHaCDOimnvhJAV2tlX2eHrRD3OVdm1k9t/b06+zz773B1z0pnpSJKFk+n1ZaST9EnrWYrU87L/DtRbN0N+vq3NNOMMTp6hqi3N4JP3GNXONdb6rHb8zrv/TkbtnZkewj8n+eNJX1++qyd9/VmSFyJlJOnaa6ziN3f724ltv2gd9d9j+1ESwF8rCeRnLZ3Y5oVDVh2V9Ucks+xIgCmrXzNp0iS3x75Hym7u9JMOdwP690/T4X9522Mz7kF4jo3KV+Pqj+cDK9LWTxp5UKafxO8rfzuVZbU2L58eOv+ivzg9RbnmleU/1tsl7bVL7kEn+aB76zuFnCQvM0XsfcAx6aZqg8FkYyfpkgxeODGZklgGwG2+yfpunTWztTpv200hB//ltdEOv6UESINKUMasjECTN/6zvm0k35W74x/3uxWWXTL9TkcZry/vOVdzrmTZkTeA5E2grLfUjjnxzPSbcTKFp8wnL8vDjz3pLrr0ry5rZNCzz7+YfqszfFDLe4ys82z2Oi/+clx5sO/tW2Th+eWtk346Y7EzauTBbvDgQRWTeroVPbVx3mNUDDY5ceqZf0jeehrrfvWLn6TTxejDS+fLO6JPSKbInj6ZKipraQafIsfIOtdGr/Nv49ZznFOPP8QNHNjzW8FSNm+7bOe2LyO05d9KKyzt5CFeL/77v72N1INnFzX94CPTPYdT7MiUW/ImZK3f1mbUtyLH6LrKvktde/2t7rY773XfXfBbbo9f79TriRS5zmbU515PvIE7HHnc6en0jyP2/GUyNdSwHkeS76/Ly17HHLaPm2XmmXpslxVw7cIio2+uvOYG96355nG777pj14Yk5X8Pao3ClwJFNDhvP6jIMbpdTBMy1frwsc69GW077zGagLXyJrgcK0aAtJPbfy0nnzjzTjz1XPfOu2PdfMm0e3sn3x4M+wC17neRel7234FqjmgJNMsnCaZKgstHJ1okzmS9+IBfb7+tzeCT9xj6OhqRzgqS+Blh6jmeTBspI6Cylk5s+9XqqHx/XKYsluXAEbv1eNH5sORTBuM+/MjVepmvE9u88Mqqo7LeBzq22HT9HkF6H9zrbeatvO2xGfdArq0ZSzWu/tj+GXSzjddz6661ql9d9W+nsqzW5p9+9gV3zgWXufnnG5ZO7x6Cu/u+h9wVV9/gll5yUSef0Kq25O0nNuN3t9q5xlpfre/0p+Q7o+J7ls8QrL92908R3D/mUXdZ8p3nlRMf1U+22azqqTSDT5FjVD3hghvk5ZFjkxiF9DWF1aYbrVPVUt62m2Uor412+C0lQJpVE0q2zj8gyGn/9lc/dQt9Z4H0CuRbUjKViiwH77t7Mmd39rfO0h3a6L9qzpWx//4gfTtyjmTaQx+I8m/5yAjbQ/bfvfJdUf+NA5li7uRjD6p8/0De1Bhx8MjUcbjBuqu7TX6wdkpOfgyOOeHMdCqlcHRp3mP09a3w3yWQ89g5EfZlEoGvtcj85B8kP9Yzzjh95VsmRerkWeddkkyp8GLa4RCHgowQFN6nJtMWv/LqGz1GYxU5Rq3raNQ2P1pMvkcgU0H6b9fK27qjk2mD5fuuYUdfvrMzedJkN+88QyuOlWbwyXuMRjGrZVc6rPIvazng8BPTNn7iMQe6aZIgu9QhWbLqaN522c5tX+rbScmbaLLsO3wXN98830zT4z4cn75tLoES/YYaPFM8Nf/zo97l5ZJfJy9H+Lrofw+ksExfKhojS9jmm1HfihwjPdk+/E9+N+UbIHLu1RxOsOz9Bvl6OPdcc7pdd962ot3yQpJMrX978mKddjpPSKaLfevtd93UA6eujNgtUn+a8bvb+9XH3+Oj8R9XnKQ7brdF+lKiHEWmgzvh1N+no3XD6bay+qR5NbhIPyjvMeLTqm2xWh9eSuU99yzGzaiDeY9Rm0icrdWcfaH1as5Vfle7SFVz8slvokx5JtPnSb9+v6Q/Ve0lPW8tq47mredl/x2oVTf9VJDynexttti40meSF0/O++Nf0pfN9BS7WVrVDD5FjuHrQCP+VmvHUkezljHJZx/ECb3Kisu4H2+5STri2Y96pu13TTUo7MIXTORFaPnGuHyyQAIiA5N+kiz+dyIcJUabT/FUDZDKS+UjTz4r3UnPYPbhRx+n33T+7PPP0xFT8lwqC20+xVD5r1rblx18/0qePeXF/PClk6zn+yK/bc3QsMoFNyhRTZckMDV8vymfKZCA3fLLLO4GfP3yjryEcvrZF6X+4F/8dBu31BKLpGeXxTVvP7EZz1wNQlkx638TJRAq32X3i5/iXXwl+pNur77+pjvld39In/nlk0UyQMkvnahLUo9kAJfM9lDP98Lztl1+S6fULgKkvpWV/O/lV41OAy1yGf7HQzpgstTTgNId2+Q/L/7626FyafJG7+tvvu123mErt8xSi6VXO2HCBHfS6eenb/rKj7JM1SfBThlVKktWgPDRx59yF15yVbpdRotKwOvNxHEowiXOxn2TERn6gbjIMVLjffCfnrpQDi9T8GQt0iGQb7fKcv3/3e5u/vs/3ErLL+W2//Hm6Tr5L2+dfG/s+8l0AeemwWfpuAlLeQNbgjOS32/4rj2+gZr3GJWTa2Ji/Pj/JN+yPcd9kjhKZRGn8zTJdzNlBJksUu9kFJTnqTtkelRpM/gUOUZ6ES3yX7VvkGbV0SLtsp3bvjj15M1cWWaeeUY33bTTVuqojNST0Y5+FAQ8e6/w8sb4ESNPT3VB2vg8w+Z2Y8d+kD40Seldd97OLb7oQqmham2+GfUt7zF6v/LG7nFNMiuGBO+qjR6FZX38pZ9z0unnpVNASgnpy0yXzGAgmusXXUfF+SdOQPltOPawEX4Xl7f+NON3t3JyTU74kc1yWGEp/ac33nwn/Q0Qfd89eYFRTweX1SctosF5+0FFjtFMlNX68HIOec89i3Ez6mCRYzSasf5tDB38+thZzlVdVvdLO7X9V3Py6d+AGaafrttsOJ6xPNvs8rNtfTbz2TRvPRdjZf4d0PUrrJvye3D2+Zemv6NynUPn/ob79H//q2iXPFON2HOXysi9alrVDD55jyHX06glqx3XOpZ3UIc+I31vOrntaw5hHZUXIuQZSvxA0t+Xl5vfe+/9Sn9fXo6WWXj8kqVLndbmhUWtOuqnJpb9pC8lASj5xrss4t/be49fVIJ7tPkUS+W/Wlz97Hj6pedKwSSR9Xwv2/P+tjWjPuvzbkS6VpuXWbeuSwY5yCJt/puJLsnIPgneyyKjS6Xd+wB0Ftci/cRm9LnSC2jQf9X6TvLbKS/qv5EEmGUJ23z4zWx9bzpJl/zob2E0ZNZZkrrXT5LdlpWTl5z0d4XztF1+S6egJEDarUqVO3PTrXel085JQEkWCSrJN842XG+NNN8p/1VzrvjgSfhNLXlb4qLL/uqeeuaFygOYOAG33XLT5G3A72Rie/rZf7nL/zq68oAm4rjYIt91O/1ky8qbg7pgkWPo8s1K61EQtY4pD/fybVZZ/vCnK91j/3w6feP0+ytP+T6oL5u3TkpQ4dwLL68EZsSOPAzLCBcRgqwl7zGybDR6nXy0/dK//M09ndQxefNMFv8QtUMSVPYvNch6fw+k/coIM700g0+RY+hz7Mu0jCyTQLQemSfnU62OFmmX7dr2pbN57ehb3P0PPlbp4IuTf6nFv5dOs+WDo/Csv4Z/+NH49GWaV197s1JIfs9Ek5dMuPqlVptvRn3Lewx/3s3+K30bmcFBHqSqfcsRlvXfFdGly664zj3z3L/SF5GkpOjS0MSBLy876W9lPpD8LojDSn+T3R8pb/1pxu+uP7dm/pXfUPmkxfU33V7ReXGOLJu8Xb7dVpumbPX5VOuTFtHgvP2gIsfQ597IdLU+vD9mnnOvxrgZdbDIMfw1NuKvdiiFDn59vCznKr+rmlDXyLBwFIQ8Sz786JPddw5y8ixz1CF7VdZWq6N56rk3Vtbfgd7qprzwffFlV1deRpbrlWekRRb+jts+eWFX0n6ppVXN4JP3GP68Y//Nase1jvHQo0+kjOU5XkaQ+oW2P4VEb3VURj1K+9cvmUkgb/NkmlgdHBVrtPkpTHuro3fdM8b9LfmkhvebyGxv4pfbNulP0eanMMz6vxrXf730ajK68Y8puxOT0aN+1KO2Uc1fIvvk/W1rhobpc4+d7q3NyyeI/nbDrennSvyx5cWo5ZdZIm33fgS+bKvGtUg/sRnPXP56Yv+tFiCV48iU+lePvtmJhvtFeP4g8ZnIlO966VRd8tqhWYTpUMNle71tl/7TFJoESMNa1QZ5GRkgi5/Ksw0uyXwJ/qPu4qw67cTDMu2JEH4w7qN0+t1pphmcuU+4Un7M/5sMc59tyCzpdDTh9jBf5BihjVbL+7dZDtlv93RKqazzy1snJ06a5MYl92JIwlWPuMiy7dflPYYv1+y/Mj2CvDUmThLdefLn4b+vIVNzyqi9rKUZfIocI+tcW2Fdb3W0SLts57bvR9DLqLKsBZ5ZVKqvk4f7998fl05j6qfe0nvX0+abUd/yHkNfQ6ukYVnsTnyS6NIXNXTJj4wKPyGgj5a3/jTjd1efXzPT8vAu/c7Zhsyaedh6+qRFNDhvP6jIMTIvqA9W9nbu9TBuRh0scow+wFnzkPyu1sRTeGM9dbS3ep518Hb9HZC2JNNsDhjQvzJiNLz+erSqGXzyHiO8jlbJ0/bz3Yne2ittPh9P2bu3/hRtPj/TaiV6e76Xcnl/23prE1nnkvcYWTaatU5e2pXRo+IzGZx83ilr6Y1rkX5iM565sq6l0es8z2kTX/wMM0yfeTh0KRNLryt7a1f8lk5BSIC016rEDu1AQKYzFXHKGv3QDtfXl9fw2xFHuEEDk2+1jjyoL0+jbY592533uWuvvyV5Q3KTZHrs7iNy2+Yim3wh1NG4wOEZlydtPh5PWMZjqS35KbjDGTj0PqTrJ0CftH5WRfeEcVFyPcvxu9qTSYw11NEYFLvbQKu687DmaPtWgt3L0+a784iRo83HoDjFBs/38VhqS3DVNOxpdMnOMMsCv6VTqBAgzaodrGs7AjJt5GXJ9HA/234rt+zSU74/2nYX2QcXJG/yHnr0KLfCcku6Hbfdog/OoP0O6afhOO7I/dyMVd6car+rbtwVUUfjsoVnXJ5ijTYfjyks47HUlmRaH5nNYeQR++rVpAsSoE9aEFyOYjDOAauXXfld7QVQwc3U0YLgahRDq2rAKbCJtl8AWo0itPkacApuos0XBBcU4/k+ABIpC9dIIJUZdEnBiJjkt3QKTAKkESsVplqXwNPPvuBkzvYtkm9BDExGO7LEISDfhZFvbq22yvLpt0LjWO1sK7ffdX/yvY0v3QbrrN7ZICJdPXU0EsivzcAzLk+xRpuPxxSW8Vh6SzL10xVX3+C+s+C33NJLLOJX89dAgD6pAV6dRWFcJ6g6duN3tQ5IBXahjhaAVqMIWlUDTsFNtP2C4KoUo81XAVNwNW2+ILiMYjzfZ0CJsAquESAGJtClAEiELL+lXRAJkHaxIAUBCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCLQ5AQKkbX6DuTwIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQKCLAAHSLhakIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIACBNidAgLTNbzCXBwEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIdBEgQNrFghQEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEINDmBAiQtvkN5vIgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAIEuAgRIu1iQggAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAE2pwAAdI2v8FcHgQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQg0EWAAGkXC1IQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgECbEyBA2uY3mMuDAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAS6CBAg7WJBCgIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQaHMCBEjb/AZzeRCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAQBcBAqRdLEhBAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAJtToAAaZvfYC4PAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhDoIkCAtIsFKQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAoM0JECBt8xvM5UEAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAl0ECJB2sSAFAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQi0OQECpG1+g7k8CEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCECgiwAB0i4WpCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAgTYnQIC0zW8wlwcBCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCHQRIEDaxYIUBCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCDQ5gQIkLb5DebyIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIACBLgIESLtYkIIABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABNqcAAHSNr/BXB4EIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEINBFgABpFwtSEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIBAmxMgQNrmN5jLgwAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEuggQIO1iQQoCEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEGhzAgRI2/wGc3kQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgEAXAQKkXSxIQQACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACbU7g/wEvhCI9oXVNrgAAAABJRU5ErkJggg==`; diff --git a/x-pack/examples/reporting_example/public/constants.ts b/x-pack/examples/reporting_example/public/constants.ts new file mode 100644 index 0000000000000..909b656c5e514 --- /dev/null +++ b/x-pack/examples/reporting_example/public/constants.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. + */ + +// Values based on A4 page size +export const VIS = { + width: 1950 / 2, + height: 1200 / 2, +}; + +export const ROUTES = { + captureTest: '/captureTest', + main: '/', +}; diff --git a/x-pack/examples/reporting_example/public/containers/capture_test.scss b/x-pack/examples/reporting_example/public/containers/capture_test.scss new file mode 100644 index 0000000000000..4ecd869544b32 --- /dev/null +++ b/x-pack/examples/reporting_example/public/containers/capture_test.scss @@ -0,0 +1,10 @@ +.reportingExample { + &__captureContainer { + display: flex; + flex-direction: column; + align-items: center; + + margin-top: $euiSizeM; + margin-bottom: $euiSizeM; + } +} diff --git a/x-pack/examples/reporting_example/public/containers/capture_test.tsx b/x-pack/examples/reporting_example/public/containers/capture_test.tsx new file mode 100644 index 0000000000000..81528f8136dff --- /dev/null +++ b/x-pack/examples/reporting_example/public/containers/capture_test.tsx @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FunctionComponent } from 'react'; +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import { parsePath } from 'history'; +import { + EuiTabbedContent, + EuiTabbedContentTab, + EuiSpacer, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiPage, + EuiPageHeader, + EuiPageBody, + EuiPageContent, + EuiPageContentBody, +} from '@elastic/eui'; + +import { TestImageA } from '../components'; +import { useApplicationContext } from '../application_context'; +import { MyForwardableState } from '../types'; +import { ROUTES } from '../constants'; + +import './capture_test.scss'; + +const ItemsContainer: FunctionComponent<{ count: string }> = ({ count, children }) => ( +
+ {children} +
+); + +const tabs: Array = [ + { + id: 'A', + name: 'Test A', + content: ( + + + + + + + ), + }, +]; + +export const CaptureTest: FunctionComponent = () => { + const { forwardedState } = useApplicationContext(); + const tabToRender = forwardedState?.captureTest; + const history = useHistory(); + return ( + + + + + + + + Back to main + + + + + + + tab.id === tabToRender) : undefined + } + /> + + + + + ); +}; diff --git a/x-pack/examples/reporting_example/public/components/app.tsx b/x-pack/examples/reporting_example/public/containers/main.tsx similarity index 61% rename from x-pack/examples/reporting_example/public/components/app.tsx rename to x-pack/examples/reporting_example/public/containers/main.tsx index 3e2f08fc89c7b..8673c476fdc7b 100644 --- a/x-pack/examples/reporting_example/public/components/app.tsx +++ b/x-pack/examples/reporting_example/public/containers/main.tsx @@ -23,41 +23,42 @@ import { EuiTitle, EuiCodeBlock, EuiSpacer, + EuiLink, + EuiContextMenuProps, } from '@elastic/eui'; import moment from 'moment'; import { I18nProvider } from '@kbn/i18n/react'; import React, { useEffect, useState } from 'react'; -import { BrowserRouter as Router } from 'react-router-dom'; +import { parsePath } from 'history'; +import { BrowserRouter as Router, useHistory } from 'react-router-dom'; import * as Rx from 'rxjs'; import { takeWhile } from 'rxjs/operators'; import { ScreenshotModePluginSetup } from 'src/plugins/screenshot_mode/public'; -import { constants, ReportingStart } from '../../../../../x-pack/plugins/reporting/public'; +import { constants, ReportingStart } from '../../../../plugins/reporting/public'; import type { JobParamsPDFV2 } from '../../../../plugins/reporting/server/export_types/printable_pdf_v2/types'; import type { JobParamsPNGV2 } from '../../../../plugins/reporting/server/export_types/png_v2/types'; import { REPORTING_EXAMPLE_LOCATOR_ID } from '../../common'; -import { MyForwardableState } from '../types'; +import { useApplicationContext } from '../application_context'; +import { ROUTES } from '../constants'; +import type { MyForwardableState } from '../types'; interface ReportingExampleAppProps { basename: string; reporting: ReportingStart; screenshotMode: ScreenshotModePluginSetup; - forwardedParams?: MyForwardableState; } const sourceLogos = ['Beats', 'Cloud', 'Logging', 'Kibana']; -export const ReportingExampleApp = ({ - basename, - reporting, - screenshotMode, - forwardedParams, -}: ReportingExampleAppProps) => { +export const Main = ({ basename, reporting, screenshotMode }: ReportingExampleAppProps) => { + const history = useHistory(); + const { forwardedState } = useApplicationContext(); useEffect(() => { // eslint-disable-next-line no-console - console.log('forwardedParams', forwardedParams); - }, [forwardedParams]); + console.log('forwardedState', forwardedState); + }, [forwardedState]); // Context Menu const [isPopoverOpen, setPopover] = useState(false); @@ -123,12 +124,54 @@ export const ReportingExampleApp = ({ }; }; - const panels = [ + const getCaptureTestPNGJobParams = (): JobParamsPNGV2 => { + return { + version: '8.0.0', + layout: { + id: constants.LAYOUT_TYPES.PRESERVE_LAYOUT, + }, + locatorParams: { + id: REPORTING_EXAMPLE_LOCATOR_ID, + version: '0.5.0', + params: { captureTest: 'A' } as MyForwardableState, + }, + objectType: 'develeloperExample', + title: 'Reporting Developer Example', + browserTimezone: moment.tz.guess(), + }; + }; + + const getCaptureTestPDFJobParams = (print: boolean) => (): JobParamsPDFV2 => { + return { + version: '8.0.0', + layout: { + id: print ? constants.LAYOUT_TYPES.PRINT : constants.LAYOUT_TYPES.PRESERVE_LAYOUT, + dimensions: { + // Magic numbers based on height of components not rendered on this screen :( + height: 2400, + width: 1822, + }, + }, + locatorParams: [ + { + id: REPORTING_EXAMPLE_LOCATOR_ID, + version: '0.5.0', + params: { captureTest: 'A' } as MyForwardableState, + }, + ], + objectType: 'develeloperExample', + title: 'Reporting Developer Example', + browserTimezone: moment.tz.guess(), + }; + }; + + const panels: EuiContextMenuProps['panels'] = [ { id: 0, items: [ { name: 'PDF Reports', icon: 'document', panel: 1 }, { name: 'PNG Reports', icon: 'document', panel: 7 }, + { name: 'Capture test', icon: 'document', panel: 8, 'data-test-subj': 'captureTestPanel' }, ], }, { @@ -141,6 +184,31 @@ export const ReportingExampleApp = ({ { name: 'Canvas Layout Option', icon: 'canvasApp', panel: 3 }, ], }, + { + id: 8, + initialFocusedItemIndex: 0, + title: 'Capture test', + items: [ + { + name: 'Capture test A - PNG', + icon: 'document', + panel: 9, + 'data-test-subj': 'captureTestPNG', + }, + { + name: 'Capture test A - PDF', + icon: 'document', + panel: 10, + 'data-test-subj': 'captureTestPDF', + }, + { + name: 'Capture test A - PDF print optimized', + icon: 'document', + panel: 11, + 'data-test-subj': 'captureTestPDFPrint', + }, + ], + }, { id: 7, initialFocusedItemIndex: 0, @@ -188,6 +256,37 @@ export const ReportingExampleApp = ({ /> ), }, + { + id: 9, + title: 'Test A', + content: ( + + ), + }, + { + id: 10, + title: 'Test A', + content: ( + + ), + }, + { + id: 11, + title: 'Test A', + content: ( + + ), + }, ]; return ( @@ -207,30 +306,45 @@ export const ReportingExampleApp = ({ - Share} - isOpen={isPopoverOpen} - closePopover={closePopover} - panelPaddingSize="none" - anchorPosition="downLeft" - > - - + + + + Share + + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + + + + + Go to capture test + + + +
- {forwardedParams ? ( + {forwardedState ? ( <>

Forwarded app state

- {JSON.stringify(forwardedParams)} + {JSON.stringify(forwardedState)} ) : ( <> diff --git a/x-pack/examples/reporting_example/public/types.ts b/x-pack/examples/reporting_example/public/types.ts index fb28293ab63a3..732de505acf76 100644 --- a/x-pack/examples/reporting_example/public/types.ts +++ b/x-pack/examples/reporting_example/public/types.ts @@ -10,6 +10,7 @@ import { ScreenshotModePluginSetup } from 'src/plugins/screenshot_mode/public'; import { SharePluginSetup } from 'src/plugins/share/public'; import { DeveloperExamplesSetup } from '../../../../examples/developer_examples/public'; import { ReportingStart } from '../../../plugins/reporting/public'; +import type { MyForwardableState } from '../common'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PluginSetup {} @@ -26,4 +27,4 @@ export interface StartDeps { reporting: ReportingStart; } -export type MyForwardableState = Record; +export type { MyForwardableState }; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts index d41b18addcca4..76cfe32ea9ec3 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts +++ b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts @@ -141,7 +141,7 @@ export class UiActionsEnhancedExamplesPlugin links: [ { label: 'README', - href: 'https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples#ui-actions-enhanced-examples', + href: 'https://github.com/elastic/kibana/tree/main/x-pack/examples/ui_actions_enhanced_examples#ui-actions-enhanced-examples', iconType: 'logoGithub', size: 's', target: '_blank', diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts index 2300143925b1e..1254d86e99066 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts @@ -8,7 +8,7 @@ import axios from 'axios'; import { createExternalService } from './service'; -import * as utils from '../lib/axios_utils'; +import { request, createAxiosResponse } from '../lib/axios_utils'; import { ExternalService } from './types'; import { Logger } from '../../../../../../src/core/server'; import { loggingSystemMock } from '../../../../../../src/core/server/mocks'; @@ -29,10 +29,10 @@ jest.mock('../lib/axios_utils', () => { }); axios.create = jest.fn(() => axios); -const requestMock = utils.request as jest.Mock; +const requestMock = request as jest.Mock; const configurationUtilities = actionsConfigMock.create(); -const issueTypesResponse = { +const issueTypesResponse = createAxiosResponse({ data: { projects: [ { @@ -49,9 +49,9 @@ const issueTypesResponse = { }, ], }, -}; +}); -const fieldsResponse = { +const fieldsResponse = createAxiosResponse({ data: { projects: [ { @@ -98,7 +98,7 @@ const fieldsResponse = { }, ], }, -}; +}); const issueResponse = { id: '10267', @@ -108,6 +108,31 @@ const issueResponse = { const issuesResponse = [issueResponse]; +const mockNewAPI = () => + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + 'list-project-issuetypes': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', + 'list-issuetype-fields': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + }, + }, + }) + ); + +const mockOldAPI = () => + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', + }, + }, + }) + ); + describe('Jira service', () => { let service: ExternalService; @@ -183,18 +208,34 @@ describe('Jira service', () => { }); describe('getIncident', () => { + const axiosRes = { + data: { + id: '1', + key: 'CK-1', + fields: { + summary: 'title', + description: 'description', + created: '2021-10-20T19:41:02.754+0300', + updated: '2021-10-20T19:41:02.754+0300', + }, + }, + }; + test('it returns the incident correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { id: '1', key: 'CK-1', fields: { summary: 'title', description: 'description' } }, - })); + requestMock.mockImplementation(() => createAxiosResponse(axiosRes)); const res = await service.getIncident('1'); - expect(res).toEqual({ id: '1', key: 'CK-1', summary: 'title', description: 'description' }); + expect(res).toEqual({ + id: '1', + key: 'CK-1', + summary: 'title', + description: 'description', + created: '2021-10-20T19:41:02.754+0300', + updated: '2021-10-20T19:41:02.754+0300', + }); }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { id: '1', key: 'CK-1' }, - })); + requestMock.mockImplementation(() => createAxiosResponse(axiosRes)); await service.getIncident('1'); expect(requestMock).toHaveBeenCalledWith({ @@ -215,9 +256,38 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get incident with id 1. Error: An error has occurred Reason: Required field' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ ...axiosRes, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIncident('1')).rejects.toThrow( + '[Action][Jira]: Unable to get incident with id 1. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json Reason: unknown: errorResponse was null' + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.getIncident('1')).rejects.toThrow( + '[Action][Jira]: Unable to get incident with id 1. Error: Response is missing at least one of the expected fields: id,key Reason: unknown: errorResponse was null' + ); + }); }); describe('createIncident', () => { + const incident = { + incident: { + summary: 'title', + description: 'desc', + labels: [], + issueType: '10006', + priority: 'High', + parent: 'RJ-107', + }, + }; + test('it creates the incident correctly', async () => { /* The response from Jira when creating an issue contains only the key and the id. The function makes the following calls when creating an issue: @@ -225,24 +295,19 @@ describe('Jira service', () => { 2. Create the issue. 3. Get the created issue with all the necessary fields. */ - requestMock.mockImplementationOnce(() => ({ - data: { id: '1', key: 'CK-1', fields: { summary: 'title', description: 'description' } }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { id: '1', key: 'CK-1', fields: { summary: 'title', description: 'description' } }, + }) + ); - requestMock.mockImplementationOnce(() => ({ - data: { id: '1', key: 'CK-1', fields: { created: '2020-04-27T10:59:46.202Z' } }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { id: '1', key: 'CK-1', fields: { created: '2020-04-27T10:59:46.202Z' } }, + }) + ); - const res = await service.createIncident({ - incident: { - summary: 'title', - description: 'desc', - labels: [], - issueType: '10006', - priority: 'High', - parent: null, - }, - }); + const res = await service.createIncident(incident); expect(res).toEqual({ title: 'CK-1', @@ -260,24 +325,30 @@ describe('Jira service', () => { 3. Get the created issue with all the necessary fields. */ // getIssueType mocks - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', + }, }, - }, - })); + }) + ); // getIssueType mocks requestMock.mockImplementationOnce(() => issueTypesResponse); - requestMock.mockImplementationOnce(() => ({ - data: { id: '1', key: 'CK-1', fields: { summary: 'title', description: 'description' } }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { id: '1', key: 'CK-1', fields: { summary: 'title', description: 'description' } }, + }) + ); - requestMock.mockImplementationOnce(() => ({ - data: { id: '1', key: 'CK-1', fields: { created: '2020-04-27T10:59:46.202Z' } }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { id: '1', key: 'CK-1', fields: { created: '2020-04-27T10:59:46.202Z' } }, + }) + ); const res = await service.createIncident({ incident: { @@ -317,25 +388,31 @@ describe('Jira service', () => { }); test('removes newline characters and trialing spaces from summary', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', + }, }, - }, - })); + }) + ); // getIssueType mocks requestMock.mockImplementationOnce(() => issueTypesResponse); // getIssueType mocks - requestMock.mockImplementationOnce(() => ({ - data: { id: '1', key: 'CK-1', fields: { summary: 'test', description: 'description' } }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { id: '1', key: 'CK-1', fields: { summary: 'test', description: 'description' } }, + }) + ); - requestMock.mockImplementationOnce(() => ({ - data: { id: '1', key: 'CK-1', fields: { created: '2020-04-27T10:59:46.202Z' } }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { id: '1', key: 'CK-1', fields: { created: '2020-04-27T10:59:46.202Z' } }, + }) + ); await service.createIncident({ incident: { @@ -368,24 +445,17 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - key: 'CK-1', - fields: { created: '2020-04-27T10:59:46.202Z' }, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + key: 'CK-1', + fields: { created: '2020-04-27T10:59:46.202Z' }, + }, + }) + ); - await service.createIncident({ - incident: { - summary: 'title', - description: 'desc', - labels: [], - issueType: '10006', - priority: 'High', - parent: 'RJ-107', - }, - }); + await service.createIncident(incident); expect(requestMock).toHaveBeenCalledWith({ axios, @@ -414,44 +484,55 @@ describe('Jira service', () => { throw error; }); - await expect( - service.createIncident({ - incident: { - summary: 'title', - description: 'desc', - labels: [], - issueType: '10006', - priority: 'High', - parent: null, - }, - }) - ).rejects.toThrow( + await expect(service.createIncident(incident)).rejects.toThrow( '[Action][Jira]: Unable to create incident. Error: An error has occurred. Reason: Required field' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.createIncident(incident)).rejects.toThrow( + '[Action][Jira]: Unable to create incident. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.createIncident(incident)).rejects.toThrow( + '[Action][Jira]: Unable to create incident. Error: Response is missing at least one of the expected fields: id. Reason: unknown: errorResponse was null' + ); + }); }); describe('updateIncident', () => { + const incident = { + incidentId: '1', + incident: { + summary: 'title', + description: 'desc', + labels: [], + issueType: '10006', + priority: 'High', + parent: 'RJ-107', + }, + }; + test('it updates the incident correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - key: 'CK-1', - fields: { updated: '2020-04-27T10:59:46.202Z' }, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + key: 'CK-1', + fields: { updated: '2020-04-27T10:59:46.202Z' }, + }, + }) + ); - const res = await service.updateIncident({ - incidentId: '1', - incident: { - summary: 'title', - description: 'desc', - labels: [], - issueType: '10006', - priority: 'High', - parent: null, - }, - }); + const res = await service.updateIncident(incident); expect(res).toEqual({ title: 'CK-1', @@ -462,25 +543,17 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - key: 'CK-1', - fields: { updated: '2020-04-27T10:59:46.202Z' }, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + key: 'CK-1', + fields: { updated: '2020-04-27T10:59:46.202Z' }, + }, + }) + ); - await service.updateIncident({ - incidentId: '1', - incident: { - summary: 'title', - description: 'desc', - labels: [], - issueType: '10006', - priority: 'High', - parent: 'RJ-107', - }, - }); + await service.updateIncident(incident); expect(requestMock).toHaveBeenCalledWith({ axios, @@ -509,41 +582,42 @@ describe('Jira service', () => { throw error; }); - await expect( - service.updateIncident({ - incidentId: '1', - incident: { - summary: 'title', - description: 'desc', - labels: [], - issueType: '10006', - priority: 'High', - parent: null, - }, - }) - ).rejects.toThrow( + await expect(service.updateIncident(incident)).rejects.toThrow( '[Action][Jira]: Unable to update incident with id 1. Error: An error has occurred. Reason: Required field' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.updateIncident(incident)).rejects.toThrow( + '[Action][Jira]: Unable to update incident with id 1. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); describe('createComment', () => { + const commentReq = { + incidentId: '1', + comment: { + comment: 'comment', + commentId: 'comment-1', + }, + }; test('it creates the comment correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - key: 'CK-1', - created: '2020-04-27T10:59:46.202Z', - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + key: 'CK-1', + created: '2020-04-27T10:59:46.202Z', + }, + }) + ); - const res = await service.createComment({ - incidentId: '1', - comment: { - comment: 'comment', - commentId: 'comment-1', - }, - }); + const res = await service.createComment(commentReq); expect(res).toEqual({ commentId: 'comment-1', @@ -553,21 +627,17 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - key: 'CK-1', - created: '2020-04-27T10:59:46.202Z', - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + key: 'CK-1', + created: '2020-04-27T10:59:46.202Z', + }, + }) + ); - await service.createComment({ - incidentId: '1', - comment: { - comment: 'comment', - commentId: 'comment-1', - }, - }); + await service.createComment(commentReq); expect(requestMock).toHaveBeenCalledWith({ axios, @@ -586,29 +656,33 @@ describe('Jira service', () => { throw error; }); - await expect( - service.createComment({ - incidentId: '1', - comment: { - comment: 'comment', - commentId: 'comment-1', - }, - }) - ).rejects.toThrow( + await expect(service.createComment(commentReq)).rejects.toThrow( '[Action][Jira]: Unable to create comment at incident with id 1. Error: An error has occurred. Reason: Required field' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.createComment(commentReq)).rejects.toThrow( + '[Action][Jira]: Unable to create comment at incident with id 1. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.createComment(commentReq)).rejects.toThrow( + '[Action][Jira]: Unable to create comment at incident with id 1. Error: Response is missing at least one of the expected fields: id,created. Reason: unknown: errorResponse was null' + ); + }); }); describe('getCapabilities', () => { test('it should return the capabilities', async () => { - requestMock.mockImplementation(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); const res = await service.getCapabilities(); expect(res).toEqual({ capabilities: { @@ -618,13 +692,7 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); await service.getCapabilities(); @@ -649,16 +717,34 @@ describe('Jira service', () => { ); }); - test('it should throw an auth error', async () => { + test('it should return unknown if the error is a string', async () => { requestMock.mockImplementation(() => { const error = new Error('An error has occurred'); - // @ts-ignore this can happen! + // @ts-ignore error.response = { data: 'Unauthorized' }; throw error; }); await expect(service.getCapabilities()).rejects.toThrow( - '[Action][Jira]: Unable to get capabilities. Error: An error has occurred. Reason: Unauthorized' + '[Action][Jira]: Unable to get capabilities. Error: An error has occurred. Reason: unknown: errorResponse.errors was null' + ); + }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getCapabilities()).rejects.toThrow( + '[Action][Jira]: Unable to get capabilities. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.getCapabilities()).rejects.toThrow( + '[Action][Jira]: Unable to get capabilities. Error: Response is missing at least one of the expected fields: capabilities. Reason: unknown: errorResponse was null' ); }); }); @@ -666,13 +752,7 @@ describe('Jira service', () => { describe('getIssueTypes', () => { describe('Old API', () => { test('it should return the issue types', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); requestMock.mockImplementationOnce(() => issueTypesResponse); @@ -691,13 +771,7 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); requestMock.mockImplementationOnce(() => issueTypesResponse); @@ -713,13 +787,7 @@ describe('Jira service', () => { }); test('it should throw an error', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); requestMock.mockImplementation(() => { const error: ResponseError = new Error('An error has occurred'); @@ -731,25 +799,30 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get issue types. Error: An error has occurred. Reason: Could not get issue types' ); }); + + test('it should throw if the request is not a JSON', async () => { + mockOldAPI(); + + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIssueTypes()).rejects.toThrow( + '[Action][Jira]: Unable to get issue types. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); describe('New API', () => { test('it should return the issue types', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', - }, - }, - })); + mockNewAPI(); - requestMock.mockImplementationOnce(() => ({ - data: { - values: issueTypesResponse.data.projects[0].issuetypes, - }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: issueTypesResponse.data.projects[0].issuetypes, + }, + }) + ); const res = await service.getIssueTypes(); @@ -766,22 +839,15 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', - }, - }, - })); + mockNewAPI(); - requestMock.mockImplementationOnce(() => ({ - data: { - values: issueTypesResponse.data.projects[0].issuetypes, - }, - })); + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: issueTypesResponse.data.projects[0].issuetypes, + }, + }) + ); await service.getIssueTypes(); @@ -795,16 +861,7 @@ describe('Jira service', () => { }); test('it should throw an error', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', - }, - }, - })); + mockNewAPI(); requestMock.mockImplementation(() => { const error: ResponseError = new Error('An error has occurred'); @@ -816,19 +873,25 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get issue types. Error: An error has occurred. Reason: Could not get issue types' ); }); + + test('it should throw if the request is not a JSON', async () => { + mockNewAPI(); + + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIssueTypes()).rejects.toThrow( + '[Action][Jira]: Unable to get issue types. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); }); describe('getFieldsByIssueType', () => { describe('Old API', () => { test('it should return the fields', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); requestMock.mockImplementationOnce(() => fieldsResponse); @@ -857,13 +920,7 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); requestMock.mockImplementationOnce(() => fieldsResponse); @@ -879,13 +936,7 @@ describe('Jira service', () => { }); test('it should throw an error', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - navigation: 'https://siem-kibana.atlassian.net/rest/capabilities/navigation', - }, - }, - })); + mockOldAPI(); requestMock.mockImplementation(() => { const error: ResponseError = new Error('An error has occurred'); @@ -897,43 +948,48 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get fields. Error: An error has occurred. Reason: Could not get fields' ); }); + + test('it should throw if the request is not a JSON', async () => { + mockOldAPI(); + + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getFieldsByIssueType('10006')).rejects.toThrow( + '[Action][Jira]: Unable to get fields. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); describe('New API', () => { test('it should return the fields', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', - }, - }, - })); - - requestMock.mockImplementationOnce(() => ({ - data: { - values: [ - { required: true, schema: { type: 'string' }, fieldId: 'summary' }, - { - required: false, - schema: { type: 'string' }, - fieldId: 'priority', - allowedValues: [ - { + mockNewAPI(); + + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: [ + { required: true, schema: { type: 'string' }, fieldId: 'summary' }, + { + required: false, + schema: { type: 'string' }, + fieldId: 'priority', + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + ], + defaultValue: { name: 'Medium', id: '3', }, - ], - defaultValue: { - name: 'Medium', - id: '3', }, - }, - ], - }, - })); + ], + }, + }) + ); const res = await service.getFieldsByIssueType('10006'); @@ -954,39 +1010,32 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', - }, - }, - })); - - requestMock.mockImplementationOnce(() => ({ - data: { - values: [ - { required: true, schema: { type: 'string' }, fieldId: 'summary' }, - { - required: true, - schema: { type: 'string' }, - fieldId: 'priority', - allowedValues: [ - { + mockNewAPI(); + + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: [ + { required: true, schema: { type: 'string' }, fieldId: 'summary' }, + { + required: true, + schema: { type: 'string' }, + fieldId: 'priority', + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + ], + defaultValue: { name: 'Medium', id: '3', }, - ], - defaultValue: { - name: 'Medium', - id: '3', }, - }, - ], - }, - })); + ], + }, + }) + ); await service.getFieldsByIssueType('10006'); @@ -1000,16 +1049,7 @@ describe('Jira service', () => { }); test('it should throw an error', async () => { - requestMock.mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', - }, - }, - })); + mockNewAPI(); requestMock.mockImplementation(() => { const error: ResponseError = new Error('An error has occurred'); @@ -1021,16 +1061,30 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get fields. Error: An error has occurred. Reason: Could not get issue types' ); }); + + test('it should throw if the request is not a JSON', async () => { + mockNewAPI(); + + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getFieldsByIssueType('10006')).rejects.toThrow( + '[Action][Jira]: Unable to get fields. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); }); describe('getIssues', () => { test('it should return the issues', async () => { - requestMock.mockImplementation(() => ({ - data: { - issues: issuesResponse, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + issues: issuesResponse, + }, + }) + ); const res = await service.getIssues('Test title'); @@ -1044,11 +1098,13 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - issues: issuesResponse, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + issues: issuesResponse, + }, + }) + ); await service.getIssues('Test title'); expect(requestMock).toHaveBeenLastCalledWith({ @@ -1071,13 +1127,25 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get issues. Error: An error has occurred. Reason: Could not get issue types' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIssues('Test title')).rejects.toThrow( + '[Action][Jira]: Unable to get issues. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); describe('getIssue', () => { test('it should return a single issue', async () => { - requestMock.mockImplementation(() => ({ - data: issueResponse, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: issueResponse, + }) + ); const res = await service.getIssue('RJ-107'); @@ -1089,11 +1157,13 @@ describe('Jira service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - issues: issuesResponse, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + issues: issuesResponse, + }, + }) + ); await service.getIssue('RJ-107'); expect(requestMock).toHaveBeenLastCalledWith({ @@ -1116,81 +1186,105 @@ describe('Jira service', () => { '[Action][Jira]: Unable to get issue with id RJ-107. Error: An error has occurred. Reason: Could not get issue types' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIssue('Test title')).rejects.toThrow( + '[Action][Jira]: Unable to get issue with id Test title. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown: errorResponse was null' + ); + }); }); describe('getFields', () => { const callMocks = () => { requestMock - .mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + .mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + 'list-project-issuetypes': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', + 'list-issuetype-fields': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + }, }, - }, - })) - .mockImplementationOnce(() => ({ - data: { - values: issueTypesResponse.data.projects[0].issuetypes, - }, - })) - .mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + }) + ) + .mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: issueTypesResponse.data.projects[0].issuetypes, }, - }, - })) - .mockImplementationOnce(() => ({ - data: { - capabilities: { - 'list-project-issuetypes': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', - 'list-issuetype-fields': - 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + }) + ) + .mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + 'list-project-issuetypes': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', + 'list-issuetype-fields': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + }, }, - }, - })) - .mockImplementationOnce(() => ({ - data: { - values: [ - { required: true, schema: { type: 'string' }, fieldId: 'summary' }, - { required: true, schema: { type: 'string' }, fieldId: 'description' }, - { - required: false, - schema: { type: 'string' }, - fieldId: 'priority', - allowedValues: [ - { + }) + ) + .mockImplementationOnce(() => + createAxiosResponse({ + data: { + capabilities: { + 'list-project-issuetypes': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-project-issuetypes', + 'list-issuetype-fields': + 'https://siem-kibana.atlassian.net/rest/capabilities/list-issuetype-fields', + }, + }, + }) + ) + .mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: [ + { required: true, schema: { type: 'string' }, fieldId: 'summary' }, + { required: true, schema: { type: 'string' }, fieldId: 'description' }, + { + required: false, + schema: { type: 'string' }, + fieldId: 'priority', + allowedValues: [ + { + name: 'Medium', + id: '3', + }, + ], + defaultValue: { name: 'Medium', id: '3', }, - ], - defaultValue: { - name: 'Medium', - id: '3', }, - }, - ], - }, - })) - .mockImplementationOnce(() => ({ - data: { - values: [ - { required: true, schema: { type: 'string' }, fieldId: 'summary' }, - { required: true, schema: { type: 'string' }, fieldId: 'description' }, - ], - }, - })); + ], + }, + }) + ) + .mockImplementationOnce(() => + createAxiosResponse({ + data: { + values: [ + { required: true, schema: { type: 'string' }, fieldId: 'summary' }, + { required: true, schema: { type: 'string' }, fieldId: 'description' }, + ], + }, + }) + ); }; + beforeEach(() => { jest.resetAllMocks(); }); + test('it should call request with correct arguments', async () => { callMocks(); await service.getFields(); diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts index be0240e705a65..a3262a526e2f4 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.ts @@ -27,7 +27,7 @@ import { } from './types'; import * as i18n from './translations'; -import { request, getErrorMessage } from '../lib/axios_utils'; +import { request, getErrorMessage, throwIfResponseIsNotValid } from '../lib/axios_utils'; import { ActionsConfigurationUtilities } from '../../actions_config'; const VERSION = '2'; @@ -111,19 +111,15 @@ export const createExternalService = ( .filter((item) => !isEmpty(item)) .join(', '); - const createErrorMessage = (errorResponse: ResponseError | string | null | undefined): string => { + const createErrorMessage = (errorResponse: ResponseError | null | undefined): string => { if (errorResponse == null) { - return ''; - } - if (typeof errorResponse === 'string') { - // Jira error.response.data can be string!! - return errorResponse; + return 'unknown: errorResponse was null'; } const { errorMessages, errors } = errorResponse; if (errors == null) { - return ''; + return 'unknown: errorResponse.errors was null'; } if (Array.isArray(errorMessages) && errorMessages.length > 0) { @@ -185,9 +181,14 @@ export const createExternalService = ( configurationUtilities, }); - const { fields, ...rest } = res.data; + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['id', 'key'], + }); + + const { fields, id: incidentId, key } = res.data; - return { ...rest, ...fields }; + return { id: incidentId, key, created: fields.created, updated: fields.updated, ...fields }; } catch (error) { throw new Error( getErrorMessage( @@ -234,6 +235,11 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['id'], + }); + const updatedIncident = await getIncident(res.data.id); return { @@ -266,7 +272,7 @@ export const createExternalService = ( const fields = createFields(projectKey, incidentWithoutNullValues); try { - await request({ + const res = await request({ axios: axiosInstance, method: 'put', url: `${incidentUrl}/${incidentId}`, @@ -275,6 +281,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const updatedIncident = await getIncident(incidentId as string); return { @@ -309,6 +319,11 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['id', 'created'], + }); + return { commentId: comment.commentId, externalCommentId: res.data.id, @@ -336,6 +351,11 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['capabilities'], + }); + return { ...res.data }; } catch (error) { throw new Error( @@ -362,6 +382,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const issueTypes = res.data.projects[0]?.issuetypes ?? []; return normalizeIssueTypes(issueTypes); } else { @@ -373,6 +397,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const issueTypes = res.data.values; return normalizeIssueTypes(issueTypes); } @@ -401,6 +429,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const fields = res.data.projects[0]?.issuetypes[0]?.fields || {}; return normalizeFields(fields); } else { @@ -412,6 +444,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const fields = res.data.values.reduce( (acc: { [x: string]: {} }, value: { fieldId: string }) => ({ ...acc, @@ -471,6 +507,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + return normalizeSearchResults(res.data?.issues ?? []); } catch (error) { throw new Error( @@ -495,6 +535,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + return normalizeIssue(res.data ?? {}); } catch (error) { throw new Error( diff --git a/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts b/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts index 287f74c6bc703..d0177e0e5a8a2 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts @@ -10,7 +10,14 @@ import { Agent as HttpsAgent } from 'https'; import HttpProxyAgent from 'http-proxy-agent'; import { HttpsProxyAgent } from 'https-proxy-agent'; import { Logger } from '../../../../../../src/core/server'; -import { addTimeZoneToDate, request, patch, getErrorMessage } from './axios_utils'; +import { + addTimeZoneToDate, + request, + patch, + getErrorMessage, + throwIfResponseIsNotValid, + createAxiosResponse, +} from './axios_utils'; import { loggingSystemMock } from '../../../../../../src/core/server/mocks'; import { actionsConfigMock } from '../../actions_config.mock'; import { getCustomAgents } from './get_custom_agents'; @@ -292,3 +299,82 @@ describe('getErrorMessage', () => { expect(msg).toBe('[Action][My connector name]: An error has occurred'); }); }); + +describe('throwIfResponseIsNotValid', () => { + const res = createAxiosResponse({ + headers: { ['content-type']: 'application/json' }, + data: { incident: { id: '1' } }, + }); + + test('it does NOT throw if the request is valid', () => { + expect(() => throwIfResponseIsNotValid({ res })).not.toThrow(); + }); + + test('it does throw if the content-type is not json', () => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, headers: { ['content-type']: 'text/html' } }, + }) + ).toThrow( + 'Unsupported content type: text/html in GET https://example.com. Supported content types: application/json' + ); + }); + + test('it does throw if the content-type is undefined', () => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, headers: {} }, + }) + ).toThrow( + 'Unsupported content type: undefined in GET https://example.com. Supported content types: application/json' + ); + }); + + test('it does throw if the data is not an object or array', () => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, data: 'string' }, + }) + ).toThrow('Response is not a valid JSON'); + }); + + test('it does NOT throw if the data is an array', () => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, data: ['test'] }, + }) + ).not.toThrow(); + }); + + test.each(['', [], {}])('it does NOT throw if the data is %p', (data) => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, data }, + }) + ).not.toThrow(); + }); + + test('it does throw if the required attribute is not in the response', () => { + expect(() => + throwIfResponseIsNotValid({ res, requiredAttributesToBeInTheResponse: ['not-exist'] }) + ).toThrow('Response is missing at least one of the expected fields: not-exist'); + }); + + test('it does throw if the required attribute are defined and the data is an array', () => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, data: ['test'] }, + requiredAttributesToBeInTheResponse: ['not-exist'], + }) + ).toThrow('Response is missing at least one of the expected fields: not-exist'); + }); + + test('it does NOT throw if the value of the required attribute is null', () => { + expect(() => + throwIfResponseIsNotValid({ + res: { ...res, data: { id: null } }, + requiredAttributesToBeInTheResponse: ['id'], + }) + ).not.toThrow(); + }); +}); diff --git a/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.ts b/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.ts index af353e1d1da5a..43c9d276e6574 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { isObjectLike, isEmpty } from 'lodash'; import { AxiosInstance, Method, AxiosResponse, AxiosBasicCredentials } from 'axios'; import { Logger } from '../../../../../../src/core/server'; import { getCustomAgents } from './get_custom_agents'; @@ -76,3 +77,70 @@ export const addTimeZoneToDate = (date: string, timezone = 'GMT'): string => { export const getErrorMessage = (connector: string, msg: string) => { return `[Action][${connector}]: ${msg}`; }; + +export const throwIfResponseIsNotValid = ({ + res, + requiredAttributesToBeInTheResponse = [], +}: { + res: AxiosResponse; + requiredAttributesToBeInTheResponse?: string[]; +}) => { + const requiredContentType = 'application/json'; + const contentType = res.headers['content-type'] ?? 'undefined'; + const data = res.data; + + /** + * Check that the content-type of the response is application/json. + * Then includes is added because the header can be application/json;charset=UTF-8. + */ + if (!contentType.includes(requiredContentType)) { + throw new Error( + `Unsupported content type: ${contentType} in ${res.config.method} ${res.config.url}. Supported content types: ${requiredContentType}` + ); + } + + /** + * Check if the response is a JS object (data != null && typeof data === 'object') + * in case the content type is application/json but for some reason the response is not. + * Empty responses (204 No content) are ignored because the typeof data will be string and + * isObjectLike will fail. + * Axios converts automatically JSON to JS objects. + */ + if (!isEmpty(data) && !isObjectLike(data)) { + throw new Error('Response is not a valid JSON'); + } + + if (requiredAttributesToBeInTheResponse.length > 0) { + const requiredAttributesError = new Error( + `Response is missing at least one of the expected fields: ${requiredAttributesToBeInTheResponse.join( + ',' + )}` + ); + + /** + * If the response is an array and requiredAttributesToBeInTheResponse + * are not empty then we thrown an error assuming that the consumer + * expects an object response and not an array. + */ + + if (Array.isArray(data)) { + throw requiredAttributesError; + } + + requiredAttributesToBeInTheResponse.forEach((attr) => { + // Check only for undefined as null is a valid value + if (data[attr] === undefined) { + throw requiredAttributesError; + } + }); + } +}; + +export const createAxiosResponse = (res: Partial): AxiosResponse => ({ + data: {}, + status: 200, + statusText: 'OK', + headers: { ['content-type']: 'application/json' }, + config: { method: 'GET', url: 'https://example.com' }, + ...res, +}); diff --git a/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts index ba55543386225..094b8150850df 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts @@ -8,7 +8,7 @@ import axios from 'axios'; import { createExternalService, getValueTextContent, formatUpdateRequest } from './service'; -import * as utils from '../lib/axios_utils'; +import { request, createAxiosResponse } from '../lib/axios_utils'; import { ExternalService } from './types'; import { Logger } from '../../../../../../src/core/server'; import { loggingSystemMock } from '../../../../../../src/core/server/mocks'; @@ -27,7 +27,7 @@ jest.mock('../lib/axios_utils', () => { }); axios.create = jest.fn(() => axios); -const requestMock = utils.request as jest.Mock; +const requestMock = request as jest.Mock; const now = Date.now; const TIMESTAMP = 1589391874472; const configurationUtilities = actionsConfigMock.create(); @@ -38,44 +38,50 @@ const configurationUtilities = actionsConfigMock.create(); // b) Update the incident // c) Get the updated incident const mockIncidentUpdate = (withUpdateError = false) => { - requestMock.mockImplementationOnce(() => ({ - data: { - id: '1', - name: 'title', - description: { - format: 'html', - content: 'description', + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + id: '1', + name: 'title', + description: { + format: 'html', + content: 'description', + }, + incident_type_ids: [1001, 16, 12], + severity_code: 6, }, - incident_type_ids: [1001, 16, 12], - severity_code: 6, - }, - })); + }) + ); if (withUpdateError) { requestMock.mockImplementationOnce(() => { throw new Error('An error has occurred'); }); } else { - requestMock.mockImplementationOnce(() => ({ + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + success: true, + id: '1', + inc_last_modified_date: 1589391874472, + }, + }) + ); + } + + requestMock.mockImplementationOnce(() => + createAxiosResponse({ data: { - success: true, id: '1', + name: 'title_updated', + description: { + format: 'html', + content: 'desc_updated', + }, inc_last_modified_date: 1589391874472, }, - })); - } - - requestMock.mockImplementationOnce(() => ({ - data: { - id: '1', - name: 'title_updated', - description: { - format: 'html', - content: 'desc_updated', - }, - inc_last_modified_date: 1589391874472, - }, - })); + }) + ); }; describe('IBM Resilient service', () => { @@ -207,24 +213,28 @@ describe('IBM Resilient service', () => { describe('getIncident', () => { test('it returns the incident correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - name: '1', - description: { - format: 'html', - content: 'description', + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + name: '1', + description: { + format: 'html', + content: 'description', + }, }, - }, - })); + }) + ); const res = await service.getIncident('1'); expect(res).toEqual({ id: '1', name: '1', description: 'description' }); }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { id: '1' }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { id: '1' }, + }) + ); await service.getIncident('1'); expect(requestMock).toHaveBeenCalledWith({ @@ -246,28 +256,42 @@ describe('IBM Resilient service', () => { 'Unable to get incident with id 1. Error: An error has occurred' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIncident('1')).rejects.toThrow( + '[Action][IBM Resilient]: Unable to get incident with id 1. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json.' + ); + }); }); describe('createIncident', () => { + const incident = { + incident: { + name: 'title', + description: 'desc', + incidentTypes: [1001], + severityCode: 6, + }, + }; + test('it creates the incident correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - name: 'title', - description: 'description', - discovered_date: 1589391874472, - create_date: 1589391874472, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + name: 'title', + description: 'description', + discovered_date: 1589391874472, + create_date: 1589391874472, + }, + }) + ); - const res = await service.createIncident({ - incident: { - name: 'title', - description: 'desc', - incidentTypes: [1001], - severityCode: 6, - }, - }); + const res = await service.createIncident(incident); expect(res).toEqual({ title: '1', @@ -278,24 +302,19 @@ describe('IBM Resilient service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - name: 'title', - description: 'description', - discovered_date: 1589391874472, - create_date: 1589391874472, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + name: 'title', + description: 'description', + discovered_date: 1589391874472, + create_date: 1589391874472, + }, + }) + ); - await service.createIncident({ - incident: { - name: 'title', - description: 'desc', - incidentTypes: [1001], - severityCode: 6, - }, - }); + await service.createIncident(incident); expect(requestMock).toHaveBeenCalledWith({ axios, @@ -334,20 +353,39 @@ describe('IBM Resilient service', () => { '[Action][IBM Resilient]: Unable to create incident. Error: An error has occurred' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.createIncident(incident)).rejects.toThrow( + '[Action][IBM Resilient]: Unable to create incident. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json.' + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.createIncident(incident)).rejects.toThrow( + '[Action][IBM Resilient]: Unable to create incident. Error: Response is missing at least one of the expected fields: id,create_date.' + ); + }); }); describe('updateIncident', () => { + const req = { + incidentId: '1', + incident: { + name: 'title', + description: 'desc', + incidentTypes: [1001], + severityCode: 6, + }, + }; test('it updates the incident correctly', async () => { mockIncidentUpdate(); - const res = await service.updateIncident({ - incidentId: '1', - incident: { - name: 'title', - description: 'desc', - incidentTypes: [1001], - severityCode: 6, - }, - }); + const res = await service.updateIncident(req); expect(res).toEqual({ title: '1', @@ -430,38 +468,59 @@ describe('IBM Resilient service', () => { test('it should throw an error', async () => { mockIncidentUpdate(true); - await expect( - service.updateIncident({ - incidentId: '1', - incident: { + await expect(service.updateIncident(req)).rejects.toThrow( + '[Action][IBM Resilient]: Unable to update incident with id 1. Error: An error has occurred' + ); + }); + + test('it should throw if the request is not a JSON', async () => { + // get incident request + requestMock.mockImplementationOnce(() => + createAxiosResponse({ + data: { + id: '1', name: 'title', - description: 'desc', - incidentTypes: [1001], - severityCode: 5, + description: { + format: 'html', + content: 'description', + }, + incident_type_ids: [1001, 16, 12], + severity_code: 6, }, }) - ).rejects.toThrow( - '[Action][IBM Resilient]: Unable to update incident with id 1. Error: An error has occurred' + ); + + // update incident request + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.updateIncident(req)).rejects.toThrow( + '[Action][IBM Resilient]: Unable to update incident with id 1. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json' ); }); }); describe('createComment', () => { + const req = { + incidentId: '1', + comment: { + comment: 'comment', + commentId: 'comment-1', + }, + }; + test('it creates the comment correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - create_date: 1589391874472, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + create_date: 1589391874472, + }, + }) + ); - const res = await service.createComment({ - incidentId: '1', - comment: { - comment: 'comment', - commentId: 'comment-1', - }, - }); + const res = await service.createComment(req); expect(res).toEqual({ commentId: 'comment-1', @@ -471,20 +530,16 @@ describe('IBM Resilient service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: { - id: '1', - create_date: 1589391874472, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + id: '1', + create_date: 1589391874472, + }, + }) + ); - await service.createComment({ - incidentId: '1', - comment: { - comment: 'comment', - commentId: 'comment-1', - }, - }); + await service.createComment(req); expect(requestMock).toHaveBeenCalledWith({ axios, @@ -506,27 +561,31 @@ describe('IBM Resilient service', () => { throw new Error('An error has occurred'); }); - await expect( - service.createComment({ - incidentId: '1', - comment: { - comment: 'comment', - commentId: 'comment-1', - }, - }) - ).rejects.toThrow( + await expect(service.createComment(req)).rejects.toThrow( '[Action][IBM Resilient]: Unable to create comment at incident with id 1. Error: An error has occurred' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.createComment(req)).rejects.toThrow( + '[Action][IBM Resilient]: Unable to create comment at incident with id 1. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json.' + ); + }); }); describe('getIncidentTypes', () => { test('it creates the incident correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - values: incidentTypes, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + values: incidentTypes, + }, + }) + ); const res = await service.getIncidentTypes(); @@ -545,15 +604,27 @@ describe('IBM Resilient service', () => { '[Action][IBM Resilient]: Unable to get incident types. Error: An error has occurred.' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getIncidentTypes()).rejects.toThrow( + '[Action][IBM Resilient]: Unable to get incident types. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json.' + ); + }); }); describe('getSeverity', () => { test('it creates the incident correctly', async () => { - requestMock.mockImplementation(() => ({ - data: { - values: severity, - }, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: { + values: severity, + }, + }) + ); const res = await service.getSeverity(); @@ -578,17 +649,29 @@ describe('IBM Resilient service', () => { throw new Error('An error has occurred'); }); - await expect(service.getIncidentTypes()).rejects.toThrow( - '[Action][IBM Resilient]: Unable to get incident types. Error: An error has occurred.' + await expect(service.getSeverity()).rejects.toThrow( + '[Action][IBM Resilient]: Unable to get severity. Error: An error has occurred.' + ); + }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getSeverity()).rejects.toThrow( + '[Action][IBM Resilient]: Unable to get severity. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json.' ); }); }); describe('getFields', () => { test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data: resilientFields, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: resilientFields, + }) + ); await service.getFields(); expect(requestMock).toHaveBeenCalledWith({ @@ -598,10 +681,13 @@ describe('IBM Resilient service', () => { url: 'https://resilient.elastic.co/rest/orgs/201/types/incident/fields', }); }); + test('it returns common fields correctly', async () => { - requestMock.mockImplementation(() => ({ - data: resilientFields, - })); + requestMock.mockImplementation(() => + createAxiosResponse({ + data: resilientFields, + }) + ); const res = await service.getFields(); expect(res).toEqual(resilientFields); }); @@ -614,5 +700,15 @@ describe('IBM Resilient service', () => { 'Unable to get fields. Error: An error has occurred' ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data: { id: '1' }, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.getFields()).rejects.toThrow( + '[Action][IBM Resilient]: Unable to get fields. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json.' + ); + }); }); }); diff --git a/x-pack/plugins/actions/server/builtin_action_types/resilient/service.ts b/x-pack/plugins/actions/server/builtin_action_types/resilient/service.ts index 2f385315e4392..a469c631fac37 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/resilient/service.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/resilient/service.ts @@ -24,7 +24,7 @@ import { } from './types'; import * as i18n from './translations'; -import { getErrorMessage, request } from '../lib/axios_utils'; +import { getErrorMessage, request, throwIfResponseIsNotValid } from '../lib/axios_utils'; import { ActionsConfigurationUtilities } from '../../actions_config'; const VIEW_INCIDENT_URL = `#incidents`; @@ -134,6 +134,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + return { ...res.data, description: res.data.description?.content ?? '' }; } catch (error) { throw new Error( @@ -182,6 +186,11 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['id', 'create_date'], + }); + return { title: `${res.data.id}`, id: `${res.data.id}`, @@ -212,6 +221,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + if (!res.data.success) { throw new Error(res.data.message); } @@ -245,6 +258,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + return { commentId: comment.commentId, externalCommentId: res.data.id, @@ -270,6 +287,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const incidentTypes = res.data?.values ?? []; return incidentTypes.map((type: { value: string; label: string }) => ({ id: type.value, @@ -292,6 +313,10 @@ export const createExternalService = ( configurationUtilities, }); + throwIfResponseIsNotValid({ + res, + }); + const incidentTypes = res.data?.values ?? []; return incidentTypes.map((type: { value: string; label: string }) => ({ id: type.value, @@ -312,6 +337,11 @@ export const createExternalService = ( logger, configurationUtilities, }); + + throwIfResponseIsNotValid({ + res, + }); + return res.data ?? []; } catch (error) { throw new Error(getErrorMessage(i18n.NAME, `Unable to get fields. Error: ${error.message}.`)); diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.test.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.test.ts index 358af7cd2e9ef..e5a161611fcb1 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.test.ts @@ -132,7 +132,7 @@ describe('api_sir', () => { }); describe('prepareParams', () => { - test('it prepares the params correctly when the connector is legacy', async () => { + test('it prepares the params correctly when the connector uses the old API', async () => { expect(prepareParams(true, sirParams)).toEqual({ ...sirParams, incident: { @@ -145,7 +145,7 @@ describe('api_sir', () => { }); }); - test('it prepares the params correctly when the connector is not legacy', async () => { + test('it prepares the params correctly when the connector does not uses the old API', async () => { expect(prepareParams(false, sirParams)).toEqual({ ...sirParams, incident: { @@ -158,7 +158,7 @@ describe('api_sir', () => { }); }); - test('it prepares the params correctly when the connector is legacy and the observables are undefined', async () => { + test('it prepares the params correctly when the connector uses the old API and the observables are undefined', async () => { const { dest_ip: destIp, source_ip: sourceIp, @@ -192,7 +192,7 @@ describe('api_sir', () => { const res = await apiSIR.pushToService({ externalService, params, - config: { isLegacy: false }, + config: { usesTableApi: false }, secrets: {}, logger: mockedLogger, commentFieldKey: 'work_notes', @@ -221,7 +221,7 @@ describe('api_sir', () => { await apiSIR.pushToService({ externalService, params, - config: { isLegacy: false }, + config: { usesTableApi: false }, secrets: {}, logger: mockedLogger, commentFieldKey: 'work_notes', @@ -244,12 +244,12 @@ describe('api_sir', () => { ); }); - test('it does not call bulkAddObservableToIncident if it a legacy connector', async () => { + test('it does not call bulkAddObservableToIncident if the connector uses the old API', async () => { const params = { ...sirParams, incident: { ...sirParams.incident, externalId: null } }; await apiSIR.pushToService({ externalService, params, - config: { isLegacy: true }, + config: { usesTableApi: true }, secrets: {}, logger: mockedLogger, commentFieldKey: 'work_notes', @@ -274,7 +274,7 @@ describe('api_sir', () => { await apiSIR.pushToService({ externalService, params, - config: { isLegacy: false }, + config: { usesTableApi: false }, secrets: {}, logger: mockedLogger, commentFieldKey: 'work_notes', diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.ts index 326bb79a0e708..4e74d79c6f4a0 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/api_sir.ts @@ -59,13 +59,13 @@ const observablesToString = (obs: string | string[] | null | undefined): string }; export const prepareParams = ( - isLegacy: boolean, + usesTableApi: boolean, params: PushToServiceApiParamsSIR ): PushToServiceApiParamsSIR => { - if (isLegacy) { + if (usesTableApi) { /** * The schema has change to accept an array of observables - * or a string. In the case of a legacy connector we need to + * or a string. In the case of connector that uses the old API we need to * convert the observables to a string */ return { @@ -81,8 +81,8 @@ export const prepareParams = ( } /** - * For non legacy connectors the observables - * will be added in a different call. + * For connectors that do not use the old API + * the observables will be added in a different call. * They need to be set to null when sending the fields * to ServiceNow */ @@ -108,7 +108,7 @@ const pushToServiceHandler = async ({ }: PushToServiceApiHandlerArgs): Promise => { const res = await api.pushToService({ externalService, - params: prepareParams(!!config.isLegacy, params as PushToServiceApiParamsSIR), + params: prepareParams(!!config.usesTableApi, params as PushToServiceApiParamsSIR), config, secrets, commentFieldKey, @@ -130,7 +130,7 @@ const pushToServiceHandler = async ({ * through the pushToService call. */ - if (!config.isLegacy) { + if (!config.usesTableApi) { const sirExternalService = externalService as ExternalServiceSIR; const obsWithType: Array<[string[], ObservableTypes]> = [ diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/schema.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/schema.ts index 5f57555a8f9e1..e41eea24834c7 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/schema.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/schema.ts @@ -14,7 +14,7 @@ export const ExternalIncidentServiceConfigurationBase = { export const ExternalIncidentServiceConfiguration = { ...ExternalIncidentServiceConfigurationBase, - isLegacy: schema.boolean({ defaultValue: false }), + usesTableApi: schema.boolean({ defaultValue: true }), }; export const ExternalIncidentServiceConfigurationBaseSchema = schema.object( @@ -49,7 +49,7 @@ const CommonAttributes = { externalId: schema.nullable(schema.string()), category: schema.nullable(schema.string()), subcategory: schema.nullable(schema.string()), - correlation_id: schema.nullable(schema.string()), + correlation_id: schema.nullable(schema.string({ defaultValue: DEFAULT_ALERTS_GROUPING_KEY })), correlation_display: schema.nullable(schema.string()), }; diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.ts index cb030c7bb6933..c90a7222ba10b 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.ts @@ -35,7 +35,8 @@ export const createExternalService: ServiceFactory = ( configurationUtilities: ActionsConfigurationUtilities, { table, importSetTable, useImportAPI, appScope }: SNProductsConfigValue ): ExternalService => { - const { apiUrl: url, isLegacy } = config as ServiceNowPublicConfigurationType; + const { apiUrl: url, usesTableApi: usesTableApiConfigValue } = + config as ServiceNowPublicConfigurationType; const { username, password } = secrets as ServiceNowSecretConfigurationType; if (!url || !username || !password) { @@ -57,11 +58,11 @@ export const createExternalService: ServiceFactory = ( auth: { username, password }, }); - const useOldApi = !useImportAPI || isLegacy; + const useTableApi = !useImportAPI || usesTableApiConfigValue; - const getCreateIncidentUrl = () => (useOldApi ? tableApiIncidentUrl : importSetTableUrl); + const getCreateIncidentUrl = () => (useTableApi ? tableApiIncidentUrl : importSetTableUrl); const getUpdateIncidentUrl = (incidentId: string) => - useOldApi ? `${tableApiIncidentUrl}/${incidentId}` : importSetTableUrl; + useTableApi ? `${tableApiIncidentUrl}/${incidentId}` : importSetTableUrl; const getIncidentViewURL = (id: string) => { // Based on: https://docs.servicenow.com/bundle/orlando-platform-user-interface/page/use/navigation/reference/r_NavigatingByURLExamples.html @@ -105,7 +106,7 @@ export const createExternalService: ServiceFactory = ( /** * Gets the Elastic SN Application information including the current version. - * It should not be used on legacy connectors. + * It should not be used on connectors that use the old API. */ const getApplicationInformation = async (): Promise => { try { @@ -129,7 +130,7 @@ export const createExternalService: ServiceFactory = ( logger.debug(`Create incident: Application scope: ${scope}: Application version${version}`); const checkIfApplicationIsInstalled = async () => { - if (!useOldApi) { + if (!useTableApi) { const { version, scope } = await getApplicationInformation(); logApplicationInfo(scope, version); } @@ -180,17 +181,17 @@ export const createExternalService: ServiceFactory = ( url: getCreateIncidentUrl(), logger, method: 'post', - data: prepareIncident(useOldApi, incident), + data: prepareIncident(useTableApi, incident), configurationUtilities, }); checkInstance(res); - if (!useOldApi) { + if (!useTableApi) { throwIfImportSetApiResponseIsAnError(res.data); } - const incidentId = useOldApi ? res.data.result.sys_id : res.data.result[0].sys_id; + const incidentId = useTableApi ? res.data.result.sys_id : res.data.result[0].sys_id; const insertedIncident = await getIncident(incidentId); return { @@ -212,23 +213,23 @@ export const createExternalService: ServiceFactory = ( axios: axiosInstance, url: getUpdateIncidentUrl(incidentId), // Import Set API supports only POST. - method: useOldApi ? 'patch' : 'post', + method: useTableApi ? 'patch' : 'post', logger, data: { - ...prepareIncident(useOldApi, incident), + ...prepareIncident(useTableApi, incident), // elastic_incident_id is used to update the incident when using the Import Set API. - ...(useOldApi ? {} : { elastic_incident_id: incidentId }), + ...(useTableApi ? {} : { elastic_incident_id: incidentId }), }, configurationUtilities, }); checkInstance(res); - if (!useOldApi) { + if (!useTableApi) { throwIfImportSetApiResponseIsAnError(res.data); } - const id = useOldApi ? res.data.result.sys_id : res.data.result[0].sys_id; + const id = useTableApi ? res.data.result.sys_id : res.data.result[0].sys_id; const updatedIncident = await getIncident(id); return { diff --git a/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.test.ts index 7b3f310a99e0e..21bc4894c5717 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.test.ts @@ -10,7 +10,7 @@ import axios from 'axios'; import { loggingSystemMock } from '../../../../../../src/core/server/mocks'; import { Logger } from '../../../../../../src/core/server'; import { actionsConfigMock } from '../../actions_config.mock'; -import * as utils from '../lib/axios_utils'; +import { request, createAxiosResponse } from '../lib/axios_utils'; import { createExternalService } from './service'; import { mappings } from './mocks'; import { ExternalService } from './types'; @@ -27,7 +27,7 @@ jest.mock('../lib/axios_utils', () => { }); axios.create = jest.fn(() => axios); -const requestMock = utils.request as jest.Mock; +const requestMock = request as jest.Mock; const configurationUtilities = actionsConfigMock.create(); describe('Swimlane Service', () => { @@ -152,9 +152,7 @@ describe('Swimlane Service', () => { }; test('it creates a record correctly', async () => { - requestMock.mockImplementation(() => ({ - data, - })); + requestMock.mockImplementation(() => createAxiosResponse({ data })); const res = await service.createRecord({ incident, @@ -169,9 +167,7 @@ describe('Swimlane Service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data, - })); + requestMock.mockImplementation(() => createAxiosResponse({ data })); await service.createRecord({ incident, @@ -207,6 +203,24 @@ describe('Swimlane Service', () => { `[Action][Swimlane]: Unable to create record in application with id ${config.appId}. Status: 500. Error: An error has occurred. Reason: unknown` ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.createRecord({ incident })).rejects.toThrow( + `[Action][Swimlane]: Unable to create record in application with id ${config.appId}. Status: 500. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown` + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.createRecord({ incident })).rejects.toThrow( + `[Action][Swimlane]: Unable to create record in application with id ${config.appId}. Status: 500. Error: Response is missing at least one of the expected fields: id,name,createdDate. Reason: unknown` + ); + }); }); describe('updateRecord', () => { @@ -218,9 +232,7 @@ describe('Swimlane Service', () => { const incidentId = '123'; test('it updates a record correctly', async () => { - requestMock.mockImplementation(() => ({ - data, - })); + requestMock.mockImplementation(() => createAxiosResponse({ data })); const res = await service.updateRecord({ incident, @@ -236,9 +248,7 @@ describe('Swimlane Service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data, - })); + requestMock.mockImplementation(() => createAxiosResponse({ data })); await service.updateRecord({ incident, @@ -276,6 +286,24 @@ describe('Swimlane Service', () => { `[Action][Swimlane]: Unable to update record in application with id ${config.appId}. Status: 500. Error: An error has occurred. Reason: unknown` ); }); + + test('it should throw if the request is not a JSON', async () => { + requestMock.mockImplementation(() => + createAxiosResponse({ data, headers: { ['content-type']: 'text/html' } }) + ); + + await expect(service.updateRecord({ incident, incidentId })).rejects.toThrow( + `[Action][Swimlane]: Unable to update record in application with id ${config.appId}. Status: 500. Error: Unsupported content type: text/html in GET https://example.com. Supported content types: application/json. Reason: unknown` + ); + }); + + test('it should throw if the required attributes are not there', async () => { + requestMock.mockImplementation(() => createAxiosResponse({ data: { notRequired: 'test' } })); + + await expect(service.updateRecord({ incident, incidentId })).rejects.toThrow( + `[Action][Swimlane]: Unable to update record in application with id ${config.appId}. Status: 500. Error: Response is missing at least one of the expected fields: id,name,modifiedDate. Reason: unknown` + ); + }); }); describe('createComment', () => { @@ -289,9 +317,7 @@ describe('Swimlane Service', () => { const createdDate = '2021-06-01T17:29:51.092Z'; test('it updates a record correctly', async () => { - requestMock.mockImplementation(() => ({ - data, - })); + requestMock.mockImplementation(() => createAxiosResponse({ data })); const res = await service.createComment({ comment, @@ -306,9 +332,7 @@ describe('Swimlane Service', () => { }); test('it should call request with correct arguments', async () => { - requestMock.mockImplementation(() => ({ - data, - })); + requestMock.mockImplementation(() => createAxiosResponse({ data })); await service.createComment({ comment, diff --git a/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.ts b/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.ts index f68d22121dbcc..d917d7f5677bb 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/swimlane/service.ts @@ -9,7 +9,7 @@ import { Logger } from '@kbn/logging'; import axios from 'axios'; import { ActionsConfigurationUtilities } from '../../actions_config'; -import { getErrorMessage, request } from '../lib/axios_utils'; +import { getErrorMessage, request, throwIfResponseIsNotValid } from '../lib/axios_utils'; import { getBodyForEventAction } from './helpers'; import { CreateCommentParams, @@ -89,6 +89,12 @@ export const createExternalService = ( method: 'post', url: getPostRecordUrl(appId), }); + + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['id', 'name', 'createdDate'], + }); + return { id: res.data.id, title: res.data.name, @@ -124,6 +130,11 @@ export const createExternalService = ( url: getPostRecordIdUrl(appId, params.incidentId), }); + throwIfResponseIsNotValid({ + res, + requiredAttributesToBeInTheResponse: ['id', 'name', 'modifiedDate'], + }); + return { id: res.data.id, title: res.data.name, diff --git a/x-pack/plugins/actions/server/index.ts b/x-pack/plugins/actions/server/index.ts index b3e019a1bf46d..9f3c352190213 100644 --- a/x-pack/plugins/actions/server/index.ts +++ b/x-pack/plugins/actions/server/index.ts @@ -57,7 +57,9 @@ export const plugin = (initContext: PluginInitializerContext) => new ActionsPlug export const config: PluginConfigDescriptor = { schema: configSchema, deprecations: ({ renameFromRoot, unused }) => [ - renameFromRoot('xpack.actions.whitelistedHosts', 'xpack.actions.allowedHosts'), + renameFromRoot('xpack.actions.whitelistedHosts', 'xpack.actions.allowedHosts', { + level: 'warning', + }), (settings, fromPath, addDeprecation) => { const actions = get(settings, fromPath); const customHostSettings = actions?.customHostSettings ?? []; @@ -69,6 +71,7 @@ export const config: PluginConfigDescriptor = { ) ) { addDeprecation({ + level: 'warning', configPath: 'xpack.actions.customHostSettings.ssl.rejectUnauthorized', message: `"xpack.actions.customHostSettings[].ssl.rejectUnauthorized" is deprecated.` + @@ -97,6 +100,7 @@ export const config: PluginConfigDescriptor = { const actions = get(settings, fromPath); if (actions?.hasOwnProperty('rejectUnauthorized')) { addDeprecation({ + level: 'warning', configPath: `${fromPath}.rejectUnauthorized`, message: `"xpack.actions.rejectUnauthorized" is deprecated. Use "xpack.actions.verificationMode" instead, ` + @@ -124,6 +128,7 @@ export const config: PluginConfigDescriptor = { const actions = get(settings, fromPath); if (actions?.hasOwnProperty('proxyRejectUnauthorizedCertificates')) { addDeprecation({ + level: 'warning', configPath: `${fromPath}.proxyRejectUnauthorizedCertificates`, message: `"xpack.actions.proxyRejectUnauthorizedCertificates" is deprecated. Use "xpack.actions.proxyVerificationMode" instead, ` + diff --git a/x-pack/plugins/actions/server/saved_objects/actions_migrations.test.ts b/x-pack/plugins/actions/server/saved_objects/actions_migrations.test.ts index 6525e6acc9ca4..f03bd70674605 100644 --- a/x-pack/plugins/actions/server/saved_objects/actions_migrations.test.ts +++ b/x-pack/plugins/actions/server/saved_objects/actions_migrations.test.ts @@ -166,7 +166,7 @@ describe('successful migrations', () => { expect(migratedAction).toEqual(action); }); - test('set isLegacy config property for .servicenow', () => { + test('set usesTableApi config property for .servicenow', () => { const migration716 = getActionsMigrations(encryptedSavedObjectsSetup)['7.16.0']; const action = getMockDataForServiceNow(); const migratedAction = migration716(action, context); @@ -177,13 +177,13 @@ describe('successful migrations', () => { ...action.attributes, config: { apiUrl: 'https://example.com', - isLegacy: true, + usesTableApi: true, }, }, }); }); - test('set isLegacy config property for .servicenow-sir', () => { + test('set usesTableApi config property for .servicenow-sir', () => { const migration716 = getActionsMigrations(encryptedSavedObjectsSetup)['7.16.0']; const action = getMockDataForServiceNow({ actionTypeId: '.servicenow-sir' }); const migratedAction = migration716(action, context); @@ -194,13 +194,13 @@ describe('successful migrations', () => { ...action.attributes, config: { apiUrl: 'https://example.com', - isLegacy: true, + usesTableApi: true, }, }, }); }); - test('it does not set isLegacy config for other connectors', () => { + test('it does not set usesTableApi config for other connectors', () => { const migration716 = getActionsMigrations(encryptedSavedObjectsSetup)['7.16.0']; const action = getMockData(); const migratedAction = migration716(action, context); diff --git a/x-pack/plugins/actions/server/saved_objects/actions_migrations.ts b/x-pack/plugins/actions/server/saved_objects/actions_migrations.ts index daa39603043bc..030e191f2856e 100644 --- a/x-pack/plugins/actions/server/saved_objects/actions_migrations.ts +++ b/x-pack/plugins/actions/server/saved_objects/actions_migrations.ts @@ -68,7 +68,7 @@ export function getActionsMigrations( doc.attributes.actionTypeId === '.servicenow' || doc.attributes.actionTypeId === '.servicenow-sir' || doc.attributes.actionTypeId === '.email', - pipeMigrations(markOldServiceNowITSMConnectorAsLegacy, setServiceConfigIfNotSet) + pipeMigrations(addUsesTableApiToServiceNowConnectors, setServiceConfigIfNotSet) ); return { @@ -189,7 +189,7 @@ const addIsMissingSecretsField = ( }; }; -const markOldServiceNowITSMConnectorAsLegacy = ( +const addUsesTableApiToServiceNowConnectors = ( doc: SavedObjectUnsanitizedDoc ): SavedObjectUnsanitizedDoc => { if ( @@ -205,7 +205,7 @@ const markOldServiceNowITSMConnectorAsLegacy = ( ...doc.attributes, config: { ...doc.attributes.config, - isLegacy: true, + usesTableApi: true, }, }, }; diff --git a/x-pack/plugins/actions/server/usage/actions_telemetry.ts b/x-pack/plugins/actions/server/usage/actions_telemetry.ts index 1cb6bf8bfc74c..803a2122fe7f8 100644 --- a/x-pack/plugins/actions/server/usage/actions_telemetry.ts +++ b/x-pack/plugins/actions/server/usage/actions_telemetry.ts @@ -43,6 +43,7 @@ export async function getTotalCount( const { body: searchResult } = await esClient.search({ index: kibanaIndex, + size: 0, body: { query: { bool: { @@ -224,6 +225,7 @@ export async function getInUseTotalCount( const { body: actionResults } = await esClient.search({ index: kibanaIndex, + size: 0, body: { query: { bool: { diff --git a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts index e7e311902d08d..af009217ed99b 100644 --- a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts +++ b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts @@ -42,7 +42,7 @@ describe('AlertNavigationRegistry', () => { test('returns true for registered consumer & alert types handlers', () => { const registry = new AlertNavigationRegistry(); const alertType = mockAlertType('index_threshold'); - registry.register('siem', alertType, handler); + registry.register('siem', alertType.id, handler); expect(registry.has('siem', alertType)).toEqual(true); }); @@ -72,7 +72,7 @@ describe('AlertNavigationRegistry', () => { test('registers a handler by consumer & Alert Type', () => { const registry = new AlertNavigationRegistry(); const alertType = mockAlertType('index_threshold'); - registry.register('siem', alertType, handler); + registry.register('siem', alertType.id, handler); expect(registry.has('siem', alertType)).toEqual(true); }); @@ -80,11 +80,11 @@ describe('AlertNavigationRegistry', () => { const registry = new AlertNavigationRegistry(); const indexThresholdAlertType = mockAlertType('index_threshold'); - registry.register('siem', indexThresholdAlertType, handler); + registry.register('siem', indexThresholdAlertType.id, handler); expect(registry.has('siem', indexThresholdAlertType)).toEqual(true); const geoAlertType = mockAlertType('geogrid'); - registry.register('siem', geoAlertType, handler); + registry.register('siem', geoAlertType.id, handler); expect(registry.has('siem', geoAlertType)).toEqual(true); }); @@ -92,19 +92,19 @@ describe('AlertNavigationRegistry', () => { const registry = new AlertNavigationRegistry(); const indexThresholdAlertType = mockAlertType('geogrid'); - registry.register('siem', indexThresholdAlertType, handler); + registry.register('siem', indexThresholdAlertType.id, handler); expect(registry.has('siem', indexThresholdAlertType)).toEqual(true); - registry.register('apm', indexThresholdAlertType, handler); + registry.register('apm', indexThresholdAlertType.id, handler); expect(registry.has('apm', indexThresholdAlertType)).toEqual(true); }); test('throws if an existing handler is registered', () => { const registry = new AlertNavigationRegistry(); const alertType = mockAlertType('index_threshold'); - registry.register('siem', alertType, handler); + registry.register('siem', alertType.id, handler); expect(() => { - registry.register('siem', alertType, handler); + registry.register('siem', alertType.id, handler); }).toThrowErrorMatchingInlineSnapshot( `"Navigation for Alert type \\"index_threshold\\" within \\"siem\\" is already registered."` ); @@ -125,7 +125,7 @@ describe('AlertNavigationRegistry', () => { expect(registry.hasDefaultHandler('siem')).toEqual(true); const geoAlertType = mockAlertType('geogrid'); - registry.register('siem', geoAlertType, handler); + registry.register('siem', geoAlertType.id, handler); expect(registry.has('siem', geoAlertType)).toEqual(true); }); @@ -149,7 +149,7 @@ describe('AlertNavigationRegistry', () => { } const indexThresholdAlertType = mockAlertType('indexThreshold'); - registry.register('siem', indexThresholdAlertType, indexThresholdHandler); + registry.register('siem', indexThresholdAlertType.id, indexThresholdHandler); expect(registry.get('siem', indexThresholdAlertType)).toEqual(indexThresholdHandler); }); @@ -167,7 +167,7 @@ describe('AlertNavigationRegistry', () => { test('returns default handlers by consumer when there are other alert type handler', () => { const registry = new AlertNavigationRegistry(); - registry.register('siem', mockAlertType('indexThreshold'), () => ({})); + registry.register('siem', mockAlertType('indexThreshold').id, () => ({})); function defaultHandler(alert: SanitizedAlert) { return {}; diff --git a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts index 65b7c1e68e431..0c7bf052fef4c 100644 --- a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts +++ b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts @@ -15,11 +15,11 @@ export class AlertNavigationRegistry { new Map(); public has(consumer: string, alertType: AlertType) { - return this.hasTypedHandler(consumer, alertType) || this.hasDefaultHandler(consumer); + return this.hasTypedHandler(consumer, alertType.id) || this.hasDefaultHandler(consumer); } - public hasTypedHandler(consumer: string, alertType: AlertType) { - return this.alertNavigations.get(consumer)?.has(alertType.id) ?? false; + public hasTypedHandler(consumer: string, ruleTypeId: string) { + return this.alertNavigations.get(consumer)?.has(ruleTypeId) ?? false; } public hasDefaultHandler(consumer: string) { @@ -50,14 +50,14 @@ export class AlertNavigationRegistry { consumerNavigations.set(DEFAULT_HANDLER, handler); } - public register(consumer: string, alertType: AlertType, handler: AlertNavigationHandler) { - if (this.hasTypedHandler(consumer, alertType)) { + public register(consumer: string, ruleTypeId: string, handler: AlertNavigationHandler) { + if (this.hasTypedHandler(consumer, ruleTypeId)) { throw new Error( i18n.translate('xpack.alerting.alertNavigationRegistry.register.duplicateNavigationError', { defaultMessage: 'Navigation for Alert type "{alertType}" within "{consumer}" is already registered.', values: { - alertType: alertType.id, + alertType: ruleTypeId, consumer, }, }) @@ -67,7 +67,7 @@ export class AlertNavigationRegistry { const consumerNavigations = this.alertNavigations.get(consumer) ?? this.createConsumerNavigation(consumer); - consumerNavigations.set(alertType.id, handler); + consumerNavigations.set(ruleTypeId, handler); } public get(consumer: string, alertType: AlertType): AlertNavigationHandler { diff --git a/x-pack/plugins/alerting/public/plugin.ts b/x-pack/plugins/alerting/public/plugin.ts index be7080f5df6da..71fb0c7fe32b2 100644 --- a/x-pack/plugins/alerting/public/plugin.ts +++ b/x-pack/plugins/alerting/public/plugin.ts @@ -59,15 +59,7 @@ export class AlertingPublicPlugin implements Plugin { - const alertType = await loadAlertType({ http: core.http, id: ruleTypeId }); - if (!alertType) { - // eslint-disable-next-line no-console - console.log( - `Unable to register navigation for rule type "${ruleTypeId}" because it is not registered on the server side.` - ); - return; - } - this.alertNavigationRegistry!.register(applicationId, alertType, handler); + this.alertNavigationRegistry!.register(applicationId, ruleTypeId, handler); }; const registerDefaultNavigation = async ( diff --git a/x-pack/plugins/alerting/server/index.ts b/x-pack/plugins/alerting/server/index.ts index b7a510a37661b..a57f165898d1d 100644 --- a/x-pack/plugins/alerting/server/index.ts +++ b/x-pack/plugins/alerting/server/index.ts @@ -49,14 +49,16 @@ export const plugin = (initContext: PluginInitializerContext) => new AlertingPlu export const config: PluginConfigDescriptor = { schema: configSchema, deprecations: ({ renameFromRoot }) => [ - renameFromRoot('xpack.alerts.healthCheck', 'xpack.alerting.healthCheck'), + renameFromRoot('xpack.alerts.healthCheck', 'xpack.alerting.healthCheck', { level: 'warning' }), renameFromRoot( 'xpack.alerts.invalidateApiKeysTask.interval', - 'xpack.alerting.invalidateApiKeysTask.interval' + 'xpack.alerting.invalidateApiKeysTask.interval', + { level: 'warning' } ), renameFromRoot( 'xpack.alerts.invalidateApiKeysTask.removalDelay', - 'xpack.alerting.invalidateApiKeysTask.removalDelay' + 'xpack.alerting.invalidateApiKeysTask.removalDelay', + { level: 'warning' } ), (settings, fromPath, addDeprecation) => { const alerting = get(settings, fromPath); diff --git a/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts b/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts index 15fa6e63ac561..03a96d19b8e8a 100644 --- a/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts +++ b/x-pack/plugins/alerting/server/usage/alerts_telemetry.test.ts @@ -7,7 +7,7 @@ // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { elasticsearchClientMock } from '../../../../../src/core/server/elasticsearch/client/mocks'; -import { getTotalCountInUse } from './alerts_telemetry'; +import { getTotalCountAggregations, getTotalCountInUse } from './alerts_telemetry'; describe('alerts telemetry', () => { test('getTotalCountInUse should replace first "." symbol to "__" in alert types names', async () => { @@ -49,6 +49,69 @@ Object { "countNamespaces": 1, "countTotal": 4, } +`); + }); + + test('getTotalCountAggregations should return min/max connectors in use', async () => { + const mockEsClient = elasticsearchClientMock.createClusterClient().asScoped().asInternalUser; + mockEsClient.search.mockReturnValue( + // @ts-expect-error @elastic/elasticsearch Aggregate only allows unknown values + elasticsearchClientMock.createSuccessTransportRequestPromise({ + aggregations: { + byAlertTypeId: { + value: { + ruleTypes: { + '.index-threshold': 2, + 'logs.alert.document.count': 1, + 'document.test.': 1, + }, + }, + }, + max_throttle_time: { value: 60 }, + min_throttle_time: { value: 0 }, + avg_throttle_time: { value: 30 }, + max_interval_time: { value: 10 }, + min_interval_time: { value: 1 }, + avg_interval_time: { value: 4.5 }, + max_actions_count: { value: 4 }, + min_actions_count: { value: 0 }, + avg_actions_count: { value: 2.5 }, + }, + hits: { + hits: [], + }, + }) + ); + + const telemetry = await getTotalCountAggregations(mockEsClient, 'test'); + + expect(mockEsClient.search).toHaveBeenCalledTimes(1); + + expect(telemetry).toMatchInlineSnapshot(` +Object { + "connectors_per_alert": Object { + "avg": 2.5, + "max": 4, + "min": 0, + }, + "count_by_type": Object { + "__index-threshold": 2, + "document.test__": 1, + "logs.alert.document.count": 1, + }, + "count_rules_namespaces": 0, + "count_total": 4, + "schedule_time": Object { + "avg": 4.5, + "max": 10, + "min": 1, + }, + "throttle_time": Object { + "avg": 30, + "max": 60, + "min": 0, + }, +} `); }); }); diff --git a/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts b/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts index 18fa9b590b4e1..7ff9538c1aa26 100644 --- a/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts +++ b/x-pack/plugins/alerting/server/usage/alerts_telemetry.ts @@ -52,218 +52,128 @@ export async function getTotalCountAggregations( | 'count_rules_namespaces' > > { - const throttleTimeMetric = { - scripted_metric: { - init_script: 'state.min = 0; state.max = 0; state.totalSum = 0; state.totalCount = 0;', - map_script: ` - if (doc['alert.throttle'].size() > 0) { - def throttle = doc['alert.throttle'].value; + const { body: results } = await esClient.search({ + index: kibanaInex, + body: { + size: 0, + query: { + bool: { + filter: [{ term: { type: 'alert' } }], + }, + }, + runtime_mappings: { + alert_action_count: { + type: 'long', + script: { + source: ` + def alert = params._source['alert']; + if (alert != null) { + def actions = alert.actions; + if (actions != null) { + emit(actions.length); + } else { + emit(0); + } + }`, + }, + }, + alert_interval: { + type: 'long', + script: { + source: ` + int parsed = 0; + if (doc['alert.schedule.interval'].size() > 0) { + def interval = doc['alert.schedule.interval'].value; - if (throttle.length() > 1) { - // get last char - String timeChar = throttle.substring(throttle.length() - 1); - // remove last char - throttle = throttle.substring(0, throttle.length() - 1); + if (interval.length() > 1) { + // get last char + String timeChar = interval.substring(interval.length() - 1); + // remove last char + interval = interval.substring(0, interval.length() - 1); - if (throttle.chars().allMatch(Character::isDigit)) { - // using of regex is not allowed in painless language - int parsed = Integer.parseInt(throttle); + if (interval.chars().allMatch(Character::isDigit)) { + // using of regex is not allowed in painless language + parsed = Integer.parseInt(interval); - if (timeChar.equals("s")) { - parsed = parsed; - } else if (timeChar.equals("m")) { - parsed = parsed * 60; - } else if (timeChar.equals("h")) { - parsed = parsed * 60 * 60; - } else if (timeChar.equals("d")) { - parsed = parsed * 24 * 60 * 60; - } - if (state.min === 0 || parsed < state.min) { - state.min = parsed; - } - if (parsed > state.max) { - state.max = parsed; + if (timeChar.equals("s")) { + parsed = parsed; + } else if (timeChar.equals("m")) { + parsed = parsed * 60; + } else if (timeChar.equals("h")) { + parsed = parsed * 60 * 60; + } else if (timeChar.equals("d")) { + parsed = parsed * 24 * 60 * 60; + } + emit(parsed); + } } - state.totalSum += parsed; - state.totalCount++; } - } - } - `, - // Combine script is executed per cluster, but we already have a key-value pair per cluster. - // Despite docs that say this is optional, this script can't be blank. - combine_script: 'return state', - // Reduce script is executed across all clusters, so we need to add up all the total from each cluster - // This also needs to account for having no data - reduce_script: ` - double min = 0; - double max = 0; - long totalSum = 0; - long totalCount = 0; - for (Map m : states.toArray()) { - if (m !== null) { - min = min > 0 ? Math.min(min, m.min) : m.min; - max = Math.max(max, m.max); - totalSum += m.totalSum; - totalCount += m.totalCount; - } - } - Map result = new HashMap(); - result.min = min; - result.max = max; - result.totalSum = totalSum; - result.totalCount = totalCount; - return result; - `, - }, - }; - - const intervalTimeMetric = { - scripted_metric: { - init_script: 'state.min = 0; state.max = 0; state.totalSum = 0; state.totalCount = 0;', - map_script: ` - if (doc['alert.schedule.interval'].size() > 0) { - def interval = doc['alert.schedule.interval'].value; + emit(parsed); + `, + }, + }, + alert_throttle: { + type: 'long', + script: { + source: ` + int parsed = 0; + if (doc['alert.throttle'].size() > 0) { + def throttle = doc['alert.throttle'].value; - if (interval.length() > 1) { - // get last char - String timeChar = interval.substring(interval.length() - 1); - // remove last char - interval = interval.substring(0, interval.length() - 1); + if (throttle.length() > 1) { + // get last char + String timeChar = throttle.substring(throttle.length() - 1); + // remove last char + throttle = throttle.substring(0, throttle.length() - 1); - if (interval.chars().allMatch(Character::isDigit)) { - // using of regex is not allowed in painless language - int parsed = Integer.parseInt(interval); + if (throttle.chars().allMatch(Character::isDigit)) { + // using of regex is not allowed in painless language + parsed = Integer.parseInt(throttle); - if (timeChar.equals("s")) { - parsed = parsed; - } else if (timeChar.equals("m")) { - parsed = parsed * 60; - } else if (timeChar.equals("h")) { - parsed = parsed * 60 * 60; - } else if (timeChar.equals("d")) { - parsed = parsed * 24 * 60 * 60; - } - if (state.min === 0 || parsed < state.min) { - state.min = parsed; - } - if (parsed > state.max) { - state.max = parsed; - } - state.totalSum += parsed; - state.totalCount++; + if (timeChar.equals("s")) { + parsed = parsed; + } else if (timeChar.equals("m")) { + parsed = parsed * 60; + } else if (timeChar.equals("h")) { + parsed = parsed * 60 * 60; + } else if (timeChar.equals("d")) { + parsed = parsed * 24 * 60 * 60; + } + emit(parsed); + } } - } - } - `, - // Combine script is executed per cluster, but we already have a key-value pair per cluster. - // Despite docs that say this is optional, this script can't be blank. - combine_script: 'return state', - // Reduce script is executed across all clusters, so we need to add up all the total from each cluster - // This also needs to account for having no data - reduce_script: ` - double min = 0; - double max = 0; - long totalSum = 0; - long totalCount = 0; - for (Map m : states.toArray()) { - if (m !== null) { - min = min > 0 ? Math.min(min, m.min) : m.min; - max = Math.max(max, m.max); - totalSum += m.totalSum; - totalCount += m.totalCount; - } - } - Map result = new HashMap(); - result.min = min; - result.max = max; - result.totalSum = totalSum; - result.totalCount = totalCount; - return result; - `, - }, - }; - - const connectorsMetric = { - scripted_metric: { - init_script: - 'state.currentAlertActions = 0; state.min = 0; state.max = 0; state.totalActionsCount = 0;', - map_script: ` - String refName = doc['alert.actions.actionRef'].value; - if (refName == 'action_0') { - if (state.currentAlertActions !== 0 && state.currentAlertActions < state.min) { - state.min = state.currentAlertActions; - } - if (state.currentAlertActions !== 0 && state.currentAlertActions > state.max) { - state.max = state.currentAlertActions; - } - state.currentAlertActions = 1; - } else { - state.currentAlertActions++; - } - state.totalActionsCount++; - `, - // Combine script is executed per cluster, but we already have a key-value pair per cluster. - // Despite docs that say this is optional, this script can't be blank. - combine_script: 'return state', - // Reduce script is executed across all clusters, so we need to add up all the total from each cluster - // This also needs to account for having no data - reduce_script: ` - double min = 0; - double max = 0; - long totalActionsCount = 0; - long currentAlertActions = 0; - for (Map m : states.toArray()) { - if (m !== null) { - min = min > 0 ? Math.min(min, m.min) : m.min; - max = Math.max(max, m.max); - currentAlertActions += m.currentAlertActions; - totalActionsCount += m.totalActionsCount; - } - } - Map result = new HashMap(); - result.min = min; - result.max = max; - result.currentAlertActions = currentAlertActions; - result.totalActionsCount = totalActionsCount; - return result; - `, - }, - }; - - const { body: results } = await esClient.search({ - index: kibanaInex, - body: { - query: { - bool: { - filter: [{ term: { type: 'alert' } }], + } + emit(parsed); + `, + }, }, }, aggs: { byAlertTypeId: alertTypeMetric, - throttleTime: throttleTimeMetric, - intervalTime: intervalTimeMetric, - connectorsAgg: { - nested: { - path: 'alert.actions', - }, - aggs: { - connectors: connectorsMetric, - }, - }, + max_throttle_time: { max: { field: 'alert_throttle' } }, + min_throttle_time: { min: { field: 'alert_throttle' } }, + avg_throttle_time: { avg: { field: 'alert_throttle' } }, + max_interval_time: { max: { field: 'alert_interval' } }, + min_interval_time: { min: { field: 'alert_interval' } }, + avg_interval_time: { avg: { field: 'alert_interval' } }, + max_actions_count: { max: { field: 'alert_action_count' } }, + min_actions_count: { min: { field: 'alert_action_count' } }, + avg_actions_count: { avg: { field: 'alert_action_count' } }, }, }, }); const aggregations = results.aggregations as { byAlertTypeId: { value: { ruleTypes: Record } }; - throttleTime: { value: { min: number; max: number; totalCount: number; totalSum: number } }; - intervalTime: { value: { min: number; max: number; totalCount: number; totalSum: number } }; - connectorsAgg: { - connectors: { - value: { min: number; max: number; totalActionsCount: number; totalAlertsCount: number }; - }; - }; + max_throttle_time: { value: number }; + min_throttle_time: { value: number }; + avg_throttle_time: { value: number }; + max_interval_time: { value: number }; + min_interval_time: { value: number }; + avg_interval_time: { value: number }; + max_actions_count: { value: number }; + min_actions_count: { value: number }; + avg_actions_count: { value: number }; }; const totalAlertsCount = Object.keys(aggregations.byAlertTypeId.value.ruleTypes).reduce( @@ -284,30 +194,19 @@ export async function getTotalCountAggregations( {} ), throttle_time: { - min: `${aggregations.throttleTime.value.min}s`, - avg: `${ - aggregations.throttleTime.value.totalCount > 0 - ? aggregations.throttleTime.value.totalSum / aggregations.throttleTime.value.totalCount - : 0 - }s`, - max: `${aggregations.throttleTime.value.max}s`, + min: aggregations.min_throttle_time.value, + avg: aggregations.avg_throttle_time.value, + max: aggregations.max_throttle_time.value, }, schedule_time: { - min: `${aggregations.intervalTime.value.min}s`, - avg: `${ - aggregations.intervalTime.value.totalCount > 0 - ? aggregations.intervalTime.value.totalSum / aggregations.intervalTime.value.totalCount - : 0 - }s`, - max: `${aggregations.intervalTime.value.max}s`, + min: aggregations.min_interval_time.value, + avg: aggregations.avg_interval_time.value, + max: aggregations.max_interval_time.value, }, connectors_per_alert: { - min: aggregations.connectorsAgg.connectors.value.min, - avg: - totalAlertsCount > 0 - ? aggregations.connectorsAgg.connectors.value.totalActionsCount / totalAlertsCount - : 0, - max: aggregations.connectorsAgg.connectors.value.max, + min: aggregations.min_actions_count.value, + avg: aggregations.avg_actions_count.value, + max: aggregations.max_actions_count.value, }, count_rules_namespaces: 0, }; @@ -316,6 +215,7 @@ export async function getTotalCountAggregations( export async function getTotalCountInUse(esClient: ElasticsearchClient, kibanaInex: string) { const { body: searchResult } = await esClient.search({ index: kibanaInex, + size: 0, body: { query: { bool: { diff --git a/x-pack/plugins/alerting/server/usage/alerts_usage_collector.ts b/x-pack/plugins/alerting/server/usage/alerts_usage_collector.ts index ecea721dfad92..e9405c51dbf15 100644 --- a/x-pack/plugins/alerting/server/usage/alerts_usage_collector.ts +++ b/x-pack/plugins/alerting/server/usage/alerts_usage_collector.ts @@ -75,14 +75,14 @@ export function createAlertsUsageCollector( count_active_total: 0, count_disabled_total: 0, throttle_time: { - min: '0s', - avg: '0s', - max: '0s', + min: 0, + avg: 0, + max: 0, }, schedule_time: { - min: '0s', - avg: '0s', - max: '0s', + min: 0, + avg: 0, + max: 0, }, connectors_per_alert: { min: 0, @@ -100,14 +100,14 @@ export function createAlertsUsageCollector( count_active_total: { type: 'long' }, count_disabled_total: { type: 'long' }, throttle_time: { - min: { type: 'keyword' }, - avg: { type: 'keyword' }, - max: { type: 'keyword' }, + min: { type: 'long' }, + avg: { type: 'float' }, + max: { type: 'long' }, }, schedule_time: { - min: { type: 'keyword' }, - avg: { type: 'keyword' }, - max: { type: 'keyword' }, + min: { type: 'long' }, + avg: { type: 'float' }, + max: { type: 'long' }, }, connectors_per_alert: { min: { type: 'long' }, diff --git a/x-pack/plugins/alerting/server/usage/types.ts b/x-pack/plugins/alerting/server/usage/types.ts index 5e420b54e37cb..0e489893a1bbc 100644 --- a/x-pack/plugins/alerting/server/usage/types.ts +++ b/x-pack/plugins/alerting/server/usage/types.ts @@ -13,14 +13,14 @@ export interface AlertsUsage { count_active_by_type: Record; count_rules_namespaces: number; throttle_time: { - min: string; - avg: string; - max: string; + min: number; + avg: number; + max: number; }; schedule_time: { - min: string; - avg: string; - max: string; + min: number; + avg: number; + max: number; }; connectors_per_alert: { min: number; diff --git a/x-pack/plugins/apm/common/runtime_types/comparison_type_rt.ts b/x-pack/plugins/apm/common/runtime_types/comparison_type_rt.ts new file mode 100644 index 0000000000000..93c0a31c40cde --- /dev/null +++ b/x-pack/plugins/apm/common/runtime_types/comparison_type_rt.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 * as t from 'io-ts'; + +export enum TimeRangeComparisonEnum { + WeekBefore = 'week', + DayBefore = 'day', + PeriodBefore = 'period', +} + +export const comparisonTypeRt = t.union([ + t.literal('day'), + t.literal('week'), + t.literal('period'), +]); + +export type TimeRangeComparisonType = t.TypeOf; diff --git a/x-pack/plugins/apm/dev_docs/linting.md b/x-pack/plugins/apm/dev_docs/linting.md index edf3e813a88e9..3dbd7b5b27484 100644 --- a/x-pack/plugins/apm/dev_docs/linting.md +++ b/x-pack/plugins/apm/dev_docs/linting.md @@ -19,3 +19,12 @@ yarn prettier "./x-pack/plugins/apm/**/*.{tsx,ts,js}" --write ``` node scripts/eslint.js x-pack/plugins/apm ``` + +## Install pre-commit hook (optional) +In case you want to run a couple of checks like linting or check the file casing of the files to commit, we provide a way to install a pre-commit hook. To configure it you just need to run the following: + +`node scripts/register_git_hook` + +After the script completes the pre-commit hook will be created within the file .git/hooks/pre-commit. If you choose to not install it, don’t worry, we still run a quick CI check to provide feedback earliest as we can about the same checks. + +More information about linting can be found in the [Kibana Guide](https://www.elastic.co/guide/en/kibana/current/kibana-linting.html). \ No newline at end of file diff --git a/x-pack/plugins/apm/dev_docs/testing.md b/x-pack/plugins/apm/dev_docs/testing.md index ba48e7e229e27..95ba2467befcd 100644 --- a/x-pack/plugins/apm/dev_docs/testing.md +++ b/x-pack/plugins/apm/dev_docs/testing.md @@ -31,7 +31,8 @@ The API tests are located in `x-pack/test/apm_api_integration/`. **API Test tips** -- For debugging access Elasticsearch on http://localhost:9220 (`elastic` / `changeme`) +- For data generation in API tests have a look at the [elastic-apm-synthtrace](../../../../packages/elastic-apm-synthtrace/README.md) package +- For debugging access Elasticsearch on http://localhost:9220 and Kibana on http://localhost:5620 (`elastic` / `changeme`) - To update snapshots append `--updateSnapshots` to the functional_test_runner command --- @@ -74,3 +75,8 @@ yarn storybook apm ``` All files with a .stories.tsx extension will be loaded. You can access the development environment at http://localhost:9001. + +## Data generation +For end-to-end (e.g. agent -> apm server -> elasticsearch <- kibana) development and testing of Elastic APM please check the the [APM Integration Testing repository](https://github.com/elastic/apm-integration-testing). + +Data can also be generated using the [elastic-apm-synthtrace](../../../../packages/elastic-apm-synthtrace/README.md) CLI. \ No newline at end of file diff --git a/x-pack/plugins/apm/ftr_e2e/README.md b/x-pack/plugins/apm/ftr_e2e/README.md index 2df4e837d2e55..96d6671bb3699 100644 --- a/x-pack/plugins/apm/ftr_e2e/README.md +++ b/x-pack/plugins/apm/ftr_e2e/README.md @@ -4,4 +4,4 @@ APM uses [FTR](../../../../packages/kbn-test/README.md) (functional test runner) ## Running tests -Go to [tests documentation](../scripts/test#e2e-tests-cypress/README.md) \ No newline at end of file +Go to [tests documentation](../dev_docs/testing.md#e2e-tests-cypress) diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts new file mode 100644 index 0000000000000..0ab2d5682a900 --- /dev/null +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts @@ -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. + */ + +const timeRange = { + rangeFrom: Cypress.env('START_DATE'), + rangeTo: Cypress.env('END_DATE'), +}; + +describe('Dependencies', () => { + beforeEach(() => { + cy.loginAsReadOnlyUser(); + }); + + describe('top-level dependencies page', () => { + it('has a list of dependencies and you can navigate to the page for one', () => { + cy.visit(`/app/apm/services?${new URLSearchParams(timeRange)}`); + cy.contains('nav a', 'Dependencies').click(); + + // `force: true` because Cypress says the element is 0x0 + cy.contains('postgresql').click({ force: true }); + + cy.contains('h1', 'postgresql'); + }); + }); + + describe('dependency overview page', () => { + it('shows dependency information and you can navigate to a page for an upstream service', () => { + cy.visit( + `/app/apm/backends/overview?${new URLSearchParams({ + ...timeRange, + backendName: 'postgresql', + })}` + ); + + cy.get('[data-test-subj="latencyChart"]'); + cy.get('[data-test-subj="throughputChart"]'); + cy.get('[data-test-subj="errorRateChart"]'); + + cy.contains('opbeans-python').click({ force: true }); + + cy.contains('h1', 'opbeans-python'); + }); + }); + + describe('service overview page', () => { + it('shows dependency information and you can navigate to a page for a dependency', () => { + cy.visit( + `/app/apm/services/opbeans-python/overview?${new URLSearchParams( + timeRange + )}` + ); + + cy.contains('postgresql').click({ force: true }); + + cy.contains('h1', 'postgresql'); + }); + }); + + describe('service dependencies tab', () => { + it('shows dependency information and you can navigate to a page for a dependency', () => { + cy.visit( + `/app/apm/services/opbeans-python/overview?${new URLSearchParams( + timeRange + )}` + ); + + cy.contains('a[role="tab"]', 'Dependencies').click(); + + cy.contains('Time spent by dependency'); + + cy.contains('postgresql').click({ force: true }); + + cy.contains('h1', 'postgresql'); + }); + }); +}); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress_start.ts b/x-pack/plugins/apm/ftr_e2e/cypress_start.ts index caf87d2627459..0cfc58653801a 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress_start.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress_start.ts @@ -16,15 +16,10 @@ import { esArchiverLoad, esArchiverUnload } from './cypress/tasks/es_archiver'; export function cypressRunTests(spec?: string) { return async ({ getService }: FtrProviderContext) => { - try { - const result = await cypressStart(getService, cypress.run, spec); + const result = await cypressStart(getService, cypress.run, spec); - if (result && (result.status === 'failed' || result.totalFailed > 0)) { - process.exit(1); - } - } catch (error) { - console.error('errors: ', error); - process.exit(1); + if (result && (result.status === 'failed' || result.totalFailed > 0)) { + throw new Error(`APM Cypress tests failed`); } }; } diff --git a/x-pack/plugins/apm/jest.config.js b/x-pack/plugins/apm/jest.config.js index 4fd2e72776943..66b4b164a794c 100644 --- a/x-pack/plugins/apm/jest.config.js +++ b/x-pack/plugins/apm/jest.config.js @@ -11,7 +11,10 @@ module.exports = { preset: '@kbn/test', rootDir: path.resolve(__dirname, '../../..'), roots: ['/x-pack/plugins/apm'], - setupFiles: ['/x-pack/plugins/apm/.storybook/jest_setup.js'], + setupFiles: [ + '/x-pack/plugins/apm/jest_setup.js', + '/x-pack/plugins/apm/.storybook/jest_setup.js', + ], coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/apm', coverageReporters: ['text', 'html'], collectCoverageFrom: [ diff --git a/x-pack/plugins/apm/jest_setup.js b/x-pack/plugins/apm/jest_setup.js new file mode 100644 index 0000000000000..df8ba56cdc1c3 --- /dev/null +++ b/x-pack/plugins/apm/jest_setup.js @@ -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. + */ + +/* global jest */ + +// When a `console.error` is encountered, throw the error to make the test fail. +// This effectively treats logged errors during the test run as failures. +jest.spyOn(console, 'error').mockImplementation((message) => { + throw new Error(message); +}); diff --git a/x-pack/plugins/apm/kibana.json b/x-pack/plugins/apm/kibana.json index 865358959ea72..e57859bfa253e 100644 --- a/x-pack/plugins/apm/kibana.json +++ b/x-pack/plugins/apm/kibana.json @@ -12,6 +12,7 @@ "embeddable", "features", "infra", + "inspector", "licensing", "observability", "ruleRegistry", diff --git a/x-pack/plugins/apm/public/components/alerting/chart_preview/index.tsx b/x-pack/plugins/apm/public/components/alerting/chart_preview/index.tsx index ee6a58b0dbb76..8a49edae0dd1a 100644 --- a/x-pack/plugins/apm/public/components/alerting/chart_preview/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/chart_preview/index.tsx @@ -23,17 +23,21 @@ import { EuiSpacer } from '@elastic/eui'; import React from 'react'; import { Coordinate } from '../../../../typings/timeseries'; import { useTheme } from '../../../hooks/use_theme'; +import { IUiSettingsClient } from '../../../../../../../src/core/public'; +import { getTimeZone } from '../../shared/charts/helper/timezone'; interface ChartPreviewProps { yTickFormat?: TickFormatter; data?: Coordinate[]; threshold: number; + uiSettings?: IUiSettingsClient; } export function ChartPreview({ data = [], yTickFormat, threshold, + uiSettings, }: ChartPreviewProps) { const theme = useTheme(); const thresholdOpacity = 0.3; @@ -67,6 +71,8 @@ export function ChartPreview({ }, ]; + const timeZone = getTimeZone(uiSettings); + return ( <> @@ -99,6 +105,7 @@ export function ChartPreview({ domain={{ max: yMax, min: NaN }} /> ({}) }, notifications: { toasts: { add: () => {} } }, -} as unknown as Partial); + uiSettings: { get: () => {} }, +} as unknown as CoreStart; + +const KibanaReactContext = createKibanaReactContext(coreMock); interface Args { alertParams: AlertParams; @@ -27,6 +33,8 @@ const stories: Meta<{}> = { component: ErrorCountAlertTrigger, decorators: [ (StoryComponent) => { + createCallApmApi(coreMock); + return (
diff --git a/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/error_count_alert_trigger.test.tsx b/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/error_count_alert_trigger.test.tsx index 26c62b10e6220..edf3b5b675cc4 100644 --- a/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/error_count_alert_trigger.test.tsx +++ b/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/error_count_alert_trigger.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { render } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import React from 'react'; import * as stories from './error_count_alert_trigger.stories'; import { composeStories } from '@storybook/testing-react'; @@ -13,7 +13,9 @@ import { composeStories } from '@storybook/testing-react'; const { CreatingInApmFromService } = composeStories(stories); describe('ErrorCountAlertTrigger', () => { - it('renders', () => { - expect(() => render()).not.toThrowError(); + it('renders', async () => { + render(); + + expect(await screen.findByText('Service')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.tsx b/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.tsx index eac128a7e88c4..1c72d5f104854 100644 --- a/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.tsx @@ -120,6 +120,7 @@ export function ErrorCountAlertTrigger(props: Props) { data={data?.errorCountChartPreview} threshold={params.threshold} yTickFormat={asInteger} + uiSettings={services.uiSettings} /> ); diff --git a/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.tsx b/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.tsx index 8957dfc823e44..fa75fcca579e5 100644 --- a/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.tsx @@ -139,6 +139,7 @@ export function TransactionDurationAlertTrigger(props: Props) { data={latencyChartPreview} threshold={thresholdMs} yTickFormat={yTickFormat} + uiSettings={services.uiSettings} /> ); diff --git a/x-pack/plugins/apm/public/components/alerting/transaction_error_rate_alert_trigger/index.tsx b/x-pack/plugins/apm/public/components/alerting/transaction_error_rate_alert_trigger/index.tsx index ddddc4bbecbad..a818218cbf3ad 100644 --- a/x-pack/plugins/apm/public/components/alerting/transaction_error_rate_alert_trigger/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/transaction_error_rate_alert_trigger/index.tsx @@ -131,6 +131,7 @@ export function TransactionErrorRateAlertTrigger(props: Props) { data={data?.errorRateChartPreview} yTickFormat={(d: number | null) => asPercent(d, 1)} threshold={thresholdAsPercent} + uiSettings={services.uiSettings} /> ); diff --git a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_detail_dependencies_table.tsx b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_detail_dependencies_table.tsx index be493f8a98b1c..72273bf8c9e19 100644 --- a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_detail_dependencies_table.tsx +++ b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_detail_dependencies_table.tsx @@ -13,7 +13,6 @@ import { useUrlParams } from '../../../context/url_params_context/use_url_params import { useFetcher } from '../../../hooks/use_fetcher'; import { getTimeRangeComparison } from '../../shared/time_comparison/get_time_range_comparison'; import { DependenciesTable } from '../../shared/dependencies_table'; -import { useApmBackendContext } from '../../../context/apm_backend/use_apm_backend_context'; import { ServiceLink } from '../../shared/service_link'; import { useTimeRange } from '../../../hooks/use_time_range'; @@ -23,8 +22,8 @@ export function BackendDetailDependenciesTable() { } = useUrlParams(); const { - query: { rangeFrom, rangeTo, kuery, environment }, - } = useApmParams('/backends/{backendName}/overview'); + query: { backendName, rangeFrom, rangeTo, kuery, environment }, + } = useApmParams('/backends/overview'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); @@ -35,8 +34,6 @@ export function BackendDetailDependenciesTable() { comparisonType, }); - const { backendName } = useApmBackendContext(); - const { data, status } = useFetcher( (callApmApi) => { if (!start || !end) { @@ -44,12 +41,17 @@ export function BackendDetailDependenciesTable() { } return callApmApi({ - endpoint: 'GET /internal/apm/backends/{backendName}/upstream_services', + endpoint: 'GET /internal/apm/backends/upstream_services', params: { - path: { + query: { backendName, + start, + end, + environment, + numBuckets: 20, + offset, + kuery, }, - query: { start, end, environment, numBuckets: 20, offset, kuery }, }, }); }, @@ -74,7 +76,7 @@ export function BackendDetailDependenciesTable() { serviceName={location.serviceName} agentName={location.agentName} query={{ - comparisonEnabled: comparisonEnabled ? 'true' : 'false', + comparisonEnabled, comparisonType, environment, kuery, diff --git a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_error_rate_chart.tsx b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_error_rate_chart.tsx index cf14145dba82a..3b19e8b6dd920 100644 --- a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_error_rate_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_error_rate_chart.tsx @@ -7,7 +7,6 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { asPercent } from '../../../../common/utils/formatters'; -import { useApmBackendContext } from '../../../context/apm_backend/use_apm_backend_context'; import { useComparison } from '../../../hooks/use_comparison'; import { useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; @@ -25,13 +24,11 @@ export function BackendFailedTransactionRateChart({ }: { height: number; }) { - const { backendName } = useApmBackendContext(); - const theme = useTheme(); const { - query: { kuery, environment, rangeFrom, rangeTo }, - } = useApmParams('/backends/{backendName}/overview'); + query: { backendName, kuery, environment, rangeFrom, rangeTo }, + } = useApmParams('/backends/overview'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); @@ -44,12 +41,10 @@ export function BackendFailedTransactionRateChart({ } return callApmApi({ - endpoint: 'GET /internal/apm/backends/{backendName}/charts/error_rate', + endpoint: 'GET /internal/apm/backends/charts/error_rate', params: { - path: { - backendName, - }, query: { + backendName, start, end, offset, diff --git a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_latency_chart.tsx b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_latency_chart.tsx index 3f5a56d55d823..2e750141257a5 100644 --- a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_latency_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_latency_chart.tsx @@ -7,7 +7,6 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { getDurationFormatter } from '../../../../common/utils/formatters'; -import { useApmBackendContext } from '../../../context/apm_backend/use_apm_backend_context'; import { useComparison } from '../../../hooks/use_comparison'; import { useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; @@ -21,13 +20,11 @@ import { import { useApmParams } from '../../../hooks/use_apm_params'; export function BackendLatencyChart({ height }: { height: number }) { - const { backendName } = useApmBackendContext(); - const theme = useTheme(); const { - query: { rangeFrom, rangeTo, kuery, environment }, - } = useApmParams('/backends/{backendName}/overview'); + query: { backendName, rangeFrom, rangeTo, kuery, environment }, + } = useApmParams('/backends/overview'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); @@ -40,12 +37,10 @@ export function BackendLatencyChart({ height }: { height: number }) { } return callApmApi({ - endpoint: 'GET /internal/apm/backends/{backendName}/charts/latency', + endpoint: 'GET /internal/apm/backends/charts/latency', params: { - path: { - backendName, - }, query: { + backendName, start, end, offset, diff --git a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_throughput_chart.tsx b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_throughput_chart.tsx index f5d9cb7a7a55e..6f201f468a9e3 100644 --- a/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_throughput_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/backend_detail_overview/backend_throughput_chart.tsx @@ -7,7 +7,6 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { asTransactionRate } from '../../../../common/utils/formatters'; -import { useApmBackendContext } from '../../../context/apm_backend/use_apm_backend_context'; import { useComparison } from '../../../hooks/use_comparison'; import { useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; @@ -17,13 +16,11 @@ import { useTheme } from '../../../hooks/use_theme'; import { useApmParams } from '../../../hooks/use_apm_params'; export function BackendThroughputChart({ height }: { height: number }) { - const { backendName } = useApmBackendContext(); - const theme = useTheme(); const { - query: { rangeFrom, rangeTo, kuery, environment }, - } = useApmParams('/backends/{backendName}/overview'); + query: { backendName, rangeFrom, rangeTo, kuery, environment }, + } = useApmParams('/backends/overview'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); @@ -36,12 +33,10 @@ export function BackendThroughputChart({ height }: { height: number }) { } return callApmApi({ - endpoint: 'GET /internal/apm/backends/{backendName}/charts/throughput', + endpoint: 'GET /internal/apm/backends/charts/throughput', params: { - path: { - backendName, - }, query: { + backendName, start, end, offset, diff --git a/x-pack/plugins/apm/public/components/app/backend_detail_overview/index.tsx b/x-pack/plugins/apm/public/components/app/backend_detail_overview/index.tsx index 3b4deac794df0..6823b571e9597 100644 --- a/x-pack/plugins/apm/public/components/app/backend_detail_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/backend_detail_overview/index.tsx @@ -11,7 +11,6 @@ import React from 'react'; import { EuiSpacer } from '@elastic/eui'; import { EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ApmBackendContextProvider } from '../../../context/apm_backend/apm_backend_context'; import { useBreadcrumb } from '../../../context/breadcrumbs/use_breadcrumb'; import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; import { useApmParams } from '../../../hooks/use_apm_params'; @@ -31,8 +30,8 @@ import { useBreakpoints } from '../../../hooks/use_breakpoints'; export function BackendDetailOverview() { const { - path: { backendName }, query: { + backendName, rangeFrom, rangeTo, refreshInterval, @@ -40,7 +39,7 @@ export function BackendDetailOverview() { environment, kuery, }, - } = useApmParams('/backends/{backendName}/overview'); + } = useApmParams('/backends/overview'); const apmRouter = useApmRouter(); @@ -60,9 +59,9 @@ export function BackendDetailOverview() { }, { title: backendName, - href: apmRouter.link('/backends/{backendName}/overview', { - path: { backendName }, + href: apmRouter.link('/backends/overview', { query: { + backendName, rangeFrom, rangeTo, refreshInterval, @@ -82,62 +81,59 @@ export function BackendDetailOverview() { const largeScreenOrSmaller = useBreakpoints().isLarge; return ( - - - - - - - - -

- {i18n.translate( - 'xpack.apm.backendDetailLatencyChartTitle', - { defaultMessage: 'Latency' } - )} -

-
- -
-
- - - -

- {i18n.translate( - 'xpack.apm.backendDetailThroughputChartTitle', - { defaultMessage: 'Throughput' } - )} -

-
- -
-
- - - -

- {i18n.translate( - 'xpack.apm.backendDetailFailedTransactionRateChartTitle', - { defaultMessage: 'Failed transaction rate' } - )} -

-
- -
-
-
-
- - -
-
+ + + + + + + +

+ {i18n.translate('xpack.apm.backendDetailLatencyChartTitle', { + defaultMessage: 'Latency', + })} +

+
+ +
+
+ + + +

+ {i18n.translate( + 'xpack.apm.backendDetailThroughputChartTitle', + { defaultMessage: 'Throughput' } + )} +

+
+ +
+
+ + + +

+ {i18n.translate( + 'xpack.apm.backendDetailFailedTransactionRateChartTitle', + { defaultMessage: 'Failed transaction rate' } + )} +

+
+ +
+
+
+
+ + +
); } diff --git a/x-pack/plugins/apm/public/components/app/backend_inventory/backend_inventory_dependencies_table/index.tsx b/x-pack/plugins/apm/public/components/app/backend_inventory/backend_inventory_dependencies_table/index.tsx index 05eb9892fc108..b84e8830aae5f 100644 --- a/x-pack/plugins/apm/public/components/app/backend_inventory/backend_inventory_dependencies_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/backend_inventory/backend_inventory_dependencies_table/index.tsx @@ -64,11 +64,11 @@ export function BackendInventoryDependenciesTable() { } const link = ( { - const apmPluginContextMock = { - observabilityRuleTypeRegistry: { getFormatter: () => undefined }, - } as unknown as ApmPluginContextValue; - const kibanaContextServices = { uiSettings: { get: () => {} }, }; + const apmPluginContextMock = { + observabilityRuleTypeRegistry: { getFormatter: () => undefined }, + core: { + uiSettings: kibanaContextServices.uiSettings, + }, + } as unknown as ApmPluginContextValue; + return ( @@ -39,38 +43,62 @@ export default { export function Example() { const distribution = { - noHits: false, bucketSize: 62350, - buckets: [ - { key: 1624279912350, count: 6 }, - { key: 1624279974700, count: 1 }, - { key: 1624280037050, count: 2 }, - { key: 1624280099400, count: 3 }, - { key: 1624280161750, count: 13 }, - { key: 1624280224100, count: 1 }, - { key: 1624280286450, count: 2 }, - { key: 1624280348800, count: 0 }, - { key: 1624280411150, count: 4 }, - { key: 1624280473500, count: 4 }, - { key: 1624280535850, count: 1 }, - { key: 1624280598200, count: 4 }, - { key: 1624280660550, count: 0 }, - { key: 1624280722900, count: 2 }, - { key: 1624280785250, count: 3 }, - { key: 1624280847600, count: 0 }, + currentPeriod: [ + { x: 1624279912350, y: 6 }, + { x: 1624279974700, y: 1 }, + { x: 1624280037050, y: 2 }, + { x: 1624280099400, y: 3 }, + { x: 1624280161750, y: 13 }, + { x: 1624280224100, y: 1 }, + { x: 1624280286450, y: 2 }, + { x: 1624280348800, y: 0 }, + { x: 1624280411150, y: 4 }, + { x: 1624280473500, y: 4 }, + { x: 1624280535850, y: 1 }, + { x: 1624280598200, y: 4 }, + { x: 1624280660550, y: 0 }, + { x: 1624280722900, y: 2 }, + { x: 1624280785250, y: 3 }, + { x: 1624280847600, y: 0 }, + ], + previousPeriod: [ + { x: 1624279912350, y: 6 }, + { x: 1624279974700, y: 1 }, + { x: 1624280037050, y: 2 }, + { x: 1624280099400, y: 3 }, + { x: 1624280161750, y: 13 }, + { x: 1624280224100, y: 1 }, + { x: 1624280286450, y: 2 }, + { x: 1624280348800, y: 0 }, + { x: 1624280411150, y: 4 }, + { x: 1624280473500, y: 4 }, + { x: 1624280535850, y: 1 }, + { x: 1624280598200, y: 4 }, + { x: 1624280660550, y: 0 }, + { x: 1624280722900, y: 2 }, + { x: 1624280785250, y: 3 }, + { x: 1624280847600, y: 0 }, ], }; - return ; + return ( + + ); } export function EmptyState() { return ( diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx index 3d1d0ee564ba4..abff050457359 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx @@ -8,28 +8,29 @@ import { Axis, Chart, - HistogramBarSeries, + BarSeries, niceTimeFormatter, Position, ScaleType, Settings, - SettingsSpec, - TooltipValue, } from '@elastic/charts'; import { EuiTitle } from '@elastic/eui'; -import d3 from 'd3'; import React, { Suspense, useState } from 'react'; import type { ALERT_RULE_TYPE_ID as ALERT_RULE_TYPE_ID_TYPED } from '@kbn/rule-data-utils'; // @ts-expect-error import { ALERT_RULE_TYPE_ID as ALERT_RULE_TYPE_ID_NON_TYPED } from '@kbn/rule-data-utils/target_node/technical_field_names'; +import { i18n } from '@kbn/i18n'; import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -import { asRelativeDateTimeRange } from '../../../../../common/utils/formatters'; import { useTheme } from '../../../../hooks/use_theme'; +import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { AlertType } from '../../../../../common/alert_types'; import { getAlertAnnotations } from '../../../shared/charts/helper/get_alert_annotations'; +import { ChartContainer } from '../../../shared/charts/chart_container'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { LazyAlertsFlyout } from '../../../../../../observability/public'; +import { useUrlParams } from '../../../../context/url_params_context/use_url_params'; +import { getTimeZone } from '../../../shared/charts/helper/timezone'; const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = ALERT_RULE_TYPE_ID_NON_TYPED; @@ -37,70 +38,71 @@ const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = type ErrorDistributionAPIResponse = APIReturnType<'GET /internal/apm/services/{serviceName}/errors/distribution'>; -interface FormattedBucket { - x0: number; - x: number; - y: number | undefined; -} - -export function getFormattedBuckets( - buckets: ErrorDistributionAPIResponse['buckets'], - bucketSize: number -): FormattedBucket[] { - return buckets.map(({ count, key }) => { - return { - x0: key, - x: key + bucketSize, - y: count, - }; - }); -} - interface Props { + fetchStatus: FETCH_STATUS; distribution: ErrorDistributionAPIResponse; title: React.ReactNode; } -export function ErrorDistribution({ distribution, title }: Props) { +export function ErrorDistribution({ distribution, title, fetchStatus }: Props) { + const { core } = useApmPluginContext(); const theme = useTheme(); - const buckets = getFormattedBuckets( - distribution.buckets, - distribution.bucketSize - ); - const xMin = d3.min(buckets, (d) => d.x0); - const xMax = d3.max(buckets, (d) => d.x0); + const { urlParams } = useUrlParams(); + const { comparisonEnabled } = urlParams; - const xFormatter = niceTimeFormatter([xMin, xMax]); - const { observabilityRuleTypeRegistry } = useApmPluginContext(); + const timeseries = [ + { + data: distribution.currentPeriod, + color: theme.eui.euiColorVis1, + title: i18n.translate('xpack.apm.errorGroup.chart.ocurrences', { + defaultMessage: 'Occurences', + }), + }, + ...(comparisonEnabled + ? [ + { + data: distribution.previousPeriod, + color: theme.eui.euiColorMediumShade, + title: i18n.translate( + 'xpack.apm.errorGroup.chart.ocurrences.previousPeriodLabel', + { defaultMessage: 'Previous period' } + ), + }, + ] + : []), + ]; + const xValues = timeseries.flatMap(({ data }) => data.map(({ x }) => x)); + + const min = Math.min(...xValues); + const max = Math.max(...xValues); + + const xFormatter = niceTimeFormatter([min, max]); + const { observabilityRuleTypeRegistry } = useApmPluginContext(); const { alerts } = useApmServiceContext(); const { getFormatter } = observabilityRuleTypeRegistry; const [selectedAlertId, setSelectedAlertId] = useState( undefined ); - const tooltipProps: SettingsSpec['tooltip'] = { - stickTo: 'top', - headerFormatter: (tooltip: TooltipValue) => { - const serie = buckets.find((bucket) => bucket.x0 === tooltip.value); - if (serie) { - return asRelativeDateTimeRange(serie.x0, serie.x); - } - return `${tooltip.value}`; - }, - }; + const timeZone = getTimeZone(core.uiSettings); return ( <> {title} -
+ - + + {timeseries.map((serie) => { + return ( + + ); + })} {getAlertAnnotations({ alerts: alerts?.filter( (alert) => alert[ALERT_RULE_TYPE_ID]?.[0] === AlertType.ErrorCount ), - chartStartTime: buckets[0]?.x0, + chartStartTime: xValues[0], getFormatter, selectedAlertId, setSelectedAlertId, @@ -150,7 +158,7 @@ export function ErrorDistribution({ distribution, title }: Props) { /> -
+ ); } diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx index 0114348892984..bc12b0c64f179 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx @@ -146,7 +146,7 @@ export function ErrorGroupDetails() { [environment, kuery, serviceName, start, end, groupId] ); - const { errorDistributionData } = useErrorGroupDistributionFetcher({ + const { errorDistributionData, status } = useErrorGroupDistributionFetcher({ serviceName, groupId, environment, @@ -209,6 +209,7 @@ export function ErrorGroupDetails() { )} List', () => { - beforeAll(() => { - mockMoment(); - }); - - it('should render empty state', () => { - const storeState = {}; - const wrapper = mount( - - - - - , - storeState - ); - - expect(toJson(wrapper)).toMatchSnapshot(); - }); - - it('should render with data', () => { - const wrapper = mount( - - - - - - - - - - ); - - expect(toJson(wrapper)).toMatchSnapshot(); - }); -}); diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap deleted file mode 100644 index ee68630daa469..0000000000000 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap +++ /dev/null @@ -1,1335 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ErrorGroupOverview -> List should render empty state 1`] = ` -
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- - - - - - - - - - - - - - - -
-
- - - Group ID - - - - - - - - - - Type - - - - - - Error message and culprit - - - - - - - - - - -
-
- - No errors found - -
-
- - -`; - -exports[`ErrorGroupOverview -> List should render with data 1`] = ` -.c0 { - font-family: 'Roboto Mono','Consolas','Menlo','Courier',monospace; -} - -.c2 { - max-width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.c1 { - max-width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.c3 { - font-family: 'Roboto Mono','Consolas','Menlo','Courier',monospace; - font-size: 18px; - max-width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.c4 { - font-family: 'Roboto Mono','Consolas','Menlo','Courier',monospace; -} - -
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - Group ID - - - - - - - - - - Type - - - - - - Error message and culprit - - - - - - - - - - -
-
- Group ID - - - - -
- -
-
- Type -
- -
-
- Error message and culprit -
-
-
- - - About to blow up! - - -
- -
- elasticapm.contrib.django.client.capture -
-
-
-
-
-
-
-
- Occurrences -
-
- 75 -
-
-
- Latest occurrence -
-
- - 1337 minutes ago (mocking 1515578797) - -
-
-
- Group ID - - - - -
- -
-
- Type -
- -
-
- Error message and culprit -
-
-
- - - AssertionError: - - -
- -
- opbeans.views.oopsie -
-
-
-
-
-
-
-
- Occurrences -
-
- 75 -
-
-
- Latest occurrence -
-
- - 1337 minutes ago (mocking 1515578797) - -
-
-
- Group ID - - - - -
- -
-
- Type -
- -
-
- Error message and culprit -
-
-
- - - AssertionError: Bad luck! - - -
- -
- opbeans.tasks.update_stats -
-
-
-
-
-
-
-
- Occurrences -
-
- 24 -
-
-
- Latest occurrence -
-
- - 1337 minutes ago (mocking 1515578796) - -
-
-
- Group ID - - - - -
- -
-
- Type -
- -
-
- Error message and culprit -
-
-
- - - Customer with ID 8517 not found - - -
- -
- opbeans.views.customer -
-
-
-
-
-
-
-
- Occurrences -
-
- 15 -
-
-
- Latest occurrence -
-
- - 1337 minutes ago (mocking 1515578773) - -
-
-
-
-
-
-
-
- -
-
-
-
-`; diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/List/__fixtures__/props.json b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/__fixtures__/props.json similarity index 100% rename from x-pack/plugins/apm/public/components/app/error_group_overview/List/__fixtures__/props.json rename to x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/__fixtures__/props.json diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx new file mode 100644 index 0000000000000..e61e43c8bb7ea --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.stories.tsx @@ -0,0 +1,100 @@ +/* + * Copyright 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 { Meta, Story } from '@storybook/react'; +import React, { ComponentProps } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; +import { MockUrlParamsContextProvider } from '../../../../context/url_params_context/mock_url_params_context_provider'; + +import { ErrorGroupList } from '.'; + +type Args = ComponentProps; + +const stories: Meta = { + title: 'app/ErrorGroupOverview/ErrorGroupList', + component: ErrorGroupList, + decorators: [ + (StoryComponent) => { + return ( + + + + + + + + ); + }, + ], +}; +export default stories; + +export const Example: Story = (args) => { + return ; +}; +Example.args = { + items: [ + { + message: 'net/http: abort Handler', + occurrenceCount: 14, + culprit: 'Main.func2', + groupId: '83a653297ec29afed264d7b60d5cda7b', + latestOccurrenceAt: '2021-10-21T16:18:41.434Z', + handled: false, + type: 'errorString', + }, + { + message: 'POST /api/orders (500)', + occurrenceCount: 5, + culprit: 'logrusMiddleware', + groupId: '7a640436a9be648fd708703d1ac84650', + latestOccurrenceAt: '2021-10-21T16:18:40.162Z', + handled: false, + type: 'OpError', + }, + { + message: + 'write tcp 10.36.2.24:3000->10.36.1.14:34232: write: connection reset by peer', + occurrenceCount: 4, + culprit: 'apiHandlers.getProductCustomers', + groupId: '95ca0e312c109aa11e298bcf07f1445b', + latestOccurrenceAt: '2021-10-21T16:18:42.650Z', + handled: false, + type: 'OpError', + }, + { + message: + 'write tcp 10.36.0.21:3000->10.36.1.252:57070: write: connection reset by peer', + occurrenceCount: 3, + culprit: 'apiHandlers.getCustomers', + groupId: '4053d7e33d2b716c819bd96d9d6121a2', + latestOccurrenceAt: '2021-10-21T16:07:44.078Z', + handled: false, + type: 'OpError', + }, + { + message: + 'write tcp 10.36.0.21:3000->10.36.0.88:33926: write: broken pipe', + occurrenceCount: 2, + culprit: 'apiHandlers.getOrders', + groupId: '94f4ca8ec8c02e5318cf03f46ae4c1f3', + latestOccurrenceAt: '2021-10-21T16:13:45.742Z', + handled: false, + type: 'OpError', + }, + ], + serviceName: 'test service', +}; + +export const EmptyState: Story = (args) => { + return ; +}; +EmptyState.args = { + items: [], + serviceName: 'test service', +}; diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.test.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.test.tsx new file mode 100644 index 0000000000000..278825c25c68c --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/error_group_list.test.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 { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import React from 'react'; +import * as stories from './error_group_list.stories'; + +const { Example } = composeStories(stories); + +describe('ErrorGroupList', () => { + it('renders', () => { + expect(() => render()).not.toThrowError(); + }); +}); diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/List/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/error_group_overview/List/index.tsx rename to x-pack/plugins/apm/public/components/app/error_group_overview/error_group_list/index.tsx diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx index a445b0d8522c5..5e9095def6e55 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx @@ -7,6 +7,7 @@ import { EuiFlexGroup, + EuiFlexGrid, EuiFlexItem, EuiPanel, EuiSpacer, @@ -15,12 +16,14 @@ import { import { i18n } from '@kbn/i18n'; import React from 'react'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; +import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useErrorGroupDistributionFetcher } from '../../../hooks/use_error_group_distribution_fetcher'; import { useFetcher } from '../../../hooks/use_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; +import { FailedTransactionRateChart } from '../../shared/charts/failed_transaction_rate_chart'; import { ErrorDistribution } from '../error_group_details/Distribution'; -import { ErrorGroupList } from './List'; +import { ErrorGroupList } from './error_group_list'; export function ErrorGroupOverview() { const { serviceName } = useApmServiceContext(); @@ -31,7 +34,7 @@ export function ErrorGroupOverview() { const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { errorDistributionData } = useErrorGroupDistributionFetcher({ + const { errorDistributionData, status } = useErrorGroupDistributionFetcher({ serviceName, groupId: undefined, environment, @@ -70,17 +73,28 @@ export function ErrorGroupOverview() { return ( - - - - - + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx index 945d977e30362..d62955b593df1 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx @@ -13,6 +13,7 @@ import { MemoryRouter } from 'react-router-dom'; import { EuiThemeProvider } from '../../../../../../../src/plugins/kibana_react/common'; import { createKibanaReactContext } from '../../../../../../../src/plugins/kibana_react/public'; import { ServiceHealthStatus } from '../../../../common/service_health_status'; +import { TimeRangeComparisonEnum } from '../../../../common/runtime_types/comparison_type_rt'; import { ServiceInventory } from '.'; import { ApmPluginContextValue } from '../../../context/apm_plugin/apm_plugin_context'; import { @@ -25,7 +26,6 @@ import * as useDynamicIndexPatternHooks from '../../../hooks/use_dynamic_index_p import { SessionStorageMock } from '../../../services/__mocks__/SessionStorageMock'; import { MockUrlParamsContextProvider } from '../../../context/url_params_context/mock_url_params_context_provider'; import * as hook from '../../../context/anomaly_detection_jobs/use_anomaly_detection_jobs_context'; -import { TimeRangeComparisonType } from '../../shared/time_comparison/get_time_range_comparison'; const KibanaReactContext = createKibanaReactContext({ usageCollection: { reportUiCounter: () => {} }, @@ -60,7 +60,7 @@ function wrapper({ children }: { children?: ReactNode }) { start: '2021-02-12T13:20:43.344Z', end: '2021-02-12T13:20:58.344Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, }} > {children} diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx new file mode 100644 index 0000000000000..628ef4617417c --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.stories.tsx @@ -0,0 +1,81 @@ +/* + * Copyright 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 { Meta, Story } from '@storybook/react'; +import React, { ComponentProps } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { CoreStart } from '../../../../../../../../src/core/public'; +import { createKibanaReactContext } from '../../../../../../../../src/plugins/kibana_react/public'; +import { ServiceHealthStatus } from '../../../../../common/service_health_status'; +import type { ApmPluginContextValue } from '../../../../context/apm_plugin/apm_plugin_context'; +import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; +import { ServiceList } from './'; +import { items } from './__fixtures__/service_api_mock_data'; + +type Args = ComponentProps; + +const coreMock = { + http: { + get: async () => { + return { fallBackToTransactions: false }; + }, + }, + notifications: { toasts: { add: () => {} } }, + uiSettings: { get: () => ({}) }, +} as unknown as CoreStart; + +const KibanaReactContext = createKibanaReactContext(coreMock); + +const stories: Meta = { + title: 'app/ServiceInventory/ServiceList', + component: ServiceList, + decorators: [ + (StoryComponent) => { + return ( + + + + + + + + ); + }, + ], +}; +export default stories; + +export const Example: Story = (args) => { + return ; +}; +Example.args = { + isLoading: false, + items, +}; + +export const EmptyState: Story = (args) => { + return ; +}; +EmptyState.args = { + isLoading: false, + items: [], +}; + +export const WithHealthWarnings: Story = (args) => { + return ; +}; +WithHealthWarnings.args = { + isLoading: false, + items: items.map((item) => ({ + ...item, + healthStatus: ServiceHealthStatus.warning, + })), +}; diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx index 69ec1e6b1eb93..5068d13d589c8 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx @@ -5,58 +5,27 @@ * 2.0. */ -import React, { ReactNode } from 'react'; -import { MemoryRouter } from 'react-router-dom'; -import { Breakpoints } from '../../../../hooks/use_breakpoints'; -import { ServiceHealthStatus } from '../../../../../common/service_health_status'; -import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; -import { mockMoment, renderWithTheme } from '../../../../utils/testHelpers'; -import { getServiceColumns, ServiceList } from './'; -import { items } from './__fixtures__/service_api_mock_data'; +import { composeStories } from '@storybook/testing-react'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; import { ENVIRONMENT_ALL } from '../../../../../common/environment_filter_values'; -import { - getCallApmApiSpy, - getCreateCallApmApiSpy, -} from '../../../../services/rest/callApmApiSpy'; +import { Breakpoints } from '../../../../hooks/use_breakpoints'; +import { getServiceColumns } from './'; +import * as stories from './service_list.stories'; -function Wrapper({ children }: { children?: ReactNode }) { - return ( - - {children} - - ); -} +const { Example, EmptyState, WithHealthWarnings } = composeStories(stories); describe('ServiceList', () => { - beforeAll(() => { - mockMoment(); + it('renders empty state', async () => { + render(); - const callApmApiSpy = getCallApmApiSpy().mockImplementation( - ({ endpoint }) => { - if (endpoint === 'GET /internal/apm/fallback_to_transactions') { - return Promise.resolve({ fallbackToTransactions: false }); - } - return Promise.reject(`Response for ${endpoint} is not defined`); - } - ); - - getCreateCallApmApiSpy().mockImplementation(() => callApmApiSpy as any); + expect(await screen.findByRole('table')).toBeInTheDocument(); }); - it('renders empty state', () => { - expect(() => - renderWithTheme(, { - wrapper: Wrapper, - }) - ).not.toThrowError(); - }); + it('renders with data', async () => { + render(); - it('renders with data', () => { - expect(() => - renderWithTheme(, { - wrapper: Wrapper, - }) - ).not.toThrowError(); + expect(await screen.findByRole('table')).toBeInTheDocument(); }); describe('responsive columns', () => { @@ -212,44 +181,20 @@ describe('ServiceList', () => { }); describe('without ML data', () => { - it('does not render the health column', () => { - const { queryByText } = renderWithTheme( - , - { - wrapper: Wrapper, - } - ); - const healthHeading = queryByText('Health'); - - expect(healthHeading).toBeNull(); - }); - it('sorts by throughput', async () => { - const { findByTitle } = renderWithTheme( - , - { - wrapper: Wrapper, - } - ); + render(); - expect(await findByTitle('Throughput')).toBeInTheDocument(); + expect(await screen.findByTitle('Throughput')).toBeInTheDocument(); }); }); describe('with ML data', () => { it('renders the health column', async () => { - const { findByTitle } = renderWithTheme( - ({ - ...item, - healthStatus: ServiceHealthStatus.warning, - }))} - />, - { wrapper: Wrapper } - ); + render(); - expect(await findByTitle('Health')).toBeInTheDocument(); + expect( + await screen.findByRole('button', { name: /Health/ }) + ).toBeInTheDocument(); }); }); }); diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx index c04619338f80b..a545f474746a4 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx @@ -38,10 +38,10 @@ export function BackendContents({ (callApmApi) => { if (backendName) { return callApmApi({ - endpoint: 'GET /internal/apm/service-map/backend/{backendName}', + endpoint: 'GET /internal/apm/service-map/backend', params: { - path: { backendName }, query: { + backendName, environment, start, end, @@ -57,12 +57,11 @@ export function BackendContents({ ); const isLoading = status === FETCH_STATUS.LOADING; - const detailsUrl = apmRouter.link('/backends/{backendName}/overview', { - path: { backendName }, - query: query as TypeOf< - ApmRoutes, - '/backends/{backendName}/overview' - >['query'], + const detailsUrl = apmRouter.link('/backends/overview', { + query: { + ...query, + backendName, + } as TypeOf['query'], }); const trackEvent = useUiTracker(); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/index.tsx index c73d412fb4506..557854dd2692b 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/index.tsx @@ -16,7 +16,7 @@ import { ChartPointerEventContextProvider } from '../../../context/chart_pointer import { useBreakpoints } from '../../../hooks/use_breakpoints'; import { LatencyChart } from '../../shared/charts/latency_chart'; import { TransactionBreakdownChart } from '../../shared/charts/transaction_breakdown_chart'; -import { TransactionErrorRateChart } from '../../shared/charts/transaction_error_rate_chart'; +import { FailedTransactionRateChart } from '../../shared/charts/failed_transaction_rate_chart'; import { ServiceOverviewDependenciesTable } from './service_overview_dependencies_table'; import { ServiceOverviewErrorsTable } from './service_overview_errors_table'; import { ServiceOverviewInstancesChartAndTable } from './service_overview_instances_chart_and_table'; @@ -138,7 +138,7 @@ export function ServiceOverview() { > {!isRumAgent && ( - - - - + + + - {children} - - - - + + {children} + + + + + ); } @@ -93,13 +96,13 @@ describe('transaction_details/distribution', () => { })); render( - - - + , + + { wrapper: Wrapper } ); await waitFor(() => { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx index e4a851b890a7c..15883e7905142 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx @@ -7,7 +7,7 @@ import { EuiAccordion, EuiAccordionProps } from '@elastic/eui'; import { isEmpty } from 'lodash'; -import React, { useState } from 'react'; +import React, { Dispatch, SetStateAction, useState } from 'react'; import { euiStyled } from '../../../../../../../../../../src/plugins/kibana_react/common'; import { Margins } from '../../../../../shared/charts/Timeline'; import { WaterfallItem } from './waterfall_item'; @@ -22,8 +22,8 @@ interface AccordionWaterfallProps { level: number; duration: IWaterfall['duration']; waterfallItemId?: string; + setMaxLevel: Dispatch>; waterfall: IWaterfall; - onToggleEntryTransaction?: () => void; timelineMargins: Margins; onClickWaterfallItem: (item: IWaterfallSpanOrTransaction) => void; } @@ -97,12 +97,13 @@ export function AccordionWaterfall(props: AccordionWaterfallProps) { duration, waterfall, waterfallItemId, + setMaxLevel, timelineMargins, onClickWaterfallItem, - onToggleEntryTransaction, } = props; const nextLevel = level + 1; + setMaxLevel(nextLevel); const children = waterfall.childrenByParentId[item.id] || []; const errorCount = waterfall.getErrorCount(item.id); @@ -139,9 +140,6 @@ export function AccordionWaterfall(props: AccordionWaterfallProps) { forceState={isOpen ? 'open' : 'closed'} onToggle={() => { setIsOpen((isCurrentOpen) => !isCurrentOpen); - if (onToggleEntryTransaction) { - onToggleEntryTransaction(); - } }} > {children.map((child) => ( diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/index.tsx index 3932a02c9d974..5b4bf99f7dae6 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/index.tsx @@ -29,13 +29,6 @@ const Container = euiStyled.div` overflow: hidden; `; -const TIMELINE_MARGINS = { - top: 40, - left: 100, - right: 50, - bottom: 0, -}; - const toggleFlyout = ({ history, item, @@ -72,6 +65,16 @@ export function Waterfall({ waterfall, waterfallItemId }: Props) { const agentMarks = getAgentMarks(waterfall.entryWaterfallTransaction?.doc); const errorMarks = getErrorMarks(waterfall.errorItems); + // Calculate the left margin relative to the deepest level, or 100px, whichever + // is more. + const [maxLevel, setMaxLevel] = useState(0); + const timelineMargins = { + top: 40, + left: Math.max(100, maxLevel * 10), + right: 50, + bottom: 0, + }; + return ( @@ -99,7 +102,7 @@ export function Waterfall({ waterfall, waterfallItemId }: Props) { marks={[...agentMarks, ...errorMarks]} xMax={duration} height={waterfallHeight} - margins={TIMELINE_MARGINS} + margins={timelineMargins} />
@@ -110,16 +113,14 @@ export function Waterfall({ waterfall, waterfallItemId }: Props) { isOpen={isAccordionOpen} item={waterfall.entryWaterfallTransaction} level={0} + setMaxLevel={setMaxLevel} waterfallItemId={waterfallItemId} duration={duration} waterfall={waterfall} - timelineMargins={TIMELINE_MARGINS} + timelineMargins={timelineMargins} onClickWaterfallItem={(item: IWaterfallItem) => toggleFlyout({ history, item }) } - onToggleEntryTransaction={() => - setIsAccordionOpen((isOpen) => !isOpen) - } /> )} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/sticky_span_properties.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/sticky_span_properties.tsx index 2e02dcee95371..cd8f8192beb40 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/sticky_span_properties.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/sticky_span_properties.tsx @@ -103,8 +103,10 @@ export function StickySpanProperties({ span, transaction }: Props) { fieldName: SPAN_DESTINATION_SERVICE_RESOURCE, val: ( { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx index 4001a0624a809..caa0cac3acef8 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx @@ -17,6 +17,7 @@ import { } from '../../../../../../../common/elasticsearch_fieldnames'; import { asDuration } from '../../../../../../../common/utils/formatters'; import { Margins } from '../../../../../shared/charts/Timeline'; +import { TruncateWithTooltip } from '../../../../../shared/truncate_with_tooltip'; import { SyncBadge } from './sync_badge'; import { IWaterfallSpanOrTransaction } from './waterfall_helpers/waterfall_helpers'; import { FailureBadge } from './failure_badge'; @@ -67,6 +68,7 @@ const ItemText = euiStyled.span` display: flex; align-items: center; height: ${({ theme }) => theme.eui.euiSizeL}; + max-width: 100%; /* add margin to all direct descendants */ & > * { @@ -160,7 +162,11 @@ function NameLabel({ item }: { item: IWaterfallSpanOrTransaction }) { : ''; name = `${item.doc.span.composite.count}${compositePrefix} ${name}`; } - return {name}; + return ( + + + + ); case 'transaction': return ( diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallContainer.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallContainer.stories.tsx deleted file mode 100644 index a03b7b29f9666..0000000000000 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallContainer.stories.tsx +++ /dev/null @@ -1,56 +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, { ComponentType } from 'react'; -import { MemoryRouter } from 'react-router-dom'; -import { MockApmPluginContextWrapper } from '../../../../../context/apm_plugin/mock_apm_plugin_context'; -import { WaterfallContainer } from './index'; -import { getWaterfall } from './Waterfall/waterfall_helpers/waterfall_helpers'; -import { - inferredSpans, - simpleTrace, - traceChildStartBeforeParent, - traceWithErrors, - urlParams, -} from './waterfallContainer.stories.data'; - -export default { - title: 'app/TransactionDetails/Waterfall', - component: WaterfallContainer, - decorators: [ - (Story: ComponentType) => ( - - - - - - ), - ], -}; - -export function Example() { - const waterfall = getWaterfall(simpleTrace, '975c8d5bfd1dd20b'); - return ; -} - -export function WithErrors() { - const waterfall = getWaterfall(traceWithErrors, '975c8d5bfd1dd20b'); - return ; -} - -export function ChildStartsBeforeParent() { - const waterfall = getWaterfall( - traceChildStartBeforeParent, - '975c8d5bfd1dd20b' - ); - return ; -} - -export function InferredSpans() { - const waterfall = getWaterfall(inferredSpans, 'f2387d37260d00bd'); - return ; -} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts deleted file mode 100644 index 60285c835bbf3..0000000000000 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts +++ /dev/null @@ -1,2269 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { Location } from 'history'; -import type { ApmUrlParams } from '../../../../../context/url_params_context/types'; -import { APIReturnType } from '../../../../../services/rest/createCallApmApi'; - -export const location = { - pathname: '/services/opbeans-go/transactions/view', - search: - '?rangeFrom=now-24h&rangeTo=now&refreshPaused=true&refreshInterval=0&kuery=service.name%253A%2520%2522opbeans-java%2522%2520or%2520service.name%2520%253A%2520%2522opbeans-go%2522&traceId=513d33fafe99bbe6134749310c9b5322&transactionId=975c8d5bfd1dd20b&transactionName=GET%20%2Fapi%2Forders&transactionType=request', - hash: '', -} as Location; - -type TraceAPIResponse = APIReturnType<'GET /internal/apm/traces/{traceId}'>; - -export const urlParams = { - start: '2020-03-22T15:16:38.742Z', - end: '2020-03-23T15:16:38.742Z', - rangeFrom: 'now-24h', - rangeTo: 'now', - refreshPaused: true, - refreshInterval: 0, - page: 0, - transactionId: '975c8d5bfd1dd20b', - traceId: '513d33fafe99bbe6134749310c9b5322', - transactionName: 'GET /api/orders', - transactionType: 'request', - processorEvent: 'transaction', - serviceName: 'opbeans-go', -} as ApmUrlParams; - -export const simpleTrace = { - traceDocs: [ - { - container: { - id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - process: { - pid: 6, - title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', - version: '1.14.1-SNAPSHOT', - }, - internal: { - sampler: { - value: 46, - }, - }, - source: { - ip: '172.19.0.13', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: '172.19.0.9', - full: 'http://172.19.0.9:3000/api/orders', - }, - observer: { - hostname: 'f37f48d8b60b', - id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', - ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.785Z', - ecs: { - version: '1.4.0', - }, - service: { - node: { - name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '10.0.2', - }, - language: { - name: 'Java', - version: '10.0.2', - }, - version: 'None', - }, - host: { - hostname: '4cf84d094553', - os: { - platform: 'Linux', - }, - ip: '172.19.0.9', - name: '4cf84d094553', - architecture: 'amd64', - }, - http: { - request: { - headers: { - Accept: ['*/*'], - 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], - Host: ['172.19.0.9:3000'], - 'Accept-Encoding': ['gzip, deflate'], - }, - method: 'get', - socket: { - encrypted: false, - remote_address: '172.19.0.13', - }, - body: { - original: '[REDACTED]', - }, - }, - response: { - headers: { - 'Transfer-Encoding': ['chunked'], - Date: ['Mon, 23 Mar 2020 15:04:28 GMT'], - 'Content-Type': ['application/json;charset=ISO-8859-1'], - }, - status_code: 200, - finished: true, - headers_sent: true, - }, - version: '1.1', - }, - client: { - ip: '172.19.0.13', - }, - transaction: { - duration: { - us: 18842, - }, - result: 'HTTP 2xx', - name: 'DispatcherServlet#doGet', - id: '49809ad3c26adf74', - span_count: { - dropped: 0, - started: 1, - }, - type: 'request', - sampled: true, - }, - user_agent: { - original: 'Python/3.7 aiohttp/3.3.2', - name: 'Other', - device: { - name: 'Other', - }, - }, - timestamp: { - us: 1584975868785000, - }, - }, - { - parent: { - id: 'fc107f7b556eb49b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: 'opbeans-go', - full: 'http://opbeans-go:3000/api/orders', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - framework: { - name: 'gin', - version: 'v1.4.0', - }, - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - duration: { - us: 16597, - }, - result: 'HTTP 2xx', - name: 'GET /api/orders', - id: '975c8d5bfd1dd20b', - span_count: { - dropped: 0, - started: 1, - }, - type: 'request', - sampled: true, - }, - timestamp: { - us: 1584975868787052, - }, - }, - { - parent: { - id: 'daae24d83c269918', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - timestamp: { - us: 1584975868788603, - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: 'opbeans-go', - full: 'http://opbeans-go:3000/api/orders', - }, - '@timestamp': '2020-03-23T15:04:28.788Z', - service: { - node: { - name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - environment: 'production', - framework: { - name: 'django', - version: '2.1.13', - }, - name: 'opbeans-python', - runtime: { - name: 'CPython', - version: '3.6.10', - }, - language: { - name: 'python', - version: '3.6.10', - }, - version: 'None', - }, - transaction: { - result: 'HTTP 2xx', - duration: { - us: 14648, - }, - name: 'GET opbeans.views.orders', - span_count: { - dropped: 0, - started: 1, - }, - id: '6fb0ff7365b87298', - type: 'request', - sampled: true, - }, - }, - { - container: { - id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - parent: { - id: '49809ad3c26adf74', - }, - process: { - pid: 6, - title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', - version: '1.14.1-SNAPSHOT', - }, - internal: { - sampler: { - value: 44, - }, - }, - destination: { - address: 'opbeans-go', - port: 3000, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: 'f37f48d8b60b', - id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', - type: 'apm-server', - ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.785Z', - ecs: { - version: '1.4.0', - }, - service: { - node: { - name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '10.0.2', - }, - language: { - name: 'Java', - version: '10.0.2', - }, - version: 'None', - }, - host: { - hostname: '4cf84d094553', - os: { - platform: 'Linux', - }, - ip: '172.19.0.9', - name: '4cf84d094553', - architecture: 'amd64', - }, - connection: { - hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", - }, - transaction: { - id: '49809ad3c26adf74', - }, - timestamp: { - us: 1584975868785273, - }, - span: { - duration: { - us: 17530, - }, - subtype: 'http', - name: 'GET opbeans-go', - destination: { - service: { - resource: 'opbeans-go:3000', - name: 'http://opbeans-go:3000', - type: 'external', - }, - }, - http: { - response: { - status_code: 200, - }, - url: { - original: 'http://opbeans-go:3000/api/orders', - }, - }, - id: 'fc107f7b556eb49b', - type: 'external', - }, - }, - { - parent: { - id: '975c8d5bfd1dd20b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - processor: { - name: 'transaction', - event: 'span', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - id: '975c8d5bfd1dd20b', - }, - timestamp: { - us: 1584975868787174, - }, - span: { - duration: { - us: 16250, - }, - subtype: 'http', - destination: { - service: { - resource: 'opbeans-python:3000', - name: 'http://opbeans-python:3000', - type: 'external', - }, - }, - name: 'GET opbeans-python:3000', - http: { - response: { - status_code: 200, - }, - url: { - original: 'http://opbeans-python:3000/api/orders', - }, - }, - id: 'daae24d83c269918', - type: 'external', - }, - }, - { - container: { - id: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - parent: { - id: '6fb0ff7365b87298', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - processor: { - name: 'transaction', - event: 'span', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.790Z', - service: { - node: { - name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - environment: 'production', - framework: { - name: 'django', - version: '2.1.13', - }, - name: 'opbeans-python', - runtime: { - name: 'CPython', - version: '3.6.10', - }, - language: { - name: 'python', - version: '3.6.10', - }, - version: 'None', - }, - transaction: { - id: '6fb0ff7365b87298', - }, - timestamp: { - us: 1584975868790080, - }, - span: { - duration: { - us: 2519, - }, - subtype: 'postgresql', - name: 'SELECT FROM opbeans_order', - destination: { - service: { - resource: 'postgresql', - name: 'postgresql', - type: 'db', - }, - }, - action: 'query', - id: 'c9407abb4d08ead1', - type: 'db', - sync: true, - db: { - statement: - 'SELECT "opbeans_order"."id", "opbeans_order"."customer_id", "opbeans_customer"."full_name", "opbeans_order"."created_at" FROM "opbeans_order" INNER JOIN "opbeans_customer" ON ("opbeans_order"."customer_id" = "opbeans_customer"."id") LIMIT 1000', - type: 'sql', - }, - }, - }, - ], - exceedsMax: false, - errorDocs: [], -} as TraceAPIResponse; - -export const traceWithErrors = { - traceDocs: [ - { - container: { - id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - process: { - pid: 6, - title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', - version: '1.14.1-SNAPSHOT', - }, - internal: { - sampler: { - value: 46, - }, - }, - source: { - ip: '172.19.0.13', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: '172.19.0.9', - full: 'http://172.19.0.9:3000/api/orders', - }, - observer: { - hostname: 'f37f48d8b60b', - id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', - ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.785Z', - ecs: { - version: '1.4.0', - }, - service: { - node: { - name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '10.0.2', - }, - language: { - name: 'Java', - version: '10.0.2', - }, - version: 'None', - }, - host: { - hostname: '4cf84d094553', - os: { - platform: 'Linux', - }, - ip: '172.19.0.9', - name: '4cf84d094553', - architecture: 'amd64', - }, - http: { - request: { - headers: { - Accept: ['*/*'], - 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], - Host: ['172.19.0.9:3000'], - 'Accept-Encoding': ['gzip, deflate'], - }, - method: 'get', - socket: { - encrypted: false, - remote_address: '172.19.0.13', - }, - body: { - original: '[REDACTED]', - }, - }, - response: { - headers: { - 'Transfer-Encoding': ['chunked'], - Date: ['Mon, 23 Mar 2020 15:04:28 GMT'], - 'Content-Type': ['application/json;charset=ISO-8859-1'], - }, - status_code: 200, - finished: true, - headers_sent: true, - }, - version: '1.1', - }, - client: { - ip: '172.19.0.13', - }, - transaction: { - duration: { - us: 18842, - }, - result: 'HTTP 2xx', - name: 'DispatcherServlet#doGet', - id: '49809ad3c26adf74', - span_count: { - dropped: 0, - started: 1, - }, - type: 'request', - sampled: true, - }, - user_agent: { - original: 'Python/3.7 aiohttp/3.3.2', - name: 'Other', - device: { - name: 'Other', - }, - }, - timestamp: { - us: 1584975868785000, - }, - }, - { - parent: { - id: 'fc107f7b556eb49b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: 'opbeans-go', - full: 'http://opbeans-go:3000/api/orders', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - framework: { - name: 'gin', - version: 'v1.4.0', - }, - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - duration: { - us: 16597, - }, - result: 'HTTP 2xx', - name: 'GET /api/orders', - id: '975c8d5bfd1dd20b', - span_count: { - dropped: 0, - started: 1, - }, - type: 'request', - sampled: true, - }, - timestamp: { - us: 1584975868787052, - }, - }, - { - parent: { - id: 'daae24d83c269918', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - timestamp: { - us: 1584975868788603, - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: 'opbeans-go', - full: 'http://opbeans-go:3000/api/orders', - }, - '@timestamp': '2020-03-23T15:04:28.788Z', - service: { - node: { - name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - environment: 'production', - framework: { - name: 'django', - version: '2.1.13', - }, - name: 'opbeans-python', - runtime: { - name: 'CPython', - version: '3.6.10', - }, - language: { - name: 'python', - version: '3.6.10', - }, - version: 'None', - }, - transaction: { - result: 'HTTP 2xx', - duration: { - us: 14648, - }, - name: 'GET opbeans.views.orders', - span_count: { - dropped: 0, - started: 1, - }, - id: '6fb0ff7365b87298', - type: 'request', - sampled: true, - }, - }, - { - container: { - id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - parent: { - id: '49809ad3c26adf74', - }, - process: { - pid: 6, - title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', - version: '1.14.1-SNAPSHOT', - }, - internal: { - sampler: { - value: 44, - }, - }, - destination: { - address: 'opbeans-go', - port: 3000, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: 'f37f48d8b60b', - id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', - type: 'apm-server', - ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.785Z', - ecs: { - version: '1.4.0', - }, - service: { - node: { - name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '10.0.2', - }, - language: { - name: 'Java', - version: '10.0.2', - }, - version: 'None', - }, - host: { - hostname: '4cf84d094553', - os: { - platform: 'Linux', - }, - ip: '172.19.0.9', - name: '4cf84d094553', - architecture: 'amd64', - }, - connection: { - hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", - }, - transaction: { - id: '49809ad3c26adf74', - }, - timestamp: { - us: 1584975868785273, - }, - span: { - duration: { - us: 17530, - }, - subtype: 'http', - name: 'GET opbeans-go', - destination: { - service: { - resource: 'opbeans-go:3000', - name: 'http://opbeans-go:3000', - type: 'external', - }, - }, - http: { - response: { - status_code: 200, - }, - url: { - original: 'http://opbeans-go:3000/api/orders', - }, - }, - id: 'fc107f7b556eb49b', - type: 'external', - }, - }, - { - parent: { - id: '975c8d5bfd1dd20b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - processor: { - name: 'transaction', - event: 'span', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - id: '975c8d5bfd1dd20b', - }, - timestamp: { - us: 1584975868787174, - }, - span: { - duration: { - us: 16250, - }, - subtype: 'http', - destination: { - service: { - resource: 'opbeans-python:3000', - name: 'http://opbeans-python:3000', - type: 'external', - }, - }, - name: 'GET opbeans-python:3000', - http: { - response: { - status_code: 200, - }, - url: { - original: 'http://opbeans-python:3000/api/orders', - }, - }, - id: 'daae24d83c269918', - type: 'external', - }, - }, - { - container: { - id: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - parent: { - id: '6fb0ff7365b87298', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - processor: { - name: 'transaction', - event: 'span', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.790Z', - service: { - node: { - name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - environment: 'production', - framework: { - name: 'django', - version: '2.1.13', - }, - name: 'opbeans-python', - runtime: { - name: 'CPython', - version: '3.6.10', - }, - language: { - name: 'python', - version: '3.6.10', - }, - version: 'None', - }, - transaction: { - id: '6fb0ff7365b87298', - }, - timestamp: { - us: 1584975868790080, - }, - span: { - duration: { - us: 2519, - }, - subtype: 'postgresql', - name: 'SELECT FROM opbeans_order', - destination: { - service: { - resource: 'postgresql', - name: 'postgresql', - type: 'db', - }, - }, - action: 'query', - id: 'c9407abb4d08ead1', - type: 'db', - sync: true, - db: { - statement: - 'SELECT "opbeans_order"."id", "opbeans_order"."customer_id", "opbeans_customer"."full_name", "opbeans_order"."created_at" FROM "opbeans_order" INNER JOIN "opbeans_customer" ON ("opbeans_order"."customer_id" = "opbeans_customer"."id") LIMIT 1000', - type: 'sql', - }, - }, - }, - ], - exceedsMax: false, - errorDocs: [ - { - parent: { - id: '975c8d5bfd1dd20b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - error: { - culprit: 'logrusMiddleware', - log: { - level: 'error', - message: 'GET //api/products (502)', - }, - id: '1f3cb98206b5c54225cb7c8908a658da', - grouping_key: '4dba2ff58fe6c036a5dee2ce411e512a', - }, - processor: { - name: 'error', - event: 'error', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T16:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - id: '975c8d5bfd1dd20b', - sampled: false, - }, - timestamp: { - us: 1584975868787052, - }, - }, - { - parent: { - id: '6fb0ff7365b87298', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - error: { - culprit: 'logrusMiddleware', - log: { - level: 'error', - message: 'GET //api/products (502)', - }, - id: '1f3cb98206b5c54225cb7c8908a658d2', - grouping_key: '4dba2ff58fe6c036a5dee2ce411e512a', - }, - processor: { - name: 'error', - event: 'error', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T16:04:28.790Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - name: 'opbeans-python', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - id: '6fb0ff7365b87298', - sampled: false, - }, - timestamp: { - us: 1584975868790000, - }, - }, - ], -} as unknown as TraceAPIResponse; - -export const traceChildStartBeforeParent = { - traceDocs: [ - { - container: { - id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - process: { - pid: 6, - title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', - version: '1.14.1-SNAPSHOT', - }, - internal: { - sampler: { - value: 46, - }, - }, - source: { - ip: '172.19.0.13', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: '172.19.0.9', - full: 'http://172.19.0.9:3000/api/orders', - }, - observer: { - hostname: 'f37f48d8b60b', - id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', - ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.785Z', - ecs: { - version: '1.4.0', - }, - service: { - node: { - name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '10.0.2', - }, - language: { - name: 'Java', - version: '10.0.2', - }, - version: 'None', - }, - host: { - hostname: '4cf84d094553', - os: { - platform: 'Linux', - }, - ip: '172.19.0.9', - name: '4cf84d094553', - architecture: 'amd64', - }, - http: { - request: { - headers: { - Accept: ['*/*'], - 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], - Host: ['172.19.0.9:3000'], - 'Accept-Encoding': ['gzip, deflate'], - }, - method: 'get', - socket: { - encrypted: false, - remote_address: '172.19.0.13', - }, - body: { - original: '[REDACTED]', - }, - }, - response: { - headers: { - 'Transfer-Encoding': ['chunked'], - Date: ['Mon, 23 Mar 2020 15:04:28 GMT'], - 'Content-Type': ['application/json;charset=ISO-8859-1'], - }, - status_code: 200, - finished: true, - headers_sent: true, - }, - version: '1.1', - }, - client: { - ip: '172.19.0.13', - }, - transaction: { - duration: { - us: 18842, - }, - result: 'HTTP 2xx', - name: 'DispatcherServlet#doGet', - id: '49809ad3c26adf74', - span_count: { - dropped: 0, - started: 1, - }, - type: 'request', - sampled: true, - }, - user_agent: { - original: 'Python/3.7 aiohttp/3.3.2', - name: 'Other', - device: { - name: 'Other', - }, - }, - timestamp: { - us: 1584975868785000, - }, - }, - { - parent: { - id: 'fc107f7b556eb49b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: 'opbeans-go', - full: 'http://opbeans-go:3000/api/orders', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - framework: { - name: 'gin', - version: 'v1.4.0', - }, - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - duration: { - us: 16597, - }, - result: 'HTTP 2xx', - name: 'GET /api/orders', - id: '975c8d5bfd1dd20b', - span_count: { - dropped: 0, - started: 1, - }, - type: 'request', - sampled: true, - }, - timestamp: { - us: 1584975868787052, - }, - }, - { - parent: { - id: 'daae24d83c269918', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - timestamp: { - us: 1584975868780000, - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/orders', - scheme: 'http', - port: 3000, - domain: 'opbeans-go', - full: 'http://opbeans-go:3000/api/orders', - }, - '@timestamp': '2020-03-23T15:04:28.788Z', - service: { - node: { - name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - environment: 'production', - framework: { - name: 'django', - version: '2.1.13', - }, - name: 'opbeans-python', - runtime: { - name: 'CPython', - version: '3.6.10', - }, - language: { - name: 'python', - version: '3.6.10', - }, - version: 'None', - }, - transaction: { - result: 'HTTP 2xx', - duration: { - us: 1464, - }, - name: 'I started before my parent 😰', - span_count: { - dropped: 0, - started: 1, - }, - id: '6fb0ff7365b87298', - type: 'request', - sampled: true, - }, - }, - { - container: { - id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - parent: { - id: '49809ad3c26adf74', - }, - process: { - pid: 6, - title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', - version: '1.14.1-SNAPSHOT', - }, - internal: { - sampler: { - value: 44, - }, - }, - destination: { - address: 'opbeans-go', - port: 3000, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: 'f37f48d8b60b', - id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', - type: 'apm-server', - ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.785Z', - ecs: { - version: '1.4.0', - }, - service: { - node: { - name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '10.0.2', - }, - language: { - name: 'Java', - version: '10.0.2', - }, - version: 'None', - }, - host: { - hostname: '4cf84d094553', - os: { - platform: 'Linux', - }, - ip: '172.19.0.9', - name: '4cf84d094553', - architecture: 'amd64', - }, - connection: { - hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", - }, - transaction: { - id: '49809ad3c26adf74', - }, - timestamp: { - us: 1584975868785273, - }, - span: { - duration: { - us: 17530, - }, - subtype: 'http', - name: 'GET opbeans-go', - destination: { - service: { - resource: 'opbeans-go:3000', - name: 'http://opbeans-go:3000', - type: 'external', - }, - }, - http: { - response: { - status_code: 200, - }, - url: { - original: 'http://opbeans-go:3000/api/orders', - }, - }, - id: 'fc107f7b556eb49b', - type: 'external', - }, - }, - { - parent: { - id: '975c8d5bfd1dd20b', - }, - agent: { - name: 'go', - version: '1.7.2', - }, - processor: { - name: 'transaction', - event: 'span', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.787Z', - service: { - node: { - name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', - }, - environment: 'production', - name: 'opbeans-go', - runtime: { - name: 'gc', - version: 'go1.14.1', - }, - language: { - name: 'go', - version: 'go1.14.1', - }, - version: 'None', - }, - transaction: { - id: '975c8d5bfd1dd20b', - }, - timestamp: { - us: 1584975868787174, - }, - span: { - duration: { - us: 16250, - }, - subtype: 'http', - destination: { - service: { - resource: 'opbeans-python:3000', - name: 'http://opbeans-python:3000', - type: 'external', - }, - }, - name: 'I am his 👇🏻 parent 😡', - http: { - response: { - status_code: 200, - }, - url: { - original: 'http://opbeans-python:3000/api/orders', - }, - }, - id: 'daae24d83c269918', - type: 'external', - }, - }, - { - container: { - id: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - parent: { - id: '6fb0ff7365b87298', - }, - agent: { - name: 'python', - version: '5.5.2', - }, - processor: { - name: 'transaction', - event: 'span', - }, - trace: { - id: '513d33fafe99bbe6134749310c9b5322', - }, - '@timestamp': '2020-03-23T15:04:28.790Z', - service: { - node: { - name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', - }, - environment: 'production', - framework: { - name: 'django', - version: '2.1.13', - }, - name: 'opbeans-python', - runtime: { - name: 'CPython', - version: '3.6.10', - }, - language: { - name: 'python', - version: '3.6.10', - }, - version: 'None', - }, - transaction: { - id: '6fb0ff7365b87298', - }, - timestamp: { - us: 1584975868781000, - }, - span: { - duration: { - us: 2519, - }, - subtype: 'postgresql', - name: 'I am using my parents skew 😇', - destination: { - service: { - resource: 'postgresql', - name: 'postgresql', - type: 'db', - }, - }, - action: 'query', - id: 'c9407abb4d08ead1', - type: 'db', - sync: true, - db: { - statement: - 'SELECT "opbeans_order"."id", "opbeans_order"."customer_id", "opbeans_customer"."full_name", "opbeans_order"."created_at" FROM "opbeans_order" INNER JOIN "opbeans_customer" ON ("opbeans_order"."customer_id" = "opbeans_customer"."id") LIMIT 1000', - type: 'sql', - }, - }, - }, - ], - exceedsMax: false, - errorDocs: [], -} as TraceAPIResponse; - -export const inferredSpans = { - traceDocs: [ - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - source: { - ip: '172.18.0.8', - }, - processor: { - name: 'transaction', - event: 'transaction', - }, - url: { - path: '/api/products/2', - scheme: 'http', - port: 3000, - domain: '172.18.0.7', - full: 'http://172.18.0.7:3000/api/products/2', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.786Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - client: { - ip: '172.18.0.8', - }, - http: { - request: { - headers: { - Accept: ['*/*'], - 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], - Host: ['172.18.0.7:3000'], - 'Accept-Encoding': ['gzip, deflate'], - }, - method: 'get', - socket: { - encrypted: false, - remote_address: '172.18.0.8', - }, - }, - response: { - headers: { - 'Transfer-Encoding': ['chunked'], - Date: ['Thu, 09 Apr 2020 11:36:01 GMT'], - 'Content-Type': ['application/json;charset=UTF-8'], - }, - status_code: 200, - finished: true, - headers_sent: true, - }, - version: '1.1', - }, - user_agent: { - original: 'Python/3.7 aiohttp/3.3.2', - name: 'Other', - device: { - name: 'Other', - }, - }, - transaction: { - duration: { - us: 237537, - }, - result: 'HTTP 2xx', - name: 'APIRestController#product', - span_count: { - dropped: 0, - started: 3, - }, - id: 'f2387d37260d00bd', - type: 'request', - sampled: true, - }, - timestamp: { - us: 1586432160786001, - }, - }, - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - parent: { - id: 'f2387d37260d00bd', - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.810Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - transaction: { - id: 'f2387d37260d00bd', - }, - span: { - duration: { - us: 204574, - }, - subtype: 'inferred', - name: 'ServletInvocableHandlerMethod#invokeAndHandle', - id: 'a5df600bd7bd5e38', - type: 'app', - }, - timestamp: { - us: 1586432160810441, - }, - }, - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - parent: { - id: 'a5df600bd7bd5e38', - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - type: 'apm-server', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.810Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - transaction: { - id: 'f2387d37260d00bd', - }, - timestamp: { - us: 1586432160810441, - }, - span: { - duration: { - us: 102993, - }, - stacktrace: [ - { - library_frame: true, - exclude_from_grouping: false, - filename: 'InvocableHandlerMethod.java', - line: { - number: -1, - }, - function: 'doInvoke', - }, - { - exclude_from_grouping: false, - library_frame: true, - filename: 'InvocableHandlerMethod.java', - line: { - number: -1, - }, - function: 'invokeForRequest', - }, - ], - subtype: 'inferred', - name: 'APIRestController#product', - id: '808dc34fc41ce522', - type: 'app', - }, - }, - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - parent: { - id: 'f2387d37260d00bd', - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - processor: { - name: 'transaction', - event: 'span', - }, - labels: { - productId: '2', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.832Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - transaction: { - id: 'f2387d37260d00bd', - }, - timestamp: { - us: 1586432160832300, - }, - span: { - duration: { - us: 99295, - }, - name: 'OpenTracing product span', - id: '41226ae63af4f235', - type: 'unknown', - }, - child: { id: ['8d80de06aa11a6fc'] }, - }, - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - parent: { - id: '808dc34fc41ce522', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.859Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - transaction: { - id: 'f2387d37260d00bd', - }, - timestamp: { - us: 1586432160859600, - }, - span: { - duration: { - us: 53835, - }, - subtype: 'inferred', - name: 'Loader#executeQueryStatement', - id: '8d80de06aa11a6fc', - type: 'app', - }, - }, - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - parent: { - id: '41226ae63af4f235', - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - destination: { - address: 'postgres', - port: 5432, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.903Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - transaction: { - id: 'f2387d37260d00bd', - }, - timestamp: { - us: 1586432160903236, - }, - span: { - duration: { - us: 10211, - }, - subtype: 'postgresql', - destination: { - service: { - resource: 'postgresql', - name: 'postgresql', - type: 'db', - }, - }, - name: 'SELECT FROM products', - action: 'query', - id: '3708d5623658182f', - type: 'db', - db: { - statement: - 'select product0_.id as col_0_0_, product0_.sku as col_1_0_, product0_.name as col_2_0_, product0_.description as col_3_0_, product0_.cost as col_4_0_, product0_.selling_price as col_5_0_, product0_.stock as col_6_0_, producttyp1_.id as col_7_0_, producttyp1_.name as col_8_0_, (select sum(orderline2_.amount) from order_lines orderline2_ where orderline2_.product_id=product0_.id) as col_9_0_ from products product0_ left outer join product_types producttyp1_ on product0_.type_id=producttyp1_.id where product0_.id=?', - type: 'sql', - user: { - name: 'postgres', - }, - }, - }, - }, - { - container: { - id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - parent: { - id: '41226ae63af4f235', - }, - process: { - pid: 6, - title: '/opt/java/openjdk/bin/java', - ppid: 1, - }, - agent: { - name: 'java', - ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', - version: '1.15.1-SNAPSHOT', - }, - destination: { - address: 'postgres', - port: 5432, - }, - processor: { - name: 'transaction', - event: 'span', - }, - observer: { - hostname: '7189f754b5a3', - id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', - ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', - type: 'apm-server', - version: '8.0.0', - version_major: 8, - }, - trace: { - id: '3b0dc77f3754e5bcb9da0e4c15e0db97', - }, - '@timestamp': '2020-04-09T11:36:00.859Z', - ecs: { - version: '1.5.0', - }, - service: { - node: { - name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', - }, - environment: 'production', - name: 'opbeans-java', - runtime: { - name: 'Java', - version: '11.0.6', - }, - language: { - name: 'Java', - version: '11.0.6', - }, - version: 'None', - }, - host: { - hostname: 'fc2ae281f56f', - os: { - platform: 'Linux', - }, - ip: '172.18.0.7', - name: 'fc2ae281f56f', - architecture: 'amd64', - }, - transaction: { - id: 'f2387d37260d00bd', - }, - timestamp: { - us: 1586432160859508, - }, - span: { - duration: { - us: 4503, - }, - subtype: 'postgresql', - destination: { - service: { - resource: 'postgresql', - name: 'postgresql', - type: 'db', - }, - }, - name: 'empty query', - action: 'query', - id: '9871cfd612368932', - type: 'db', - db: { - rows_affected: 0, - statement: '(empty query)', - type: 'sql', - user: { - name: 'postgres', - }, - }, - }, - }, - ], - exceedsMax: false, - errorDocs: [], -} as TraceAPIResponse; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.stories.data.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.stories.data.ts new file mode 100644 index 0000000000000..6cca3726a7d00 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.stories.data.ts @@ -0,0 +1,5865 @@ +/* + * Copyright 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 { Location } from 'history'; +import type { ApmUrlParams } from '../../../../../context/url_params_context/types'; +import { APIReturnType } from '../../../../../services/rest/createCallApmApi'; + +export const location = { + pathname: '/services/opbeans-go/transactions/view', + search: + '?rangeFrom=now-24h&rangeTo=now&refreshPaused=true&refreshInterval=0&kuery=service.name%253A%2520%2522opbeans-java%2522%2520or%2520service.name%2520%253A%2520%2522opbeans-go%2522&traceId=513d33fafe99bbe6134749310c9b5322&transactionId=975c8d5bfd1dd20b&transactionName=GET%20%2Fapi%2Forders&transactionType=request', + hash: '', +} as Location; + +type TraceAPIResponse = APIReturnType<'GET /internal/apm/traces/{traceId}'>; + +export const urlParams = { + start: '2020-03-22T15:16:38.742Z', + end: '2020-03-23T15:16:38.742Z', + rangeFrom: 'now-24h', + rangeTo: 'now', + refreshPaused: true, + refreshInterval: 0, + page: 0, + transactionId: '975c8d5bfd1dd20b', + traceId: '513d33fafe99bbe6134749310c9b5322', + transactionName: 'GET /api/orders', + transactionType: 'request', + processorEvent: 'transaction', + serviceName: 'opbeans-go', +} as ApmUrlParams; + +export const simpleTrace = { + traceDocs: [ + { + container: { + id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + process: { + pid: 6, + title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', + version: '1.14.1-SNAPSHOT', + }, + internal: { + sampler: { + value: 46, + }, + }, + source: { + ip: '172.19.0.13', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: '172.19.0.9', + full: 'http://172.19.0.9:3000/api/orders', + }, + observer: { + hostname: 'f37f48d8b60b', + id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', + ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.785Z', + ecs: { + version: '1.4.0', + }, + service: { + node: { + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '10.0.2', + }, + language: { + name: 'Java', + version: '10.0.2', + }, + version: 'None', + }, + host: { + hostname: '4cf84d094553', + os: { + platform: 'Linux', + }, + ip: '172.19.0.9', + name: '4cf84d094553', + architecture: 'amd64', + }, + http: { + request: { + headers: { + Accept: ['*/*'], + 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], + Host: ['172.19.0.9:3000'], + 'Accept-Encoding': ['gzip, deflate'], + }, + method: 'get', + socket: { + encrypted: false, + remote_address: '172.19.0.13', + }, + body: { + original: '[REDACTED]', + }, + }, + response: { + headers: { + 'Transfer-Encoding': ['chunked'], + Date: ['Mon, 23 Mar 2020 15:04:28 GMT'], + 'Content-Type': ['application/json;charset=ISO-8859-1'], + }, + status_code: 200, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + client: { + ip: '172.19.0.13', + }, + transaction: { + duration: { + us: 18842, + }, + result: 'HTTP 2xx', + name: 'DispatcherServlet#doGet', + id: '49809ad3c26adf74', + span_count: { + dropped: 0, + started: 1, + }, + type: 'request', + sampled: true, + }, + user_agent: { + original: 'Python/3.7 aiohttp/3.3.2', + name: 'Other', + device: { + name: 'Other', + }, + }, + timestamp: { + us: 1584975868785000, + }, + }, + { + parent: { + id: 'fc107f7b556eb49b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: 'opbeans-go', + full: 'http://opbeans-go:3000/api/orders', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + framework: { + name: 'gin', + version: 'v1.4.0', + }, + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + duration: { + us: 16597, + }, + result: 'HTTP 2xx', + name: 'GET /api/orders', + id: '975c8d5bfd1dd20b', + span_count: { + dropped: 0, + started: 1, + }, + type: 'request', + sampled: true, + }, + timestamp: { + us: 1584975868787052, + }, + }, + { + parent: { + id: 'daae24d83c269918', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + timestamp: { + us: 1584975868788603, + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: 'opbeans-go', + full: 'http://opbeans-go:3000/api/orders', + }, + '@timestamp': '2020-03-23T15:04:28.788Z', + service: { + node: { + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + environment: 'production', + framework: { + name: 'django', + version: '2.1.13', + }, + name: 'opbeans-python', + runtime: { + name: 'CPython', + version: '3.6.10', + }, + language: { + name: 'python', + version: '3.6.10', + }, + version: 'None', + }, + transaction: { + result: 'HTTP 2xx', + duration: { + us: 14648, + }, + name: 'GET opbeans.views.orders', + span_count: { + dropped: 0, + started: 1, + }, + id: '6fb0ff7365b87298', + type: 'request', + sampled: true, + }, + }, + { + container: { + id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + parent: { + id: '49809ad3c26adf74', + }, + process: { + pid: 6, + title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', + version: '1.14.1-SNAPSHOT', + }, + internal: { + sampler: { + value: 44, + }, + }, + destination: { + address: 'opbeans-go', + port: 3000, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: 'f37f48d8b60b', + id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', + type: 'apm-server', + ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.785Z', + ecs: { + version: '1.4.0', + }, + service: { + node: { + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '10.0.2', + }, + language: { + name: 'Java', + version: '10.0.2', + }, + version: 'None', + }, + host: { + hostname: '4cf84d094553', + os: { + platform: 'Linux', + }, + ip: '172.19.0.9', + name: '4cf84d094553', + architecture: 'amd64', + }, + connection: { + hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", + }, + transaction: { + id: '49809ad3c26adf74', + }, + timestamp: { + us: 1584975868785273, + }, + span: { + duration: { + us: 17530, + }, + subtype: 'http', + name: 'GET opbeans-go', + destination: { + service: { + resource: 'opbeans-go:3000', + name: 'http://opbeans-go:3000', + type: 'external', + }, + }, + http: { + response: { + status_code: 200, + }, + url: { + original: 'http://opbeans-go:3000/api/orders', + }, + }, + id: 'fc107f7b556eb49b', + type: 'external', + }, + }, + { + parent: { + id: '975c8d5bfd1dd20b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + processor: { + name: 'transaction', + event: 'span', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + id: '975c8d5bfd1dd20b', + }, + timestamp: { + us: 1584975868787174, + }, + span: { + duration: { + us: 16250, + }, + subtype: 'http', + destination: { + service: { + resource: 'opbeans-python:3000', + name: 'http://opbeans-python:3000', + type: 'external', + }, + }, + name: 'GET opbeans-python:3000', + http: { + response: { + status_code: 200, + }, + url: { + original: 'http://opbeans-python:3000/api/orders', + }, + }, + id: 'daae24d83c269918', + type: 'external', + }, + }, + { + container: { + id: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + parent: { + id: '6fb0ff7365b87298', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + processor: { + name: 'transaction', + event: 'span', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.790Z', + service: { + node: { + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + environment: 'production', + framework: { + name: 'django', + version: '2.1.13', + }, + name: 'opbeans-python', + runtime: { + name: 'CPython', + version: '3.6.10', + }, + language: { + name: 'python', + version: '3.6.10', + }, + version: 'None', + }, + transaction: { + id: '6fb0ff7365b87298', + }, + timestamp: { + us: 1584975868790080, + }, + span: { + duration: { + us: 2519, + }, + subtype: 'postgresql', + name: 'SELECT FROM opbeans_order', + destination: { + service: { + resource: 'postgresql', + name: 'postgresql', + type: 'db', + }, + }, + action: 'query', + id: 'c9407abb4d08ead1', + type: 'db', + sync: true, + db: { + statement: + 'SELECT "opbeans_order"."id", "opbeans_order"."customer_id", "opbeans_customer"."full_name", "opbeans_order"."created_at" FROM "opbeans_order" INNER JOIN "opbeans_customer" ON ("opbeans_order"."customer_id" = "opbeans_customer"."id") LIMIT 1000', + type: 'sql', + }, + }, + }, + ], + exceedsMax: false, + errorDocs: [], +} as TraceAPIResponse; + +export const manyChildrenWithSameLength = { + exceedsMax: false, + traceDocs: [ + { + container: { + id: '46721e28e45ec1926798491069d8585865b031b4eaa9800e35d06fef6be5e170', + }, + kubernetes: { + pod: { + uid: '900f3cac-eb7c-4308-9376-f644f173c3ee', + }, + }, + process: { + args: ['-C', 'config/puma.rb'], + pid: 38, + title: '/usr/local/bundle/bin/puma', + }, + agent: { + name: 'ruby', + version: '4.3.0', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/products/3', + scheme: 'http', + port: 3000, + domain: '10.15.245.224', + full: 'http://10.15.245.224:3000/api/products/3', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'projects/8560181848/machineTypes/n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-zvs6p', + id: '69a7066f-46d2-42c4-a4cc-8400f60bf2b5', + ephemeral_id: '0ab88569-c301-40e9-8e78-cac7c1dac2bc', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.536Z', + ecs: { + version: '1.11.0', + }, + service: { + node: { + name: '46721e28e45ec1926798491069d8585865b031b4eaa9800e35d06fef6be5e170', + }, + environment: 'production', + framework: { + name: 'Ruby on Rails', + version: '6.1.4.1', + }, + name: 'opbeans-ruby', + runtime: { + name: 'ruby', + version: '2.7.3', + }, + language: { + name: 'ruby', + version: '2.7.3', + }, + version: '2021-10-14 17:49:53', + }, + host: { + os: { + platform: 'linux', + }, + ip: '10.12.0.22', + architecture: 'x86_64', + }, + http: { + request: { + headers: { + Accept: ['*/*'], + Version: ['HTTP/1.1'], + 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], + Host: ['10.15.245.224:3000'], + 'Accept-Encoding': ['gzip, deflate'], + }, + method: 'GET', + env: { + GATEWAY_INTERFACE: 'CGI/1.2', + ORIGINAL_FULLPATH: '/api/products/3', + SERVER_PORT: '3000', + SERVER_PROTOCOL: 'HTTP/1.1', + REMOTE_ADDR: '10.12.6.45', + REQUEST_URI: '/api/products/3', + ORIGINAL_SCRIPT_NAME: '', + SERVER_SOFTWARE: 'puma 5.5.0 Zawgyi', + QUERY_STRING: '', + SCRIPT_NAME: '', + REQUEST_METHOD: 'GET', + SERVER_NAME: '10.15.245.224', + REQUEST_PATH: '/api/products/3', + PATH_INFO: '/api/products/3', + ROUTES_9240_SCRIPT_NAME: '', + }, + body: { + original: '[SKIPPED]', + }, + }, + response: { + headers: { + 'Content-Type': ['application/json;charset=UTF-8'], + }, + status_code: 500, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + event: { + ingested: '2021-10-19T13:57:12.417144879Z', + outcome: 'failure', + }, + transaction: { + duration: { + us: 13359, + }, + result: 'HTTP 5xx', + name: 'Rack', + span_count: { + dropped: 0, + started: 1, + }, + id: '9a7f717439921d39', + type: 'request', + sampled: true, + }, + user_agent: { + original: 'Python/3.7 aiohttp/3.3.2', + name: 'Python aiohttp', + device: { + name: 'Other', + type: 'Other', + }, + version: '3.3.2', + }, + timestamp: { + us: 1634651822536408, + }, + }, + { + container: { + id: 'e7b69f99cb7523bedea6d7c97b684cf4b7ff458d0cba1efb1ac843300b3bf3c7', + }, + kubernetes: { + pod: { + uid: 'c5169b50-f3b3-4693-8e4b-150fca17c333', + name: 'opbeans-go-5d795ddf6b-rhlvf', + }, + }, + parent: { + id: '4eeaa6dfbfd047cd', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + source: { + ip: '10.12.0.22', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + type: 'apm-server', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + host: { + os: { + platform: 'linux', + }, + ip: '10.12.0.14', + architecture: 'amd64', + }, + client: { + ip: '10.12.0.22', + }, + event: { + ingested: '2021-10-19T13:57:05.413190788Z', + outcome: 'failure', + }, + user_agent: { + original: 'http.rb/5.0.2', + name: 'Other', + device: { + name: 'Generic Feature Phone', + type: 'Other', + }, + }, + timestamp: { + us: 1634651822536408, + }, + process: { + args: [ + '/opbeans-go', + '-log-level=debug', + '-log-json', + '-listen=:3000', + '-frontend=/opbeans-frontend', + '-db=postgres:', + '-cache=redis://redis-master:6379', + ], + pid: 1, + title: 'opbeans-go', + ppid: 0, + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/products/3', + scheme: 'http', + port: 3000, + domain: 'opbeans', + full: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.536Z', + service: { + node: { + name: 'e7b69f99cb7523bedea6d7c97b684cf4b7ff458d0cba1efb1ac843300b3bf3c7', + }, + environment: 'testing', + framework: { + name: 'gin', + version: 'v1.7.3', + }, + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.17.2', + }, + language: { + name: 'go', + version: 'go1.17.2', + }, + version: '2021-10-14 17:49:50', + }, + http: { + request: { + headers: { + Connection: ['close'], + 'User-Agent': ['http.rb/5.0.2'], + 'Elastic-Apm-Traceparent': [ + '00-d5e80ae688f1fef91533f02dd2bdc769-4eeaa6dfbfd047cd-01', + ], + Tracestate: ['es=s:1.0'], + Traceparent: [ + '00-d5e80ae688f1fef91533f02dd2bdc769-4eeaa6dfbfd047cd-01', + ], + }, + method: 'GET', + }, + response: { + headers: { + Date: ['Tue, 19 Oct 2021 13:57:02 GMT'], + 'Content-Type': ['application/json;charset=UTF-8'], + }, + status_code: 500, + }, + version: '1.1', + }, + transaction: { + result: 'HTTP 5xx', + duration: { + us: 13359, + }, + name: 'GET /api/products/:id', + id: '9f50f43e924d0b46', + span_count: { + dropped: 0, + started: 3, + }, + type: 'request', + sampled: true, + }, + }, + { + container: { + id: '015d1127421e2c3d42a0fb031fc75e989813f58973143b6c7e33dca6ccc6f31b', + }, + parent: { + id: '8d099ab4fcec4ab9', + }, + kubernetes: { + pod: { + uid: '459a6abf-198e-4107-b4dd-b0ae826755ab', + name: 'opbeans-go-nsn-69b89c4598-xsvgh', + }, + }, + agent: { + name: 'go', + version: '1.14.0', + }, + source: { + ip: '10.12.0.14', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-zvs6p', + id: '69a7066f-46d2-42c4-a4cc-8400f60bf2b5', + ephemeral_id: '0ab88569-c301-40e9-8e78-cac7c1dac2bc', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + host: { + os: { + platform: 'linux', + }, + ip: '10.12.0.13', + architecture: 'amd64', + }, + client: { + ip: '10.12.0.22', + }, + event: { + ingested: '2021-10-19T13:57:08.267103644Z', + outcome: 'failure', + }, + user_agent: { + original: 'http.rb/5.0.2', + name: 'Other', + device: { + name: 'Generic Feature Phone', + type: 'Other', + }, + }, + timestamp: { + us: 1634651822536408, + }, + process: { + args: [ + '/opbeans-go', + '-log-level=debug', + '-log-json', + '-listen=:3000', + '-frontend=/opbeans-frontend', + '-db=postgres:', + '-cache=redis://redis-master:6379', + ], + pid: 1, + title: 'opbeans-go', + ppid: 0, + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/products/3', + scheme: 'http', + port: 3000, + domain: 'opbeans', + full: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.536Z', + service: { + node: { + name: '015d1127421e2c3d42a0fb031fc75e989813f58973143b6c7e33dca6ccc6f31b', + }, + environment: 'testing', + framework: { + name: 'gin', + version: 'v1.7.3', + }, + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.17.2', + }, + language: { + name: 'go', + version: 'go1.17.2', + }, + version: '2021-10-14 17:49:50', + }, + http: { + request: { + headers: { + 'User-Agent': ['http.rb/5.0.2'], + 'X-Forwarded-For': ['10.12.0.22'], + 'Accept-Encoding': ['gzip'], + 'Elastic-Apm-Traceparent': [ + '00-d5e80ae688f1fef91533f02dd2bdc769-8d099ab4fcec4ab9-01', + ], + Tracestate: ['es=s:1.0'], + Traceparent: [ + '00-d5e80ae688f1fef91533f02dd2bdc769-8d099ab4fcec4ab9-01', + ], + }, + method: 'GET', + }, + response: { + headers: { + Date: ['Tue, 19 Oct 2021 13:57:02 GMT'], + 'Content-Type': ['application/json;charset=UTF-8'], + }, + status_code: 500, + }, + version: '1.1', + }, + transaction: { + result: 'HTTP 5xx', + duration: { + us: 13359, + }, + name: 'GET /api/products/:id', + span_count: { + dropped: 0, + started: 3, + }, + id: 'b7801be83bcdc972', + type: 'request', + sampled: true, + }, + }, + { + container: { + id: '59036ecb70908dfec4e03edc477f6875d08677871b4af0db3144373802d00cb1', + }, + kubernetes: { + pod: { + uid: '878bab2a-1309-44ae-a0e2-c98a0b187da1', + name: 'opbeans-java-5f45d77dd8-h8bnb', + }, + }, + parent: { + id: '35e3637e26919055', + }, + agent: { + name: 'java', + ephemeral_id: '75e36588-9adb-4bb0-bfee-a333b1c57e67', + version: 'unknown', + }, + source: { + ip: '10.12.0.13', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + host: { + os: { + platform: 'Linux', + }, + ip: '10.12.0.15', + architecture: 'amd64', + }, + client: { + ip: '10.12.0.22', + }, + event: { + ingested: '2021-10-19T13:57:10.382829210Z', + outcome: 'failure', + }, + user_agent: { + original: 'http.rb/5.0.2', + name: 'Other', + device: { + name: 'Generic Feature Phone', + type: 'Other', + }, + }, + timestamp: { + us: 1634651822536408, + }, + process: { + pid: 7, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/products/3', + scheme: 'http', + port: 3000, + domain: 'opbeans', + full: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.536Z', + service: { + node: { + name: '59036ecb70908dfec4e03edc477f6875d08677871b4af0db3144373802d00cb1', + }, + environment: 'production', + framework: { + name: 'Spring Web MVC', + version: '5.0.6.RELEASE', + }, + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.11', + }, + language: { + name: 'Java', + version: '11.0.11', + }, + version: '2021-10-14 17:49:52', + }, + http: { + request: { + headers: { + 'User-Agent': ['http.rb/5.0.2'], + 'X-Forwarded-For': ['10.12.0.22, 10.12.0.14'], + Host: ['opbeans:3000'], + 'Accept-Encoding': ['gzip'], + 'Elastic-Apm-Traceparent': [ + '00-d5e80ae688f1fef91533f02dd2bdc769-35e3637e26919055-01', + ], + Tracestate: ['es=s:1.0'], + Traceparent: [ + '00-d5e80ae688f1fef91533f02dd2bdc769-35e3637e26919055-01', + ], + }, + method: 'GET', + }, + response: { + status_code: 500, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + transaction: { + duration: { + us: 13359, + }, + result: 'HTTP 5xx', + name: 'APIRestController#product', + id: '2c30263c4ad8fe8b', + span_count: { + dropped: 0, + started: 3, + }, + type: 'request', + sampled: true, + }, + }, + { + parent: { + id: '9a7f717439921d39', + }, + agent: { + name: 'ruby', + version: '4.3.0', + }, + destination: { + address: 'opbeans', + port: 3000, + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'projects/8560181848/machineTypes/n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + event: { + outcome: 'failure', + }, + timestamp: { + us: 1634651822536408, + }, + processor: { + name: 'transaction', + event: 'span', + }, + url: { + original: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.536Z', + service: { + environment: 'production', + name: 'opbeans-ruby', + }, + http: { + request: { + method: 'GET', + }, + response: { + status_code: 500, + }, + }, + transaction: { + id: '9a7f717439921d39', + }, + span: { + duration: { + us: 13359, + }, + stacktrace: [ + { + exclude_from_grouping: false, + library_frame: true, + filename: 'elastic_apm.rb', + abs_path: + '/usr/local/bundle/gems/elastic-apm-4.3.0/lib/elastic_apm.rb', + line: { + number: 235, + }, + function: 'tap', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'elastic_apm.rb', + abs_path: + '/usr/local/bundle/gems/elastic-apm-4.3.0/lib/elastic_apm.rb', + line: { + number: 235, + }, + function: 'start_span', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'elastic_apm.rb', + abs_path: + '/usr/local/bundle/gems/elastic-apm-4.3.0/lib/elastic_apm.rb', + line: { + number: 287, + }, + function: 'with_span', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'elastic_apm/spies/http.rb', + abs_path: + '/usr/local/bundle/gems/elastic-apm-4.3.0/lib/elastic_apm/spies/http.rb', + line: { + number: 45, + }, + function: 'perform', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/usr/local/bundle/gems/http-5.0.2/lib/http/client.rb', + filename: 'http/client.rb', + line: { + number: 31, + }, + function: 'request', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'http/chainable.rb', + abs_path: '/usr/local/bundle/gems/http-5.0.2/lib/http/chainable.rb', + line: { + number: 75, + }, + function: 'request', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'http/chainable.rb', + abs_path: '/usr/local/bundle/gems/http-5.0.2/lib/http/chainable.rb', + line: { + number: 20, + }, + function: 'get', + }, + { + exclude_from_grouping: false, + filename: 'opbeans_shuffle.rb', + abs_path: '/app/lib/opbeans_shuffle.rb', + line: { + number: 23, + context: ' resp = HTTP.get("#{lucky_winner}#{path}")\n', + }, + function: 'block in call', + context: { + pre: ['\n', ' Timeout.timeout(15) do\n'], + post: ['\n', ' [\n'], + }, + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'timeout.rb', + abs_path: '/usr/local/lib/ruby/2.7.0/timeout.rb', + line: { + number: 95, + }, + function: 'block in timeout', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'timeout.rb', + abs_path: '/usr/local/lib/ruby/2.7.0/timeout.rb', + line: { + number: 33, + }, + function: 'block in catch', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/usr/local/lib/ruby/2.7.0/timeout.rb', + filename: 'timeout.rb', + line: { + number: 33, + }, + function: 'catch', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'timeout.rb', + abs_path: '/usr/local/lib/ruby/2.7.0/timeout.rb', + line: { + number: 33, + }, + function: 'catch', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'timeout.rb', + abs_path: '/usr/local/lib/ruby/2.7.0/timeout.rb', + line: { + number: 110, + }, + function: 'timeout', + }, + { + exclude_from_grouping: false, + filename: 'opbeans_shuffle.rb', + abs_path: '/app/lib/opbeans_shuffle.rb', + line: { + number: 22, + context: ' Timeout.timeout(15) do\n', + }, + function: 'call', + context: { + pre: [' end\n', '\n'], + post: [ + ' resp = HTTP.get("#{lucky_winner}#{path}")\n', + '\n', + ], + }, + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'elastic_apm/middleware.rb', + abs_path: + '/usr/local/bundle/gems/elastic-apm-4.3.0/lib/elastic_apm/middleware.rb', + line: { + number: 36, + }, + function: 'call', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'rails/engine.rb', + abs_path: + '/usr/local/bundle/gems/railties-6.1.4.1/lib/rails/engine.rb', + line: { + number: 539, + }, + function: 'call', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'puma/configuration.rb', + abs_path: + '/usr/local/bundle/gems/puma-5.5.0/lib/puma/configuration.rb', + line: { + number: 249, + }, + function: 'call', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/usr/local/bundle/gems/puma-5.5.0/lib/puma/request.rb', + filename: 'puma/request.rb', + line: { + number: 77, + }, + function: 'block in handle_request', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'puma/thread_pool.rb', + abs_path: + '/usr/local/bundle/gems/puma-5.5.0/lib/puma/thread_pool.rb', + line: { + number: 340, + }, + function: 'with_force_shutdown', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'puma/request.rb', + abs_path: '/usr/local/bundle/gems/puma-5.5.0/lib/puma/request.rb', + line: { + number: 76, + }, + function: 'handle_request', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'puma/server.rb', + abs_path: '/usr/local/bundle/gems/puma-5.5.0/lib/puma/server.rb', + line: { + number: 447, + }, + function: 'process_client', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'puma/thread_pool.rb', + abs_path: + '/usr/local/bundle/gems/puma-5.5.0/lib/puma/thread_pool.rb', + line: { + number: 147, + }, + function: 'block in spawn_thread', + }, + ], + subtype: 'http', + destination: { + service: { + resource: 'opbeans:3000', + name: 'http', + type: 'external', + }, + }, + name: 'GET opbeans', + http: { + method: 'GET', + response: { + status_code: 500, + }, + }, + 'http.url.original': 'http://opbeans:3000/api/products/3', + id: '4eeaa6dfbfd047cd', + type: 'external', + }, + }, + { + parent: { + id: '9f50f43e924d0b46', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + destination: { + address: 'opbeans', + port: 3000, + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + event: { + outcome: 'failure', + }, + timestamp: { + us: 1634651822536408, + }, + processor: { + name: 'transaction', + event: 'span', + }, + url: { + original: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.536Z', + service: { + environment: 'testing', + name: 'opbeans-go', + }, + http: { + response: { + status_code: 500, + }, + }, + transaction: { + id: '9f50f43e924d0b46', + }, + span: { + duration: { + us: 13359, + }, + stacktrace: [ + { + exclude_from_grouping: false, + library_frame: true, + filename: 'span.go', + abs_path: '/go/pkg/mod/go.elastic.co/apm@v1.14.0/span.go', + line: { + number: 334, + }, + module: 'go.elastic.co/apm', + function: '(*Span).End', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'client.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmhttp@v1.14.0/client.go', + line: { + number: 198, + }, + module: 'go.elastic.co/apm/module/apmhttp', + function: '(*responseBody).endSpan', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'client.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmhttp@v1.14.0/client.go', + line: { + number: 187, + }, + function: '(*responseBody).Read', + module: 'go.elastic.co/apm/module/apmhttp', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'reverseproxy.go', + abs_path: '/usr/local/go/src/net/http/httputil/reverseproxy.go', + line: { + number: 461, + }, + module: 'net/http/httputil', + function: '(*ReverseProxy).copyBuffer', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'reverseproxy.go', + abs_path: '/usr/local/go/src/net/http/httputil/reverseproxy.go', + line: { + number: 449, + }, + module: 'net/http/httputil', + function: '(*ReverseProxy).copyResponse', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'reverseproxy.go', + abs_path: '/usr/local/go/src/net/http/httputil/reverseproxy.go', + line: { + number: 338, + }, + module: 'net/http/httputil', + function: '(*ReverseProxy).ServeHTTP', + }, + { + exclude_from_grouping: false, + filename: 'main.go', + abs_path: '/src/opbeans-go/main.go', + line: { + number: 196, + }, + module: 'main', + function: 'Main.func2', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + filename: 'context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + exclude_from_grouping: false, + filename: 'main.go', + abs_path: '/src/opbeans-go/main.go', + line: { + number: 174, + }, + module: 'main', + function: 'Main.func1', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + exclude_from_grouping: false, + filename: 'logger.go', + abs_path: '/src/opbeans-go/logger.go', + line: { + number: 36, + }, + module: 'main', + function: 'logrusMiddleware', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'middleware.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmgin@v1.14.0/middleware.go', + line: { + number: 98, + }, + module: 'go.elastic.co/apm/module/apmgin', + function: '(*middleware).handle', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'cache.go', + abs_path: + '/go/pkg/mod/github.com/gin-contrib/cache@v1.1.0/cache.go', + line: { + number: 128, + }, + module: 'github.com/gin-contrib/cache', + function: 'Cache.func1', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'gin.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + line: { + number: 489, + }, + function: '(*Engine).handleHTTPRequest', + module: 'github.com/gin-gonic/gin', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'gin.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + line: { + number: 445, + }, + function: '(*Engine).ServeHTTP', + module: 'github.com/gin-gonic/gin', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'server.go', + abs_path: '/usr/local/go/src/net/http/server.go', + line: { + number: 2878, + }, + module: 'net/http', + function: 'serverHandler.ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'server.go', + abs_path: '/usr/local/go/src/net/http/server.go', + line: { + number: 1929, + }, + module: 'net/http', + function: '(*conn).serve', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'asm_amd64.s', + abs_path: '/usr/local/go/src/runtime/asm_amd64.s', + line: { + number: 1581, + }, + module: 'runtime', + function: 'goexit', + }, + ], + subtype: 'http', + name: 'GET opbeans:3000', + destination: { + service: { + resource: 'opbeans:3000', + name: 'http://opbeans:3000', + type: 'external', + }, + }, + http: { + response: { + status_code: 500, + }, + }, + 'http.url.original': 'http://opbeans:3000/api/products/3', + id: '8d099ab4fcec4ab9', + type: 'external', + }, + }, + { + parent: { + id: '86c43ac014573747', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + processor: { + name: 'transaction', + event: 'span', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + type: 'apm-server', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.539Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'testing', + name: 'opbeans-go', + }, + event: { + outcome: 'unknown', + }, + transaction: { + id: '9f50f43e924d0b46', + }, + span: { + duration: { + us: 13359, + }, + stacktrace: [ + { + exclude_from_grouping: false, + library_frame: true, + filename: 'span.go', + abs_path: '/go/pkg/mod/go.elastic.co/apm@v1.14.0/span.go', + line: { + number: 334, + }, + module: 'go.elastic.co/apm', + function: '(*Span).End', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'clienttrace.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmhttp@v1.14.0/clienttrace.go', + line: { + number: 130, + }, + module: 'go.elastic.co/apm/module/apmhttp', + function: 'withClientTrace.func8', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'transport.go', + abs_path: '/usr/local/go/src/net/http/transport.go', + line: { + number: 2272, + }, + function: '(*persistConn).readResponse', + module: 'net/http', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'transport.go', + abs_path: '/usr/local/go/src/net/http/transport.go', + line: { + number: 2102, + }, + function: '(*persistConn).readLoop', + module: 'net/http', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'asm_amd64.s', + abs_path: '/usr/local/go/src/runtime/asm_amd64.s', + line: { + number: 1581, + }, + module: 'runtime', + function: 'goexit', + }, + ], + subtype: 'http', + name: 'Request', + action: 'request', + id: '997cdcc26a60d0ad', + type: 'external', + }, + timestamp: { + us: 1634651822536408, + }, + }, + { + parent: { + id: 'b7801be83bcdc972', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + destination: { + address: 'opbeans', + port: 3000, + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-zvs6p', + id: '69a7066f-46d2-42c4-a4cc-8400f60bf2b5', + ephemeral_id: '0ab88569-c301-40e9-8e78-cac7c1dac2bc', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + event: { + outcome: 'failure', + }, + timestamp: { + us: 1634651822536408, + }, + processor: { + name: 'transaction', + event: 'span', + }, + url: { + original: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.539Z', + service: { + environment: 'testing', + name: 'opbeans-go', + }, + http: { + response: { + status_code: 500, + }, + }, + transaction: { + id: 'b7801be83bcdc972', + }, + span: { + duration: { + us: 13359, + }, + stacktrace: [ + { + library_frame: true, + exclude_from_grouping: false, + filename: 'span.go', + abs_path: '/go/pkg/mod/go.elastic.co/apm@v1.14.0/span.go', + line: { + number: 334, + }, + module: 'go.elastic.co/apm', + function: '(*Span).End', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'client.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmhttp@v1.14.0/client.go', + line: { + number: 198, + }, + module: 'go.elastic.co/apm/module/apmhttp', + function: '(*responseBody).endSpan', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'client.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmhttp@v1.14.0/client.go', + line: { + number: 187, + }, + module: 'go.elastic.co/apm/module/apmhttp', + function: '(*responseBody).Read', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'reverseproxy.go', + abs_path: '/usr/local/go/src/net/http/httputil/reverseproxy.go', + line: { + number: 461, + }, + module: 'net/http/httputil', + function: '(*ReverseProxy).copyBuffer', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'reverseproxy.go', + abs_path: '/usr/local/go/src/net/http/httputil/reverseproxy.go', + line: { + number: 449, + }, + module: 'net/http/httputil', + function: '(*ReverseProxy).copyResponse', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'reverseproxy.go', + abs_path: '/usr/local/go/src/net/http/httputil/reverseproxy.go', + line: { + number: 338, + }, + module: 'net/http/httputil', + function: '(*ReverseProxy).ServeHTTP', + }, + { + exclude_from_grouping: false, + filename: 'main.go', + abs_path: '/src/opbeans-go/main.go', + line: { + number: 196, + }, + module: 'main', + function: 'Main.func2', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + exclude_from_grouping: false, + filename: 'main.go', + abs_path: '/src/opbeans-go/main.go', + line: { + number: 174, + }, + module: 'main', + function: 'Main.func1', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + exclude_from_grouping: false, + filename: 'logger.go', + abs_path: '/src/opbeans-go/logger.go', + line: { + number: 36, + }, + module: 'main', + function: 'logrusMiddleware', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'middleware.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmgin@v1.14.0/middleware.go', + line: { + number: 98, + }, + function: '(*middleware).handle', + module: 'go.elastic.co/apm/module/apmgin', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: + '/go/pkg/mod/github.com/gin-contrib/cache@v1.1.0/cache.go', + filename: 'cache.go', + line: { + number: 128, + }, + module: 'github.com/gin-contrib/cache', + function: 'Cache.func1', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + function: '(*Context).Next', + module: 'github.com/gin-gonic/gin', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'gin.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + line: { + number: 489, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Engine).handleHTTPRequest', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'gin.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + line: { + number: 445, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Engine).ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/usr/local/go/src/net/http/server.go', + filename: 'server.go', + line: { + number: 2878, + }, + module: 'net/http', + function: 'serverHandler.ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/usr/local/go/src/net/http/server.go', + filename: 'server.go', + line: { + number: 1929, + }, + module: 'net/http', + function: '(*conn).serve', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'asm_amd64.s', + abs_path: '/usr/local/go/src/runtime/asm_amd64.s', + line: { + number: 1581, + }, + module: 'runtime', + function: 'goexit', + }, + ], + subtype: 'http', + name: 'GET opbeans:3000', + destination: { + service: { + resource: 'opbeans:3000', + name: 'http://opbeans:3000', + type: 'external', + }, + }, + http: { + response: { + status_code: 500, + }, + }, + 'http.url.original': 'http://opbeans:3000/api/products/3', + id: '35e3637e26919055', + type: 'external', + }, + }, + { + parent: { + id: '84749ec73b1268b3', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + processor: { + name: 'transaction', + event: 'span', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-zvs6p', + id: '69a7066f-46d2-42c4-a4cc-8400f60bf2b5', + type: 'apm-server', + ephemeral_id: '0ab88569-c301-40e9-8e78-cac7c1dac2bc', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.539Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'testing', + name: 'opbeans-go', + }, + event: { + outcome: 'unknown', + }, + transaction: { + id: 'b7801be83bcdc972', + }, + span: { + duration: { + us: 13359, + }, + stacktrace: [ + { + library_frame: true, + exclude_from_grouping: false, + filename: 'span.go', + abs_path: '/go/pkg/mod/go.elastic.co/apm@v1.14.0/span.go', + line: { + number: 334, + }, + module: 'go.elastic.co/apm', + function: '(*Span).End', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'clienttrace.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmhttp@v1.14.0/clienttrace.go', + line: { + number: 130, + }, + module: 'go.elastic.co/apm/module/apmhttp', + function: 'withClientTrace.func8', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'transport.go', + abs_path: '/usr/local/go/src/net/http/transport.go', + line: { + number: 2272, + }, + module: 'net/http', + function: '(*persistConn).readResponse', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'transport.go', + abs_path: '/usr/local/go/src/net/http/transport.go', + line: { + number: 2102, + }, + module: 'net/http', + function: '(*persistConn).readLoop', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'asm_amd64.s', + abs_path: '/usr/local/go/src/runtime/asm_amd64.s', + line: { + number: 1581, + }, + module: 'runtime', + function: 'goexit', + }, + ], + subtype: 'http', + name: 'Request', + action: 'request', + id: 'a9b4d44c3d699cbb', + type: 'external', + }, + timestamp: { + us: 1634651822536408, + }, + }, + { + parent: { + id: '2c30263c4ad8fe8b', + }, + agent: { + name: 'java', + ephemeral_id: '75e36588-9adb-4bb0-bfee-a333b1c57e67', + version: 'unknown', + }, + processor: { + name: 'transaction', + event: 'span', + }, + labels: { + productId: '3', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.540Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'production', + name: 'opbeans-java', + }, + event: { + outcome: 'success', + }, + transaction: { + id: '2c30263c4ad8fe8b', + }, + span: { + duration: { + us: 13359, + }, + name: 'OpenTracing product span', + id: 'd22c1e48b2489017', + type: 'custom', + }, + timestamp: { + us: 1634651822536408, + }, + }, + { + parent: { + id: 'd22c1e48b2489017', + }, + agent: { + name: 'java', + ephemeral_id: '75e36588-9adb-4bb0-bfee-a333b1c57e67', + version: 'unknown', + }, + destination: { + address: 'db-postgresql', + port: 5432, + }, + processor: { + name: 'transaction', + event: 'span', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + type: 'apm-server', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.542Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'production', + name: 'opbeans-java', + }, + event: { + outcome: 'success', + }, + transaction: { + id: '2c30263c4ad8fe8b', + }, + timestamp: { + us: 1634651822536408, + }, + span: { + duration: { + us: 13359, + }, + subtype: 'postgresql', + destination: { + service: { + resource: 'postgresql', + }, + }, + name: 'SELECT FROM products', + action: 'query', + id: '3851260ca4365f9e', + type: 'db', + db: { + instance: 'opbeans-java', + statement: + 'select product0_.id as col_0_0_, product0_.sku as col_1_0_, product0_.name as col_2_0_, product0_.description as col_3_0_, product0_.cost as col_4_0_, product0_.selling_price as col_5_0_, product0_.stock as col_6_0_, producttyp1_.id as col_7_0_, producttyp1_.name as col_8_0_, (select sum(orderline2_.amount) from order_lines orderline2_ where orderline2_.product_id=product0_.id) as col_9_0_ from products product0_ left outer join product_types producttyp1_ on product0_.type_id=producttyp1_.id where product0_.id=?', + type: 'sql', + user: { + name: 'elastic', + }, + }, + }, + }, + { + parent: { + id: '3851260ca4365f9e', + }, + agent: { + name: 'java', + ephemeral_id: '75e36588-9adb-4bb0-bfee-a333b1c57e67', + version: 'unknown', + }, + destination: { + address: 'db-postgresql', + port: 5432, + }, + processor: { + name: 'transaction', + event: 'span', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + type: 'apm-server', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.541Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'production', + name: 'opbeans-java', + }, + event: { + outcome: 'success', + }, + transaction: { + id: '2c30263c4ad8fe8b', + }, + span: { + duration: { + us: 13359, + }, + subtype: 'postgresql', + destination: { + service: { + resource: 'postgresql', + }, + }, + name: 'empty query', + action: 'query', + id: '86c43ac014573747', + type: 'db', + db: { + rows_affected: 0, + instance: 'opbeans-java', + statement: '(empty query)', + type: 'sql', + user: { + name: 'elastic', + }, + }, + }, + timestamp: { + us: 1634651822536408, + }, + }, + { + parent: { + id: '997cdcc26a60d0ad', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + processor: { + name: 'transaction', + event: 'span', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + type: 'apm-server', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.548Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'testing', + name: 'opbeans-go', + }, + event: { + outcome: 'unknown', + }, + transaction: { + id: '9f50f43e924d0b46', + }, + timestamp: { + us: 1634651822536408, + }, + span: { + duration: { + us: 13359, + }, + subtype: 'http', + name: 'Response', + action: 'response', + id: '84749ec73b1268b3', + type: 'external', + }, + }, + { + parent: { + id: 'a9b4d44c3d699cbb', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + processor: { + name: 'transaction', + event: 'span', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-zvs6p', + id: '69a7066f-46d2-42c4-a4cc-8400f60bf2b5', + type: 'apm-server', + ephemeral_id: '0ab88569-c301-40e9-8e78-cac7c1dac2bc', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.547Z', + ecs: { + version: '1.11.0', + }, + service: { + environment: 'testing', + name: 'opbeans-go', + }, + event: { + outcome: 'unknown', + }, + transaction: { + id: 'b7801be83bcdc972', + }, + span: { + duration: { + us: 13359, + }, + subtype: 'http', + name: 'Response', + action: 'response', + id: '04991f3b9d3696c5', + type: 'external', + }, + timestamp: { + us: 1634651822536408, + }, + }, + ], + errorDocs: [ + { + container: { + id: '59036ecb70908dfec4e03edc477f6875d08677871b4af0db3144373802d00cb1', + }, + kubernetes: { + pod: { + uid: '878bab2a-1309-44ae-a0e2-c98a0b187da1', + name: 'opbeans-java-5f45d77dd8-h8bnb', + }, + }, + parent: { + id: '2c30263c4ad8fe8b', + }, + agent: { + name: 'java', + ephemeral_id: '75e36588-9adb-4bb0-bfee-a333b1c57e67', + version: 'unknown', + }, + source: { + ip: '10.12.0.13', + }, + error: { + exception: [ + { + stacktrace: [ + { + exclude_from_grouping: false, + library_frame: true, + filename: 'AbstractMessageConverterMethodProcessor.java', + classname: + 'org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor', + line: { + number: 226, + }, + module: 'org.springframework.web.servlet.mvc.method.annotation', + function: 'writeWithMessageConverters', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'RequestResponseBodyMethodProcessor.java', + classname: + 'org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor', + line: { + number: 180, + }, + module: 'org.springframework.web.servlet.mvc.method.annotation', + function: 'handleReturnValue', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'HandlerMethodReturnValueHandlerComposite.java', + classname: + 'org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite', + line: { + number: 82, + }, + module: 'org.springframework.web.method.support', + function: 'handleReturnValue', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ServletInvocableHandlerMethod.java', + classname: + 'org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod', + line: { + number: 119, + }, + module: 'org.springframework.web.servlet.mvc.method.annotation', + function: 'invokeAndHandle', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'RequestMappingHandlerAdapter.java', + classname: + 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter', + line: { + number: 877, + }, + function: 'invokeHandlerMethod', + module: 'org.springframework.web.servlet.mvc.method.annotation', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'RequestMappingHandlerAdapter.java', + classname: + 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter', + line: { + number: 783, + }, + module: 'org.springframework.web.servlet.mvc.method.annotation', + function: 'handleInternal', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'AbstractHandlerMethodAdapter.java', + classname: + 'org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter', + line: { + number: 87, + }, + module: 'org.springframework.web.servlet.mvc.method', + function: 'handle', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'DispatcherServlet.java', + classname: 'org.springframework.web.servlet.DispatcherServlet', + line: { + number: 991, + }, + function: 'doDispatch', + module: 'org.springframework.web.servlet', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'DispatcherServlet.java', + classname: 'org.springframework.web.servlet.DispatcherServlet', + line: { + number: 925, + }, + module: 'org.springframework.web.servlet', + function: 'doService', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'FrameworkServlet.java', + classname: 'org.springframework.web.servlet.FrameworkServlet', + line: { + number: 974, + }, + module: 'org.springframework.web.servlet', + function: 'processRequest', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'FrameworkServlet.java', + classname: 'org.springframework.web.servlet.FrameworkServlet', + line: { + number: 866, + }, + module: 'org.springframework.web.servlet', + function: 'doGet', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'HttpServlet.java', + classname: 'javax.servlet.http.HttpServlet', + line: { + number: 635, + }, + module: 'javax.servlet.http', + function: 'service', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'FrameworkServlet.java', + classname: 'org.springframework.web.servlet.FrameworkServlet', + line: { + number: 851, + }, + function: 'service', + module: 'org.springframework.web.servlet', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'HttpServlet.java', + classname: 'javax.servlet.http.HttpServlet', + line: { + number: 742, + }, + module: 'javax.servlet.http', + function: 'service', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 231, + }, + module: 'org.apache.catalina.core', + function: 'internalDoFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 166, + }, + module: 'org.apache.catalina.core', + function: 'doFilter', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'WsFilter.java', + classname: 'org.apache.tomcat.websocket.server.WsFilter', + line: { + number: 52, + }, + module: 'org.apache.tomcat.websocket.server', + function: 'doFilter', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 193, + }, + module: 'org.apache.catalina.core', + function: 'internalDoFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 166, + }, + module: 'org.apache.catalina.core', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'RequestContextFilter.java', + classname: + 'org.springframework.web.filter.RequestContextFilter', + line: { + number: 99, + }, + function: 'doFilterInternal', + module: 'org.springframework.web.filter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'OncePerRequestFilter.java', + classname: + 'org.springframework.web.filter.OncePerRequestFilter', + line: { + number: 107, + }, + module: 'org.springframework.web.filter', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 193, + }, + module: 'org.apache.catalina.core', + function: 'internalDoFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 166, + }, + module: 'org.apache.catalina.core', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'HttpPutFormContentFilter.java', + classname: + 'org.springframework.web.filter.HttpPutFormContentFilter', + line: { + number: 109, + }, + function: 'doFilterInternal', + module: 'org.springframework.web.filter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'OncePerRequestFilter.java', + classname: + 'org.springframework.web.filter.OncePerRequestFilter', + line: { + number: 107, + }, + module: 'org.springframework.web.filter', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 193, + }, + module: 'org.apache.catalina.core', + function: 'internalDoFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 166, + }, + module: 'org.apache.catalina.core', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'HiddenHttpMethodFilter.java', + classname: + 'org.springframework.web.filter.HiddenHttpMethodFilter', + line: { + number: 81, + }, + function: 'doFilterInternal', + module: 'org.springframework.web.filter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'OncePerRequestFilter.java', + classname: + 'org.springframework.web.filter.OncePerRequestFilter', + line: { + number: 107, + }, + module: 'org.springframework.web.filter', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 193, + }, + module: 'org.apache.catalina.core', + function: 'internalDoFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 166, + }, + module: 'org.apache.catalina.core', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'CharacterEncodingFilter.java', + classname: + 'org.springframework.web.filter.CharacterEncodingFilter', + line: { + number: 200, + }, + module: 'org.springframework.web.filter', + function: 'doFilterInternal', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'OncePerRequestFilter.java', + classname: + 'org.springframework.web.filter.OncePerRequestFilter', + line: { + number: 107, + }, + module: 'org.springframework.web.filter', + function: 'doFilter', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 193, + }, + module: 'org.apache.catalina.core', + function: 'internalDoFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ApplicationFilterChain.java', + classname: 'org.apache.catalina.core.ApplicationFilterChain', + line: { + number: 166, + }, + module: 'org.apache.catalina.core', + function: 'doFilter', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'StandardWrapperValve.java', + classname: 'org.apache.catalina.core.StandardWrapperValve', + line: { + number: 198, + }, + module: 'org.apache.catalina.core', + function: 'invoke', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'StandardContextValve.java', + classname: 'org.apache.catalina.core.StandardContextValve', + line: { + number: 96, + }, + module: 'org.apache.catalina.core', + function: 'invoke', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'AuthenticatorBase.java', + classname: + 'org.apache.catalina.authenticator.AuthenticatorBase', + line: { + number: 496, + }, + module: 'org.apache.catalina.authenticator', + function: 'invoke', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'StandardHostValve.java', + classname: 'org.apache.catalina.core.StandardHostValve', + line: { + number: 140, + }, + module: 'org.apache.catalina.core', + function: 'invoke', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'ErrorReportValve.java', + classname: 'org.apache.catalina.valves.ErrorReportValve', + line: { + number: 81, + }, + module: 'org.apache.catalina.valves', + function: 'invoke', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'StandardEngineValve.java', + classname: 'org.apache.catalina.core.StandardEngineValve', + line: { + number: 87, + }, + module: 'org.apache.catalina.core', + function: 'invoke', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'CoyoteAdapter.java', + classname: 'org.apache.catalina.connector.CoyoteAdapter', + line: { + number: 342, + }, + module: 'org.apache.catalina.connector', + function: 'service', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'Http11Processor.java', + classname: 'org.apache.coyote.http11.Http11Processor', + line: { + number: 803, + }, + module: 'org.apache.coyote.http11', + function: 'service', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'AbstractProcessorLight.java', + classname: 'org.apache.coyote.AbstractProcessorLight', + line: { + number: 66, + }, + module: 'org.apache.coyote', + function: 'process', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'AbstractProtocol.java', + classname: + 'org.apache.coyote.AbstractProtocol$ConnectionHandler', + line: { + number: 790, + }, + module: 'org.apache.coyote', + function: 'process', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'NioEndpoint.java', + classname: + 'org.apache.tomcat.util.net.NioEndpoint$SocketProcessor', + line: { + number: 1468, + }, + module: 'org.apache.tomcat.util.net', + function: 'doRun', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'SocketProcessorBase.java', + classname: 'org.apache.tomcat.util.net.SocketProcessorBase', + line: { + number: 49, + }, + module: 'org.apache.tomcat.util.net', + function: 'run', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'TaskThread.java', + classname: + 'org.apache.tomcat.util.threads.TaskThread$WrappingRunnable', + line: { + number: 61, + }, + module: 'org.apache.tomcat.util.threads', + function: 'run', + }, + ], + message: + 'No converter found for return value of type: class com.sun.proxy.$Proxy158', + type: 'org.springframework.http.converter.HttpMessageNotWritableException', + }, + ], + id: '128f8ecf47bc8a800269ee6e5ac90008', + grouping_key: 'cc9272d7511c88a533ac41cc3e2ce54b', + grouping_name: + 'No converter found for return value of type: class com.sun.proxy.$Proxy158', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + ecs: { + version: '1.11.0', + }, + host: { + os: { + platform: 'Linux', + }, + ip: '10.12.0.15', + architecture: 'amd64', + }, + client: { + ip: '10.12.0.22', + }, + event: { + ingested: '2021-10-19T13:57:10.382394342Z', + }, + user_agent: { + original: 'http.rb/5.0.2', + name: 'Other', + device: { + name: 'Generic Feature Phone', + type: 'Other', + }, + }, + timestamp: { + us: 1634651822536408, + }, + process: { + pid: 7, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + message: + 'No converter found for return value of type: class com.sun.proxy.$Proxy158', + processor: { + name: 'error', + event: 'error', + }, + url: { + path: '/api/products/3', + scheme: 'http', + port: 3000, + domain: 'opbeans', + full: 'http://opbeans:3000/api/products/3', + }, + '@timestamp': '2021-10-19T13:57:02.546Z', + service: { + node: { + name: '59036ecb70908dfec4e03edc477f6875d08677871b4af0db3144373802d00cb1', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.11', + }, + language: { + name: 'Java', + version: '11.0.11', + }, + version: '2021-10-14 17:49:52', + }, + http: { + request: { + headers: { + 'User-Agent': ['http.rb/5.0.2'], + 'X-Forwarded-For': ['10.12.0.22, 10.12.0.14'], + Host: ['opbeans:3000'], + 'Accept-Encoding': ['gzip'], + 'Elastic-Apm-Traceparent': [ + '00-d5e80ae688f1fef91533f02dd2bdc769-35e3637e26919055-01', + ], + Tracestate: ['es=s:1.0'], + Traceparent: [ + '00-d5e80ae688f1fef91533f02dd2bdc769-35e3637e26919055-01', + ], + }, + method: 'GET', + }, + response: { + status_code: 500, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + transaction: { + id: '2c30263c4ad8fe8b', + type: 'request', + sampled: true, + }, + }, + { + container: { + id: 'e7b69f99cb7523bedea6d7c97b684cf4b7ff458d0cba1efb1ac843300b3bf3c7', + }, + kubernetes: { + pod: { + uid: 'c5169b50-f3b3-4693-8e4b-150fca17c333', + name: 'opbeans-go-5d795ddf6b-rhlvf', + }, + }, + parent: { + id: '9f50f43e924d0b46', + }, + agent: { + name: 'go', + version: '1.14.0', + }, + process: { + args: [ + '/opbeans-go', + '-log-level=debug', + '-log-json', + '-listen=:3000', + '-frontend=/opbeans-frontend', + '-db=postgres:', + '-cache=redis://redis-master:6379', + ], + pid: 1, + title: 'opbeans-go', + ppid: 0, + }, + error: { + culprit: 'logrusMiddleware', + log: { + stacktrace: [ + { + library_frame: true, + exclude_from_grouping: false, + filename: 'hook.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmlogrus@v1.14.0/hook.go', + line: { + number: 102, + }, + module: 'go.elastic.co/apm/module/apmlogrus', + function: '(*Hook).Fire', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'hooks.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/hooks.go', + line: { + number: 28, + }, + module: 'github.com/sirupsen/logrus', + function: 'LevelHooks.Fire', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + filename: 'entry.go', + line: { + number: 272, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).fireHooks', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 241, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).log', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 293, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).Log', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 338, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).Logf', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 367, + }, + function: '(*Entry).Errorf', + module: 'github.com/sirupsen/logrus', + }, + { + exclude_from_grouping: false, + filename: 'logger.go', + abs_path: '/src/opbeans-go/logger.go', + line: { + number: 56, + }, + module: 'main', + function: 'logrusMiddleware', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: + '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + filename: 'context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmgin@v1.14.0/middleware.go', + filename: 'middleware.go', + line: { + number: 98, + }, + module: 'go.elastic.co/apm/module/apmgin', + function: '(*middleware).handle', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: + '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + function: '(*Context).Next', + module: 'github.com/gin-gonic/gin', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'cache.go', + abs_path: + '/go/pkg/mod/github.com/gin-contrib/cache@v1.1.0/cache.go', + line: { + number: 128, + }, + module: 'github.com/gin-contrib/cache', + function: 'Cache.func1', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: + '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'gin.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + line: { + number: 489, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Engine).handleHTTPRequest', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + filename: 'gin.go', + line: { + number: 445, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Engine).ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'server.go', + abs_path: '/usr/local/go/src/net/http/server.go', + line: { + number: 2878, + }, + module: 'net/http', + function: 'serverHandler.ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'server.go', + abs_path: '/usr/local/go/src/net/http/server.go', + line: { + number: 1929, + }, + module: 'net/http', + function: '(*conn).serve', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'asm_amd64.s', + abs_path: '/usr/local/go/src/runtime/asm_amd64.s', + line: { + number: 1581, + }, + module: 'runtime', + function: 'goexit', + }, + ], + level: 'error', + message: 'GET /api/products/3 (500)', + }, + id: '1660f82c1340f415e9a31b47565300ee', + grouping_key: '7a640436a9be648fd708703d1ac84650', + grouping_name: 'GET /api/products/3 (500)', + }, + message: 'GET /api/products/3 (500)', + processor: { + name: 'error', + event: 'error', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-lmf6c', + id: '7eedab18-1171-4a1b-a590-975e13fd103a', + ephemeral_id: '90034868-48e6-418c-8ab4-6616b403bca7', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.539Z', + ecs: { + version: '1.11.0', + }, + service: { + node: { + name: 'e7b69f99cb7523bedea6d7c97b684cf4b7ff458d0cba1efb1ac843300b3bf3c7', + }, + environment: 'testing', + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.17.2', + }, + language: { + name: 'go', + version: 'go1.17.2', + }, + version: '2021-10-14 17:49:50', + }, + host: { + os: { + platform: 'linux', + }, + ip: '10.12.0.14', + architecture: 'amd64', + }, + event: { + ingested: '2021-10-19T13:57:05.412811279Z', + }, + transaction: { + id: '9f50f43e924d0b46', + }, + timestamp: { + us: 1634651822536408, + }, + }, + { + container: { + id: '015d1127421e2c3d42a0fb031fc75e989813f58973143b6c7e33dca6ccc6f31b', + }, + kubernetes: { + pod: { + uid: '459a6abf-198e-4107-b4dd-b0ae826755ab', + name: 'opbeans-go-nsn-69b89c4598-xsvgh', + }, + }, + parent: { + id: 'b7801be83bcdc972', + }, + process: { + args: [ + '/opbeans-go', + '-log-level=debug', + '-log-json', + '-listen=:3000', + '-frontend=/opbeans-frontend', + '-db=postgres:', + '-cache=redis://redis-master:6379', + ], + pid: 1, + title: 'opbeans-go', + ppid: 0, + }, + agent: { + name: 'go', + version: '1.14.0', + }, + message: 'GET /api/products/3 (500)', + error: { + culprit: 'logrusMiddleware', + log: { + stacktrace: [ + { + library_frame: true, + exclude_from_grouping: false, + filename: 'hook.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmlogrus@v1.14.0/hook.go', + line: { + number: 102, + }, + module: 'go.elastic.co/apm/module/apmlogrus', + function: '(*Hook).Fire', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'hooks.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/hooks.go', + line: { + number: 28, + }, + function: 'LevelHooks.Fire', + module: 'github.com/sirupsen/logrus', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 272, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).fireHooks', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 241, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).log', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 293, + }, + function: '(*Entry).Log', + module: 'github.com/sirupsen/logrus', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 338, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).Logf', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'entry.go', + abs_path: + '/go/pkg/mod/github.com/sirupsen/logrus@v1.8.1/entry.go', + line: { + number: 367, + }, + module: 'github.com/sirupsen/logrus', + function: '(*Entry).Errorf', + }, + { + exclude_from_grouping: false, + filename: 'logger.go', + abs_path: '/src/opbeans-go/logger.go', + line: { + number: 56, + }, + module: 'main', + function: 'logrusMiddleware', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: + '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'middleware.go', + abs_path: + '/go/pkg/mod/go.elastic.co/apm/module/apmgin@v1.14.0/middleware.go', + line: { + number: 98, + }, + module: 'go.elastic.co/apm/module/apmgin', + function: '(*middleware).handle', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: + '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'cache.go', + abs_path: + '/go/pkg/mod/github.com/gin-contrib/cache@v1.1.0/cache.go', + line: { + number: 128, + }, + module: 'github.com/gin-contrib/cache', + function: 'Cache.func1', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'context.go', + abs_path: + '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/context.go', + line: { + number: 165, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Context).Next', + }, + { + library_frame: true, + exclude_from_grouping: false, + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + filename: 'gin.go', + line: { + number: 489, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Engine).handleHTTPRequest', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'gin.go', + abs_path: '/go/pkg/mod/github.com/gin-gonic/gin@v1.7.4/gin.go', + line: { + number: 445, + }, + module: 'github.com/gin-gonic/gin', + function: '(*Engine).ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'server.go', + abs_path: '/usr/local/go/src/net/http/server.go', + line: { + number: 2878, + }, + module: 'net/http', + function: 'serverHandler.ServeHTTP', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'server.go', + abs_path: '/usr/local/go/src/net/http/server.go', + line: { + number: 1929, + }, + module: 'net/http', + function: '(*conn).serve', + }, + { + library_frame: true, + exclude_from_grouping: false, + filename: 'asm_amd64.s', + abs_path: '/usr/local/go/src/runtime/asm_amd64.s', + line: { + number: 1581, + }, + function: 'goexit', + module: 'runtime', + }, + ], + level: 'error', + message: 'GET /api/products/3 (500)', + }, + id: '7a265a869ad88851591e0e9734aa4a70', + grouping_key: '7a640436a9be648fd708703d1ac84650', + grouping_name: 'GET /api/products/3 (500)', + }, + processor: { + name: 'error', + event: 'error', + }, + cloud: { + availability_zone: 'us-central1-c', + instance: { + name: 'gke-dev-oblt-dev-oblt-pool-18e89389-qntq', + id: '5278603844673466232', + }, + provider: 'gcp', + machine: { + type: 'n1-standard-4', + }, + project: { + name: 'elastic-observability', + id: '8560181848', + }, + region: 'us-central1', + }, + observer: { + hostname: 'apm-apm-server-65d9d8dd68-zvs6p', + id: '69a7066f-46d2-42c4-a4cc-8400f60bf2b5', + ephemeral_id: '0ab88569-c301-40e9-8e78-cac7c1dac2bc', + type: 'apm-server', + version: '7.16.0', + version_major: 7, + }, + trace: { + id: 'd5e80ae688f1fef91533f02dd2bdc769', + }, + '@timestamp': '2021-10-19T13:57:02.539Z', + ecs: { + version: '1.11.0', + }, + service: { + node: { + name: '015d1127421e2c3d42a0fb031fc75e989813f58973143b6c7e33dca6ccc6f31b', + }, + environment: 'testing', + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.17.2', + }, + language: { + name: 'go', + version: 'go1.17.2', + }, + version: '2021-10-14 17:49:50', + }, + host: { + os: { + platform: 'linux', + }, + ip: '10.12.0.13', + architecture: 'amd64', + }, + event: { + ingested: '2021-10-19T13:57:08.266888578Z', + }, + transaction: { + id: 'b7801be83bcdc972', + }, + timestamp: { + us: 1634651822536408, + }, + }, + ], +} as TraceAPIResponse; + +export const traceWithErrors = { + traceDocs: [ + { + container: { + id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + process: { + pid: 6, + title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', + version: '1.14.1-SNAPSHOT', + }, + internal: { + sampler: { + value: 46, + }, + }, + source: { + ip: '172.19.0.13', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: '172.19.0.9', + full: 'http://172.19.0.9:3000/api/orders', + }, + observer: { + hostname: 'f37f48d8b60b', + id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', + ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.785Z', + ecs: { + version: '1.4.0', + }, + service: { + node: { + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '10.0.2', + }, + language: { + name: 'Java', + version: '10.0.2', + }, + version: 'None', + }, + host: { + hostname: '4cf84d094553', + os: { + platform: 'Linux', + }, + ip: '172.19.0.9', + name: '4cf84d094553', + architecture: 'amd64', + }, + http: { + request: { + headers: { + Accept: ['*/*'], + 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], + Host: ['172.19.0.9:3000'], + 'Accept-Encoding': ['gzip, deflate'], + }, + method: 'get', + socket: { + encrypted: false, + remote_address: '172.19.0.13', + }, + body: { + original: '[REDACTED]', + }, + }, + response: { + headers: { + 'Transfer-Encoding': ['chunked'], + Date: ['Mon, 23 Mar 2020 15:04:28 GMT'], + 'Content-Type': ['application/json;charset=ISO-8859-1'], + }, + status_code: 200, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + client: { + ip: '172.19.0.13', + }, + transaction: { + duration: { + us: 18842, + }, + result: 'HTTP 2xx', + name: 'DispatcherServlet#doGet', + id: '49809ad3c26adf74', + span_count: { + dropped: 0, + started: 1, + }, + type: 'request', + sampled: true, + }, + user_agent: { + original: 'Python/3.7 aiohttp/3.3.2', + name: 'Other', + device: { + name: 'Other', + }, + }, + timestamp: { + us: 1584975868785000, + }, + }, + { + parent: { + id: 'fc107f7b556eb49b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: 'opbeans-go', + full: 'http://opbeans-go:3000/api/orders', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + framework: { + name: 'gin', + version: 'v1.4.0', + }, + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + duration: { + us: 16597, + }, + result: 'HTTP 2xx', + name: 'GET /api/orders', + id: '975c8d5bfd1dd20b', + span_count: { + dropped: 0, + started: 1, + }, + type: 'request', + sampled: true, + }, + timestamp: { + us: 1584975868787052, + }, + }, + { + parent: { + id: 'daae24d83c269918', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + timestamp: { + us: 1584975868788603, + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: 'opbeans-go', + full: 'http://opbeans-go:3000/api/orders', + }, + '@timestamp': '2020-03-23T15:04:28.788Z', + service: { + node: { + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + environment: 'production', + framework: { + name: 'django', + version: '2.1.13', + }, + name: 'opbeans-python', + runtime: { + name: 'CPython', + version: '3.6.10', + }, + language: { + name: 'python', + version: '3.6.10', + }, + version: 'None', + }, + transaction: { + result: 'HTTP 2xx', + duration: { + us: 14648, + }, + name: 'GET opbeans.views.orders', + span_count: { + dropped: 0, + started: 1, + }, + id: '6fb0ff7365b87298', + type: 'request', + sampled: true, + }, + }, + { + container: { + id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + parent: { + id: '49809ad3c26adf74', + }, + process: { + pid: 6, + title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', + version: '1.14.1-SNAPSHOT', + }, + internal: { + sampler: { + value: 44, + }, + }, + destination: { + address: 'opbeans-go', + port: 3000, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: 'f37f48d8b60b', + id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', + type: 'apm-server', + ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.785Z', + ecs: { + version: '1.4.0', + }, + service: { + node: { + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '10.0.2', + }, + language: { + name: 'Java', + version: '10.0.2', + }, + version: 'None', + }, + host: { + hostname: '4cf84d094553', + os: { + platform: 'Linux', + }, + ip: '172.19.0.9', + name: '4cf84d094553', + architecture: 'amd64', + }, + connection: { + hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", + }, + transaction: { + id: '49809ad3c26adf74', + }, + timestamp: { + us: 1584975868785273, + }, + span: { + duration: { + us: 17530, + }, + subtype: 'http', + name: 'GET opbeans-go', + destination: { + service: { + resource: 'opbeans-go:3000', + name: 'http://opbeans-go:3000', + type: 'external', + }, + }, + http: { + response: { + status_code: 200, + }, + url: { + original: 'http://opbeans-go:3000/api/orders', + }, + }, + id: 'fc107f7b556eb49b', + type: 'external', + }, + }, + { + parent: { + id: '975c8d5bfd1dd20b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + processor: { + name: 'transaction', + event: 'span', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + id: '975c8d5bfd1dd20b', + }, + timestamp: { + us: 1584975868787174, + }, + span: { + duration: { + us: 16250, + }, + subtype: 'http', + destination: { + service: { + resource: 'opbeans-python:3000', + name: 'http://opbeans-python:3000', + type: 'external', + }, + }, + name: 'GET opbeans-python:3000', + http: { + response: { + status_code: 200, + }, + url: { + original: 'http://opbeans-python:3000/api/orders', + }, + }, + id: 'daae24d83c269918', + type: 'external', + }, + }, + { + container: { + id: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + parent: { + id: '6fb0ff7365b87298', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + processor: { + name: 'transaction', + event: 'span', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.790Z', + service: { + node: { + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + environment: 'production', + framework: { + name: 'django', + version: '2.1.13', + }, + name: 'opbeans-python', + runtime: { + name: 'CPython', + version: '3.6.10', + }, + language: { + name: 'python', + version: '3.6.10', + }, + version: 'None', + }, + transaction: { + id: '6fb0ff7365b87298', + }, + timestamp: { + us: 1584975868790080, + }, + span: { + duration: { + us: 2519, + }, + subtype: 'postgresql', + name: 'SELECT "n"."id", "n"."address", "n"."city", "n"."company_name", "n"."country", "n"."email", "n"."full_name", "n"."postal_code" FROM "customers" AS "n" WHERE "n"."id" = @__id_0 LIMIT 1', + destination: { + service: { + resource: 'postgresql', + name: 'postgresql', + type: 'db', + }, + }, + action: 'query', + id: 'c9407abb4d08ead1', + type: 'db', + sync: true, + db: { + statement: + 'SELECT "n"."id", "n"."address", "n"."city", "n"."company_name", "n"."country", "n"."email", "n"."full_name", "n"."postal_code" FROM "customers" AS "n" WHERE "n"."id" = @__id_0 LIMIT 1', + type: 'sql', + }, + }, + }, + ], + exceedsMax: false, + errorDocs: [ + { + parent: { + id: '975c8d5bfd1dd20b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + error: { + culprit: 'logrusMiddleware', + log: { + level: 'error', + message: 'GET //api/products (502)', + }, + id: '1f3cb98206b5c54225cb7c8908a658da', + grouping_key: '4dba2ff58fe6c036a5dee2ce411e512a', + }, + processor: { + name: 'error', + event: 'error', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T16:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + id: '975c8d5bfd1dd20b', + sampled: false, + }, + timestamp: { + us: 1584975868787052, + }, + }, + { + parent: { + id: '6fb0ff7365b87298', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + error: { + culprit: 'logrusMiddleware', + log: { + level: 'error', + message: 'GET //api/products (502)', + }, + id: '1f3cb98206b5c54225cb7c8908a658d2', + grouping_key: '4dba2ff58fe6c036a5dee2ce411e512a', + }, + processor: { + name: 'error', + event: 'error', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T16:04:28.790Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + name: 'opbeans-python', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + id: '6fb0ff7365b87298', + sampled: false, + }, + timestamp: { + us: 1584975868790000, + }, + }, + ], +} as unknown as TraceAPIResponse; + +export const traceChildStartBeforeParent = { + traceDocs: [ + { + container: { + id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + process: { + pid: 6, + title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', + version: '1.14.1-SNAPSHOT', + }, + internal: { + sampler: { + value: 46, + }, + }, + source: { + ip: '172.19.0.13', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: '172.19.0.9', + full: 'http://172.19.0.9:3000/api/orders', + }, + observer: { + hostname: 'f37f48d8b60b', + id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', + ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.785Z', + ecs: { + version: '1.4.0', + }, + service: { + node: { + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '10.0.2', + }, + language: { + name: 'Java', + version: '10.0.2', + }, + version: 'None', + }, + host: { + hostname: '4cf84d094553', + os: { + platform: 'Linux', + }, + ip: '172.19.0.9', + name: '4cf84d094553', + architecture: 'amd64', + }, + http: { + request: { + headers: { + Accept: ['*/*'], + 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], + Host: ['172.19.0.9:3000'], + 'Accept-Encoding': ['gzip, deflate'], + }, + method: 'get', + socket: { + encrypted: false, + remote_address: '172.19.0.13', + }, + body: { + original: '[REDACTED]', + }, + }, + response: { + headers: { + 'Transfer-Encoding': ['chunked'], + Date: ['Mon, 23 Mar 2020 15:04:28 GMT'], + 'Content-Type': ['application/json;charset=ISO-8859-1'], + }, + status_code: 200, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + client: { + ip: '172.19.0.13', + }, + transaction: { + duration: { + us: 18842, + }, + result: 'HTTP 2xx', + name: 'DispatcherServlet#doGet', + id: '49809ad3c26adf74', + span_count: { + dropped: 0, + started: 1, + }, + type: 'request', + sampled: true, + }, + user_agent: { + original: 'Python/3.7 aiohttp/3.3.2', + name: 'Other', + device: { + name: 'Other', + }, + }, + timestamp: { + us: 1584975868785000, + }, + }, + { + parent: { + id: 'fc107f7b556eb49b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: 'opbeans-go', + full: 'http://opbeans-go:3000/api/orders', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + framework: { + name: 'gin', + version: 'v1.4.0', + }, + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + duration: { + us: 16597, + }, + result: 'HTTP 2xx', + name: 'GET /api/orders', + id: '975c8d5bfd1dd20b', + span_count: { + dropped: 0, + started: 1, + }, + type: 'request', + sampled: true, + }, + timestamp: { + us: 1584975868787052, + }, + }, + { + parent: { + id: 'daae24d83c269918', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + timestamp: { + us: 1584975868780000, + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/orders', + scheme: 'http', + port: 3000, + domain: 'opbeans-go', + full: 'http://opbeans-go:3000/api/orders', + }, + '@timestamp': '2020-03-23T15:04:28.788Z', + service: { + node: { + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + environment: 'production', + framework: { + name: 'django', + version: '2.1.13', + }, + name: 'opbeans-python', + runtime: { + name: 'CPython', + version: '3.6.10', + }, + language: { + name: 'python', + version: '3.6.10', + }, + version: 'None', + }, + transaction: { + result: 'HTTP 2xx', + duration: { + us: 1464, + }, + name: 'I started before my parent 😰', + span_count: { + dropped: 0, + started: 1, + }, + id: '6fb0ff7365b87298', + type: 'request', + sampled: true, + }, + }, + { + container: { + id: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + parent: { + id: '49809ad3c26adf74', + }, + process: { + pid: 6, + title: '/usr/lib/jvm/java-10-openjdk-amd64/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '99ce8403-5875-4945-b074-d37dc10563eb', + version: '1.14.1-SNAPSHOT', + }, + internal: { + sampler: { + value: 44, + }, + }, + destination: { + address: 'opbeans-go', + port: 3000, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: 'f37f48d8b60b', + id: 'd8522e1f-be8e-43c2-b290-ac6b6c0f171e', + type: 'apm-server', + ephemeral_id: '6ed88f14-170e-478d-a4f5-ea5e7f4b16b9', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.785Z', + ecs: { + version: '1.4.0', + }, + service: { + node: { + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '10.0.2', + }, + language: { + name: 'Java', + version: '10.0.2', + }, + version: 'None', + }, + host: { + hostname: '4cf84d094553', + os: { + platform: 'Linux', + }, + ip: '172.19.0.9', + name: '4cf84d094553', + architecture: 'amd64', + }, + connection: { + hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", + }, + transaction: { + id: '49809ad3c26adf74', + }, + timestamp: { + us: 1584975868785273, + }, + span: { + duration: { + us: 17530, + }, + subtype: 'http', + name: 'GET opbeans-go', + destination: { + service: { + resource: 'opbeans-go:3000', + name: 'http://opbeans-go:3000', + type: 'external', + }, + }, + http: { + response: { + status_code: 200, + }, + url: { + original: 'http://opbeans-go:3000/api/orders', + }, + }, + id: 'fc107f7b556eb49b', + type: 'external', + }, + }, + { + parent: { + id: '975c8d5bfd1dd20b', + }, + agent: { + name: 'go', + version: '1.7.2', + }, + processor: { + name: 'transaction', + event: 'span', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.787Z', + service: { + node: { + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + }, + environment: 'production', + name: 'opbeans-go', + runtime: { + name: 'gc', + version: 'go1.14.1', + }, + language: { + name: 'go', + version: 'go1.14.1', + }, + version: 'None', + }, + transaction: { + id: '975c8d5bfd1dd20b', + }, + timestamp: { + us: 1584975868787174, + }, + span: { + duration: { + us: 16250, + }, + subtype: 'http', + destination: { + service: { + resource: 'opbeans-python:3000', + name: 'http://opbeans-python:3000', + type: 'external', + }, + }, + name: 'I am his 👇🏻 parent 😡', + http: { + response: { + status_code: 200, + }, + url: { + original: 'http://opbeans-python:3000/api/orders', + }, + }, + id: 'daae24d83c269918', + type: 'external', + }, + }, + { + container: { + id: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + parent: { + id: '6fb0ff7365b87298', + }, + agent: { + name: 'python', + version: '5.5.2', + }, + processor: { + name: 'transaction', + event: 'span', + }, + trace: { + id: '513d33fafe99bbe6134749310c9b5322', + }, + '@timestamp': '2020-03-23T15:04:28.790Z', + service: { + node: { + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + }, + environment: 'production', + framework: { + name: 'django', + version: '2.1.13', + }, + name: 'opbeans-python', + runtime: { + name: 'CPython', + version: '3.6.10', + }, + language: { + name: 'python', + version: '3.6.10', + }, + version: 'None', + }, + transaction: { + id: '6fb0ff7365b87298', + }, + timestamp: { + us: 1584975868781000, + }, + span: { + duration: { + us: 2519, + }, + subtype: 'postgresql', + name: 'I am using my parents skew 😇', + destination: { + service: { + resource: 'postgresql', + name: 'postgresql', + type: 'db', + }, + }, + action: 'query', + id: 'c9407abb4d08ead1', + type: 'db', + sync: true, + db: { + statement: + 'SELECT "opbeans_order"."id", "opbeans_order"."customer_id", "opbeans_customer"."full_name", "opbeans_order"."created_at" FROM "opbeans_order" INNER JOIN "opbeans_customer" ON ("opbeans_order"."customer_id" = "opbeans_customer"."id") LIMIT 1000', + type: 'sql', + }, + }, + }, + ], + exceedsMax: false, + errorDocs: [], +} as TraceAPIResponse; + +export const inferredSpans = { + traceDocs: [ + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + source: { + ip: '172.18.0.8', + }, + processor: { + name: 'transaction', + event: 'transaction', + }, + url: { + path: '/api/products/2', + scheme: 'http', + port: 3000, + domain: '172.18.0.7', + full: 'http://172.18.0.7:3000/api/products/2', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.786Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + client: { + ip: '172.18.0.8', + }, + http: { + request: { + headers: { + Accept: ['*/*'], + 'User-Agent': ['Python/3.7 aiohttp/3.3.2'], + Host: ['172.18.0.7:3000'], + 'Accept-Encoding': ['gzip, deflate'], + }, + method: 'get', + socket: { + encrypted: false, + remote_address: '172.18.0.8', + }, + }, + response: { + headers: { + 'Transfer-Encoding': ['chunked'], + Date: ['Thu, 09 Apr 2020 11:36:01 GMT'], + 'Content-Type': ['application/json;charset=UTF-8'], + }, + status_code: 200, + finished: true, + headers_sent: true, + }, + version: '1.1', + }, + user_agent: { + original: 'Python/3.7 aiohttp/3.3.2', + name: 'Other', + device: { + name: 'Other', + }, + }, + transaction: { + duration: { + us: 237537, + }, + result: 'HTTP 2xx', + name: 'APIRestController#product', + span_count: { + dropped: 0, + started: 3, + }, + id: 'f2387d37260d00bd', + type: 'request', + sampled: true, + }, + timestamp: { + us: 1586432160786001, + }, + }, + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + parent: { + id: 'f2387d37260d00bd', + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.810Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + transaction: { + id: 'f2387d37260d00bd', + }, + span: { + duration: { + us: 204574, + }, + subtype: 'inferred', + name: 'ServletInvocableHandlerMethod#invokeAndHandle', + id: 'a5df600bd7bd5e38', + type: 'app', + }, + timestamp: { + us: 1586432160810441, + }, + }, + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + parent: { + id: 'a5df600bd7bd5e38', + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + type: 'apm-server', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.810Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + transaction: { + id: 'f2387d37260d00bd', + }, + timestamp: { + us: 1586432160810441, + }, + span: { + duration: { + us: 102993, + }, + stacktrace: [ + { + library_frame: true, + exclude_from_grouping: false, + filename: 'InvocableHandlerMethod.java', + line: { + number: -1, + }, + function: 'doInvoke', + }, + { + exclude_from_grouping: false, + library_frame: true, + filename: 'InvocableHandlerMethod.java', + line: { + number: -1, + }, + function: 'invokeForRequest', + }, + ], + subtype: 'inferred', + name: 'APIRestController#product', + id: '808dc34fc41ce522', + type: 'app', + }, + }, + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + parent: { + id: 'f2387d37260d00bd', + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + processor: { + name: 'transaction', + event: 'span', + }, + labels: { + productId: '2', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.832Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + transaction: { + id: 'f2387d37260d00bd', + }, + timestamp: { + us: 1586432160832300, + }, + span: { + duration: { + us: 99295, + }, + name: 'OpenTracing product span', + id: '41226ae63af4f235', + type: 'unknown', + }, + child: { id: ['8d80de06aa11a6fc'] }, + }, + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + parent: { + id: '808dc34fc41ce522', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.859Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + transaction: { + id: 'f2387d37260d00bd', + }, + timestamp: { + us: 1586432160859600, + }, + span: { + duration: { + us: 53835, + }, + subtype: 'inferred', + name: 'Loader#executeQueryStatement', + id: '8d80de06aa11a6fc', + type: 'app', + }, + }, + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + parent: { + id: '41226ae63af4f235', + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + destination: { + address: 'postgres', + port: 5432, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.903Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + transaction: { + id: 'f2387d37260d00bd', + }, + timestamp: { + us: 1586432160903236, + }, + span: { + duration: { + us: 10211, + }, + subtype: 'postgresql', + destination: { + service: { + resource: 'postgresql', + name: 'postgresql', + type: 'db', + }, + }, + name: 'SELECT FROM products', + action: 'query', + id: '3708d5623658182f', + type: 'db', + db: { + statement: + 'select product0_.id as col_0_0_, product0_.sku as col_1_0_, product0_.name as col_2_0_, product0_.description as col_3_0_, product0_.cost as col_4_0_, product0_.selling_price as col_5_0_, product0_.stock as col_6_0_, producttyp1_.id as col_7_0_, producttyp1_.name as col_8_0_, (select sum(orderline2_.amount) from order_lines orderline2_ where orderline2_.product_id=product0_.id) as col_9_0_ from products product0_ left outer join product_types producttyp1_ on product0_.type_id=producttyp1_.id where product0_.id=?', + type: 'sql', + user: { + name: 'postgres', + }, + }, + }, + }, + { + container: { + id: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + parent: { + id: '41226ae63af4f235', + }, + process: { + pid: 6, + title: '/opt/java/openjdk/bin/java', + ppid: 1, + }, + agent: { + name: 'java', + ephemeral_id: '1cb5c830-c677-4b13-b340-ab1502f527c3', + version: '1.15.1-SNAPSHOT', + }, + destination: { + address: 'postgres', + port: 5432, + }, + processor: { + name: 'transaction', + event: 'span', + }, + observer: { + hostname: '7189f754b5a3', + id: 'f32d8d9f-a9f9-4355-8370-548dfd8024dc', + ephemeral_id: 'bff20764-0195-4f78-aa84-d799fc47b954', + type: 'apm-server', + version: '8.0.0', + version_major: 8, + }, + trace: { + id: '3b0dc77f3754e5bcb9da0e4c15e0db97', + }, + '@timestamp': '2020-04-09T11:36:00.859Z', + ecs: { + version: '1.5.0', + }, + service: { + node: { + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + }, + environment: 'production', + name: 'opbeans-java', + runtime: { + name: 'Java', + version: '11.0.6', + }, + language: { + name: 'Java', + version: '11.0.6', + }, + version: 'None', + }, + host: { + hostname: 'fc2ae281f56f', + os: { + platform: 'Linux', + }, + ip: '172.18.0.7', + name: 'fc2ae281f56f', + architecture: 'amd64', + }, + transaction: { + id: 'f2387d37260d00bd', + }, + timestamp: { + us: 1586432160859508, + }, + span: { + duration: { + us: 4503, + }, + subtype: 'postgresql', + destination: { + service: { + resource: 'postgresql', + name: 'postgresql', + type: 'db', + }, + }, + name: 'empty query', + action: 'query', + id: '9871cfd612368932', + type: 'db', + db: { + rows_affected: 0, + statement: '(empty query)', + type: 'sql', + user: { + name: 'postgres', + }, + }, + }, + }, + ], + exceedsMax: false, + errorDocs: [], +} as TraceAPIResponse; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.stories.tsx new file mode 100644 index 0000000000000..895b83136a097 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.stories.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Meta, Story } from '@storybook/react'; +import React, { ComponentProps } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { MockApmPluginContextWrapper } from '../../../../../context/apm_plugin/mock_apm_plugin_context'; +import { WaterfallContainer } from './index'; +import { getWaterfall } from './Waterfall/waterfall_helpers/waterfall_helpers'; +import { + inferredSpans, + manyChildrenWithSameLength, + simpleTrace, + traceChildStartBeforeParent, + traceWithErrors, + urlParams as testUrlParams, +} from './waterfall_container.stories.data'; + +type Args = ComponentProps; + +const stories: Meta = { + title: 'app/TransactionDetails/Waterfall', + component: WaterfallContainer, + decorators: [ + (StoryComponent) => ( + + + + + + ), + ], +}; +export default stories; + +export const Example: Story = ({ urlParams, waterfall }) => { + return ; +}; +Example.args = { + urlParams: testUrlParams, + waterfall: getWaterfall(simpleTrace, '975c8d5bfd1dd20b'), +}; + +export const WithErrors: Story = ({ urlParams, waterfall }) => { + return ; +}; +WithErrors.args = { + urlParams: testUrlParams, + waterfall: getWaterfall(traceWithErrors, '975c8d5bfd1dd20b'), +}; + +export const ChildStartsBeforeParent: Story = ({ + urlParams, + waterfall, +}) => { + return ; +}; +ChildStartsBeforeParent.args = { + urlParams: testUrlParams, + waterfall: getWaterfall(traceChildStartBeforeParent, '975c8d5bfd1dd20b'), +}; + +export const InferredSpans: Story = ({ urlParams, waterfall }) => { + return ; +}; +InferredSpans.args = { + urlParams: testUrlParams, + waterfall: getWaterfall(inferredSpans, 'f2387d37260d00bd'), +}; + +export const ManyChildrenWithSameLength: Story = ({ + urlParams, + waterfall, +}) => { + return ; +}; +ManyChildrenWithSameLength.args = { + urlParams: testUrlParams, + waterfall: getWaterfall(manyChildrenWithSameLength, '9a7f717439921d39'), +}; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.test.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.test.tsx new file mode 100644 index 0000000000000..47610569dfa06 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall_container.test.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import React from 'react'; +import { disableConsoleWarning } from '../../../../../utils/testHelpers'; +import * as stories from './waterfall_container.stories'; + +const { Example } = composeStories(stories); + +describe('WaterfallContainer', () => { + let consoleMock: jest.SpyInstance; + + beforeAll(() => { + consoleMock = disableConsoleWarning('Warning: componentWillReceiveProps'); + }); + + afterAll(() => { + consoleMock.mockRestore(); + }); + + it('renders', () => { + expect(() => render()).not.toThrowError(); + }); + + it('expands and contracts the accordion', () => { + const { getAllByRole } = render(); + const buttons = getAllByRole('button'); + const parentItem = buttons[2]; + const childItem = buttons[3]; + + parentItem.click(); + + expect(parentItem).toHaveAttribute('aria-expanded', 'false'); + expect(childItem).toHaveAttribute('aria-expanded', 'true'); + }); +}); diff --git a/x-pack/plugins/apm/public/components/routing/home/index.tsx b/x-pack/plugins/apm/public/components/routing/home/index.tsx index 30e641f142b25..025fa8ddcc8a0 100644 --- a/x-pack/plugins/apm/public/components/routing/home/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/home/index.tsx @@ -8,7 +8,9 @@ import { i18n } from '@kbn/i18n'; import { Outlet } from '@kbn/typed-react-router-config'; import * as t from 'io-ts'; import React from 'react'; +import { toBooleanRt } from '@kbn/io-ts-utils'; import { RedirectTo } from '../redirect_to'; +import { comparisonTypeRt } from '../../../../common/runtime_types/comparison_type_rt'; import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; import { environmentRt } from '../../../../common/environment_rt'; import { BackendDetailOverview } from '../../app/backend_detail_overview'; @@ -18,6 +20,7 @@ import { ServiceInventory } from '../../app/service_inventory'; import { ServiceMapHome } from '../../app/service_map'; import { TraceOverview } from '../../app/trace_overview'; import { ApmMainTemplate } from '../templates/apm_main_template'; +import { RedirectToBackendOverviewRouteView } from './redirect_to_backend_overview_route_view'; function page({ path, @@ -100,20 +103,29 @@ export const home = { element: , params: t.partial({ query: t.partial({ - comparisonEnabled: t.string, - comparisonType: t.string, + comparisonEnabled: toBooleanRt, + comparisonType: comparisonTypeRt, }), }), children: [ { path: '/backends/{backendName}/overview', - element: , + element: , params: t.type({ path: t.type({ backendName: t.string, }), }), }, + { + path: '/backends/overview', + element: , + params: t.type({ + query: t.type({ + backendName: t.string, + }), + }), + }, page({ path: '/backends', title: DependenciesInventoryTitle, diff --git a/x-pack/plugins/apm/public/components/routing/home/redirect_to_backend_overview_route_view.tsx b/x-pack/plugins/apm/public/components/routing/home/redirect_to_backend_overview_route_view.tsx new file mode 100644 index 0000000000000..ef6d04828c19d --- /dev/null +++ b/x-pack/plugins/apm/public/components/routing/home/redirect_to_backend_overview_route_view.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import qs from 'query-string'; +import React from 'react'; +import { Redirect } from 'react-router-dom'; +import { useApmParams } from '../../../hooks/use_apm_params'; + +export function RedirectToBackendOverviewRouteView() { + const { + path: { backendName }, + query, + } = useApmParams('/backends/{backendName}/overview'); + + const search = qs.stringify({ ...query, backendName }); + + return ; +} diff --git a/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx b/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx index 16cba23da6423..4afa10cbf9a5d 100644 --- a/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx @@ -8,6 +8,8 @@ import * as t from 'io-ts'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { Outlet } from '@kbn/typed-react-router-config'; +import { toBooleanRt } from '@kbn/io-ts-utils'; +import { comparisonTypeRt } from '../../../../common/runtime_types/comparison_type_rt'; import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; import { environmentRt } from '../../../../common/environment_rt'; import { ServiceOverview } from '../../app/service_overview'; @@ -79,8 +81,8 @@ export const serviceDetail = { kuery: t.string, }), t.partial({ - comparisonEnabled: t.string, - comparisonType: t.string, + comparisonEnabled: toBooleanRt, + comparisonType: comparisonTypeRt, latencyAggregationType: t.string, transactionType: t.string, refreshPaused: t.union([t.literal('true'), t.literal('false')]), @@ -162,6 +164,9 @@ export const serviceDetail = { defaultMessage: 'Errors', }), element: , + searchBarOptions: { + showTimeComparison: true, + }, }), params: t.partial({ query: t.partial({ diff --git a/x-pack/plugins/apm/public/components/routing/templates/backend_detail_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/backend_detail_template.tsx index 27eb16a0221b7..f87e9a46df584 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/backend_detail_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/backend_detail_template.tsx @@ -7,9 +7,11 @@ import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import React from 'react'; -import { useApmBackendContext } from '../../../context/apm_backend/use_apm_backend_context'; import { ApmMainTemplate } from './apm_main_template'; import { SpanIcon } from '../../shared/span_icon'; +import { useApmParams } from '../../../hooks/use_apm_params'; +import { useTimeRange } from '../../../hooks/use_time_range'; +import { useFetcher } from '../../../hooks/use_fetcher'; interface Props { title: string; @@ -18,11 +20,32 @@ interface Props { export function BackendDetailTemplate({ title, children }: Props) { const { - backendName, - metadata: { data }, - } = useApmBackendContext(); + query: { backendName, rangeFrom, rangeTo }, + } = useApmParams('/backends/overview'); - const metadata = data?.metadata; + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + + const backendMetadataFetch = useFetcher( + (callApmApi) => { + if (!start || !end) { + return; + } + + return callApmApi({ + endpoint: 'GET /internal/apm/backends/metadata', + params: { + query: { + backendName, + start, + end, + }, + }, + }); + }, + [backendName, start, end] + ); + + const { data: { metadata } = {} } = backendMetadataFetch; return ( ; + +const coreMock = { + notifications: { toasts: { add: () => {} } }, + usageCollection: { reportUiCounter: () => {} }, + observability: { + navigation: { + PageTemplate: () => { + return <>hello world; + }, + }, + }, + http: { + basePath: { + prepend: (path: string) => `/basepath${path}`, + get: () => `/basepath`, + }, + get: async () => ({}), + }, + docLinks: { + DOC_LINK_VERSION: '0', + ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', + links: { + apm: {}, + observability: { guide: '' }, + }, + } as unknown as DocLinksStart, +} as unknown as Partial; + +const KibanaReactContext = createKibanaReactContext(coreMock); + +const stories: Meta = { + title: 'routing/templates/SettingsTemplate', + component: SettingsTemplate, + decorators: [ + (StoryComponent) => { + return ( + + + + + + + + ); + }, + ], +}; +export default stories; + +export const Example: Story = (args) => { + return ; +}; +Example.args = { + children: <>test, + selectedTab: 'agent-configurations', +}; diff --git a/x-pack/plugins/apm/public/components/routing/templates/settings_template.test.tsx b/x-pack/plugins/apm/public/components/routing/templates/settings_template.test.tsx index d52c758909ff1..90dbbdf2bc546 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/settings_template.test.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/settings_template.test.tsx @@ -5,69 +5,17 @@ * 2.0. */ -import { render } from '@testing-library/react'; -import { MockApmPluginContextWrapper } from '../../../context/apm_plugin/mock_apm_plugin_context'; -import React, { ReactNode } from 'react'; -import { SettingsTemplate } from './settings_template'; -import { createMemoryHistory } from 'history'; -import { MemoryRouter, RouteComponentProps } from 'react-router-dom'; -import { CoreStart, DocLinksStart, HttpStart } from 'kibana/public'; -import { createKibanaReactContext } from 'src/plugins/kibana_react/public'; -import { createCallApmApi } from '../../../services/rest/createCallApmApi'; +import { composeStories } from '@storybook/testing-react'; +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import * as stories from './settings_template.stories'; -const { location } = createMemoryHistory(); - -const KibanaReactContext = createKibanaReactContext({ - notifications: { toasts: { add: () => {} } }, - usageCollection: { reportUiCounter: () => {} }, - observability: { - navigation: { - PageTemplate: () => { - return <>hello world; - }, - }, - }, - http: { - basePath: { - prepend: (path: string) => `/basepath${path}`, - get: () => `/basepath`, - }, - } as HttpStart, - docLinks: { - DOC_LINK_VERSION: '0', - ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', - links: { - apm: {}, - observability: { guide: '' }, - }, - } as unknown as DocLinksStart, -} as unknown as Partial); - -function Wrapper({ children }: { children?: ReactNode }) { - return ( - - - {children} - - - ); -} +const { Example } = composeStories(stories); describe('Settings', () => { - beforeEach(() => { - createCallApmApi({} as CoreStart); - }); it('renders', async () => { - const routerProps = { - location, - } as unknown as RouteComponentProps<{}>; - expect(() => - render( - -
hello world
-
, - { wrapper: Wrapper } - ) - ).not.toThrowError(); + render(); + + expect(await screen.findByText('hello world')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/backend_link.stories.tsx b/x-pack/plugins/apm/public/components/shared/backend_link.stories.tsx index 31bc2f2302798..213b5a175aa2c 100644 --- a/x-pack/plugins/apm/public/components/shared/backend_link.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/backend_link.stories.tsx @@ -30,7 +30,13 @@ export const Example: Story = (args) => { return ; }; Example.args = { - backendName: 'postgres', + query: { + backendName: 'postgres', + environment: 'ENVIRONMENT_ALL', + kuery: '', + rangeFrom: 'now-15m', + rangeTo: 'now', + }, type: 'db', subtype: 'postgresql', }; diff --git a/x-pack/plugins/apm/public/components/shared/backend_link.test.tsx b/x-pack/plugins/apm/public/components/shared/backend_link.test.tsx new file mode 100644 index 0000000000000..683fec3a41725 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/backend_link.test.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 { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import React from 'react'; +import * as stories from './backend_link.stories'; + +const { Example } = composeStories(stories); + +describe('BackendLink', () => { + it('renders', () => { + expect(() => render()).not.toThrowError(); + }); +}); diff --git a/x-pack/plugins/apm/public/components/shared/backend_link.tsx b/x-pack/plugins/apm/public/components/shared/backend_link.tsx index 342c668d2efdb..92cad37273b02 100644 --- a/x-pack/plugins/apm/public/components/shared/backend_link.tsx +++ b/x-pack/plugins/apm/public/components/shared/backend_link.tsx @@ -17,15 +17,13 @@ import { SpanIcon } from './span_icon'; const StyledLink = euiStyled(EuiLink)`${truncate('100%')};`; interface BackendLinkProps { - backendName: string; - query: TypeOf['query']; + query: TypeOf['query']; subtype?: string; type?: string; onClick?: React.ComponentProps['onClick']; } export function BackendLink({ - backendName, query, subtype, type, @@ -35,8 +33,7 @@ export function BackendLink({ return ( - {backendName} + {query.backendName} ); diff --git a/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx index 16157071affcd..7f7c163ff1ea1 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/breakdown_chart/index.tsx @@ -44,6 +44,8 @@ import { getMaxY, getResponseTimeTickFormatter, } from '../../../shared/charts/transaction_charts/helper'; +import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; +import { getTimeZone } from '../helper/timezone'; interface Props { fetchStatus: FETCH_STATUS; @@ -66,15 +68,12 @@ export function BreakdownChart({ }: Props) { const history = useHistory(); const chartTheme = useChartTheme(); - + const { core } = useApmPluginContext(); const { chartRef, setPointerEvent } = useChartPointerEventContext(); - const { query: { rangeFrom, rangeTo }, } = useApmParams('/services/{serviceName}'); - const theme = useTheme(); - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); const min = moment.utc(start).valueOf(); @@ -92,6 +91,8 @@ export function BreakdownChart({ ? getResponseTimeTickFormatter(getDurationFormatter(maxY)) : asPercentBound; + const timeZone = getTimeZone(core.uiSettings); + return ( @@ -150,6 +151,7 @@ export function BreakdownChart({ timeseries.map((serie) => { return ( { setSelectedAlertId, theme, })![0].props.dataValues[0].header - ).toEqual('Alert'); + ).toEqual('Alert - Experimental'); }); it('uses the reason in the annotation details', () => { @@ -123,7 +123,7 @@ describe('getAlertAnnotations', () => { setSelectedAlertId, theme, })![0].props.dataValues[0].details - ).toEqual('a good reason'); + ).toEqual('a good reason. Click to see more details.'); }); describe('with no formatter', () => { @@ -140,7 +140,7 @@ describe('getAlertAnnotations', () => { setSelectedAlertId, theme, })![0].props.dataValues[0].details - ).toEqual(alert[ALERT_RULE_NAME]![0]); + ).toEqual(`${alert[ALERT_RULE_NAME]![0]}. Click to see more details.`); }); }); @@ -191,7 +191,7 @@ describe('getAlertAnnotations', () => { setSelectedAlertId, theme, })![0].props.dataValues[0].header - ).toEqual('Warning Alert'); + ).toEqual('Warning Alert - Experimental'); }); }); @@ -224,7 +224,7 @@ describe('getAlertAnnotations', () => { setSelectedAlertId, theme, })![0].props.dataValues[0].header - ).toEqual('Critical Alert'); + ).toEqual('Critical Alert - Experimental'); }); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx b/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx index f4c47a9247e75..038269d3cefdc 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx @@ -122,7 +122,13 @@ export function getAlertAnnotations({ const end = start + parsed[ALERT_DURATION]! / 1000; const severityLevel = parsed[ALERT_SEVERITY]; const color = getAlertColor({ severityLevel, theme }); - const header = getAlertHeader({ severityLevel }); + const experimentalLabel = i18n.translate( + 'xpack.apm.alertAnnotationTooltipExperimentalText', + { defaultMessage: 'Experimental' } + ); + const header = `${getAlertHeader({ + severityLevel, + })} - ${experimentalLabel}`; const formatter = getFormatter(parsed[ALERT_RULE_TYPE_ID]!); const formatted = { link: undefined, @@ -133,13 +139,18 @@ export function getAlertAnnotations({ }) ?? {}), }; const isSelected = uuid === selectedAlertId; + const moreDetails = i18n.translate( + 'xpack.apm.alertAnnotationTooltipMoreDetailsText', + { defaultMessage: 'Click to see more details.' } + ); + const details = `${formatted.reason}. ${moreDetails}`; return [ { let originalTimezone: moment.MomentZone | null; @@ -67,4 +68,22 @@ describe('Timezone helper', () => { ]); }); }); + + describe('getTimeZone', () => { + it('returns local when uiSettings is undefined', () => { + expect(getTimeZone()).toEqual('local'); + }); + + it('returns local when uiSettings returns Browser', () => { + expect( + getTimeZone({ get: () => 'Browser' } as unknown as IUiSettingsClient) + ).toEqual('local'); + }); + it('returns timezone defined on uiSettings', () => { + const timezone = 'America/toronto'; + expect( + getTimeZone({ get: () => timezone } as unknown as IUiSettingsClient) + ).toEqual(timezone); + }); + }); }); diff --git a/x-pack/plugins/apm/public/components/shared/charts/helper/timezone.ts b/x-pack/plugins/apm/public/components/shared/charts/helper/timezone.ts index 539c81c61c3ce..f807d83c8977f 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/helper/timezone.ts +++ b/x-pack/plugins/apm/public/components/shared/charts/helper/timezone.ts @@ -7,6 +7,8 @@ import d3 from 'd3'; import { getTimezoneOffsetInMs } from './get_timezone_offset_in_ms'; +import { IUiSettingsClient } from '../../../../../../../../src/core/public'; +import { UI_SETTINGS } from '../../../../../../../../src/plugins/data/common'; interface Params { domain: [number, number]; @@ -31,3 +33,15 @@ export const getDomainTZ = (min: number, max: number): [number, number] => { ); return [xMinZone, xMaxZone]; }; + +export function getTimeZone(uiSettings?: IUiSettingsClient) { + const kibanaTimeZone = uiSettings?.get<'Browser' | string>( + UI_SETTINGS.DATEFORMAT_TZ + ); + + if (!kibanaTimeZone || kibanaTimeZone === 'Browser') { + return 'local'; + } + + return kibanaTimeZone; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx index ad51e66f1959c..e1921aca8d9ef 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx @@ -20,18 +20,18 @@ import { ALERT_RULE_UUID, ALERT_RULE_NAME, ALERT_RULE_CATEGORY, + ALERT_RULE_CONSUMER, ALERT_RULE_PRODUCER, + SPACE_IDS, } from '@kbn/rule-data-utils'; -import { StoryContext } from '@storybook/react'; -import React, { ComponentType } from 'react'; -import { MemoryRouter, Route } from 'react-router-dom'; +import { Meta, Story } from '@storybook/react'; +import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; import { KibanaContextProvider } from '../../../../../../../../src/plugins/kibana_react/public'; import { ENVIRONMENT_ALL } from '../../../../../common/environment_filter_values'; import { LatencyAggregationType } from '../../../../../common/latency_aggregation_types'; -import { - ApmPluginContext, - ApmPluginContextValue, -} from '../../../../context/apm_plugin/apm_plugin_context'; +import type { ApmPluginContextValue } from '../../../../context/apm_plugin/apm_plugin_context'; +import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; import { APMServiceContext } from '../../../../context/apm_service/apm_service_context'; import { ChartPointerEventContextProvider } from '../../../../context/chart_pointer_event/chart_pointer_event_context'; import { MockUrlParamsContextProvider } from '../../../../context/url_params_context/mock_url_params_context_provider'; @@ -46,7 +46,7 @@ interface Args { latencyChartResponse: APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/charts/latency'>; } -export default { +const stories: Meta = { title: 'shared/charts/LatencyChart', component: LatencyChart, argTypes: { @@ -57,7 +57,7 @@ export default { }, }, decorators: [ - (Story: ComponentType, { args }: StoryContext) => { + (StoryComponent, { args }) => { const { alertsResponse, latencyChartResponse } = args as Args; const serviceName = 'testService'; @@ -88,44 +88,46 @@ export default { const transactionType = `${Math.random()}`; // So we don't memoize return ( - - - - + + + - - - - - - - - - - - + + + + + + + + ); }, ], }; -export function Example(_args: Args) { +export default stories; + +export const Example: Story = () => { return ( ); -} +}; Example.args = { alertsResponse: { alerts: [ @@ -139,6 +141,7 @@ Example.args = { tags: ['apm', 'service.name:frontend-rum'], 'transaction.type': ['page-load'], [ALERT_RULE_PRODUCER]: ['apm'], + [ALERT_RULE_CONSUMER]: ['apm'], [ALERT_UUID]: ['af2ae371-df79-4fca-b0eb-a2dbd9478180'], [ALERT_RULE_UUID]: ['82e0ee40-c2f4-11eb-9a42-a9da66a1722f'], 'event.action': ['active'], @@ -149,9 +152,11 @@ Example.args = { [ALERT_START]: ['2021-06-02T04:00:00.000Z'], 'event.kind': ['state'], [ALERT_RULE_CATEGORY]: ['Latency threshold'], + [SPACE_IDS]: [], }, { [ALERT_RULE_TYPE_ID]: ['apm.transaction_duration'], + [ALERT_EVALUATION_VALUE]: [2001708.19], 'service.name': ['frontend-rum'], [ALERT_RULE_NAME]: ['Latency threshold | frontend-rum'], @@ -160,6 +165,7 @@ Example.args = { tags: ['apm', 'service.name:frontend-rum'], 'transaction.type': ['page-load'], [ALERT_RULE_PRODUCER]: ['apm'], + [ALERT_RULE_CONSUMER]: ['apm'], [ALERT_SEVERITY]: ['warning'], [ALERT_UUID]: ['af2ae371-df79-4fca-b0eb-a2dbd9478181'], [ALERT_RULE_UUID]: ['82e0ee40-c2f4-11eb-9a42-a9da66a1722f'], @@ -171,9 +177,11 @@ Example.args = { [ALERT_START]: ['2021-06-02T10:45:00.000Z'], 'event.kind': ['state'], [ALERT_RULE_CATEGORY]: ['Latency threshold'], + [SPACE_IDS]: [], }, { [ALERT_RULE_TYPE_ID]: ['apm.transaction_duration'], + [ALERT_EVALUATION_VALUE]: [2001708.19], 'service.name': ['frontend-rum'], [ALERT_RULE_NAME]: ['Latency threshold | frontend-rum'], @@ -182,6 +190,7 @@ Example.args = { tags: ['apm', 'service.name:frontend-rum'], 'transaction.type': ['page-load'], [ALERT_RULE_PRODUCER]: ['apm'], + [ALERT_RULE_CONSUMER]: ['apm'], [ALERT_SEVERITY]: ['critical'], [ALERT_UUID]: ['af2ae371-df79-4fca-b0eb-a2dbd9478182'], [ALERT_RULE_UUID]: ['82e0ee40-c2f4-11eb-9a42-a9da66a1722f'], @@ -193,6 +202,7 @@ Example.args = { [ALERT_START]: ['2021-06-02T16:50:00.000Z'], 'event.kind': ['state'], [ALERT_RULE_CATEGORY]: ['Latency threshold'], + [SPACE_IDS]: [], }, ], }, @@ -801,19 +811,24 @@ Example.args = { }, ], }, - previousPeriod: { latencyTimeseries: [] }, + previousPeriod: { latencyTimeseries: [], overallAvgDuration: null }, }, }; -export function NoData(_args: Args) { +export const NoData: Story = () => { return ( ); -} +}; NoData.args = { alertsResponse: { alerts: [] }, latencyChartResponse: { - currentPeriod: { latencyTimeseries: [] }, - previousPeriod: { latencyTimeseries: [] }, + anomalyTimeseries: { + jobId: 'apm-production-00aa-high_mean_transaction_duration', + anomalyScore: [], + anomalyBoundaries: [], + }, + currentPeriod: { latencyTimeseries: [], overallAvgDuration: null }, + previousPeriod: { latencyTimeseries: [], overallAvgDuration: null }, }, }; diff --git a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.test.tsx b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.test.tsx new file mode 100644 index 0000000000000..f5f7c87ed22de --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.test.tsx @@ -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 { composeStories } from '@storybook/testing-react'; +import { render, waitFor } from '@testing-library/react'; +import React from 'react'; +import * as stories from './latency_chart.stories'; + +const { Example } = composeStories(stories); + +describe('LatencyChart', () => { + it('renders', async () => { + await waitFor(() => { + expect(() => render()).not.toThrowError(); + }); + }); +}); diff --git a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx index 08e8908d50e7a..bcdfff2678cda 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx @@ -19,8 +19,8 @@ import { RectAnnotation, ScaleType, Settings, - YDomainRange, XYBrushEvent, + YDomainRange, } from '@elastic/charts'; import { EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -46,6 +46,7 @@ import { getLatencyChartSelector } from '../../../selectors/latency_chart_select import { unit } from '../../../utils/style'; import { ChartContainer } from './chart_container'; import { getAlertAnnotations } from './helper/get_alert_annotations'; +import { getTimeZone } from './helper/timezone'; import { isTimeseriesEmpty, onBrushEnd } from './helper/helper'; interface Props { @@ -85,7 +86,7 @@ export function TimeseriesChart({ alerts, }: Props) { const history = useHistory(); - const { observabilityRuleTypeRegistry } = useApmPluginContext(); + const { observabilityRuleTypeRegistry, core } = useApmPluginContext(); const { getFormatter } = observabilityRuleTypeRegistry; const { annotations } = useAnnotationsContext(); const { setPointerEvent, chartRef } = useChartPointerEventContext(); @@ -97,6 +98,8 @@ export function TimeseriesChart({ const xValues = timeseries.flatMap(({ data }) => data.map(({ x }) => x)); + const timeZone = getTimeZone(core.uiSettings); + const min = Math.min(...xValues); const max = Math.max(...xValues); @@ -180,6 +183,7 @@ export function TimeseriesChart({ return ( - diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_distribution_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_distribution_chart/index.tsx index 1a1ea13fa45ec..dcf52cebaeeda 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_distribution_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_distribution_chart/index.tsx @@ -132,7 +132,7 @@ export function TransactionDistributionChart({ Math.max( ...flatten(data.map((d) => d.histogram)).map((d) => d.doc_count) ) ?? 0; - const yTicks = Math.ceil(Math.log10(yMax)); + const yTicks = Math.max(1, Math.ceil(Math.log10(yMax))); const yAxisDomain = { min: 0.5, max: Math.pow(10, yTicks), diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx index 695c941c61ed4..19abd2059c903 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx @@ -50,7 +50,7 @@ export function IconPopover({ } diff --git a/x-pack/plugins/apm/public/components/shared/service_link.stories.tsx b/x-pack/plugins/apm/public/components/shared/service_link.stories.tsx index f25838a3552f4..c50c1911afe79 100644 --- a/x-pack/plugins/apm/public/components/shared/service_link.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_link.stories.tsx @@ -31,5 +31,11 @@ export const Example: Story = (args) => { }; Example.args = { agentName: 'java', + query: { + environment: 'ENVIRONMENT_ALL', + kuery: '', + rangeFrom: 'now-15m', + rangeTo: 'now', + }, serviceName: 'opbeans-java', }; diff --git a/x-pack/plugins/apm/public/components/shared/service_link.test.tsx b/x-pack/plugins/apm/public/components/shared/service_link.test.tsx new file mode 100644 index 0000000000000..63311b306e6bb --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/service_link.test.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 { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import React from 'react'; +import * as stories from './service_link.stories'; + +const { Example } = composeStories(stories); + +describe('ServiceLink', () => { + it('renders', () => { + expect(() => render()).not.toThrowError(); + }); +}); diff --git a/x-pack/plugins/apm/public/components/shared/suggestions_select/suggestions_select.test.tsx b/x-pack/plugins/apm/public/components/shared/suggestions_select/suggestions_select.test.tsx index b1fce1c439f32..629a3f3df47f7 100644 --- a/x-pack/plugins/apm/public/components/shared/suggestions_select/suggestions_select.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/suggestions_select/suggestions_select.test.tsx @@ -6,14 +6,16 @@ */ import { composeStories } from '@storybook/testing-react'; -import { render } from '@testing-library/react'; +import { render, screen } from '@testing-library/react'; import React from 'react'; import * as stories from './suggestions_select.stories'; const { Example } = composeStories(stories); describe('SuggestionsSelect', () => { - it('renders', () => { - expect(() => render()).not.toThrowError(); + it('renders', async () => { + render(); + + expect(await screen.findByRole('combobox')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/get_comparison_types.ts b/x-pack/plugins/apm/public/components/shared/time_comparison/get_comparison_types.ts index 0115718ac07a9..97754cd91fd3e 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/get_comparison_types.ts +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/get_comparison_types.ts @@ -6,8 +6,8 @@ */ import moment from 'moment'; +import { TimeRangeComparisonEnum } from '../../../../common/runtime_types/comparison_type_rt'; import { getDateDifference } from '../../../../common/utils/formatters'; -import { TimeRangeComparisonType } from './get_time_range_comparison'; export function getComparisonTypes({ start, @@ -29,17 +29,17 @@ export function getComparisonTypes({ // Less than or equals to one day if (dateDiff <= 1) { return [ - TimeRangeComparisonType.DayBefore, - TimeRangeComparisonType.WeekBefore, + TimeRangeComparisonEnum.DayBefore, + TimeRangeComparisonEnum.WeekBefore, ]; } // Less than or equals to one week if (dateDiff <= 7) { - return [TimeRangeComparisonType.WeekBefore]; + return [TimeRangeComparisonEnum.WeekBefore]; } // } // above one week or when rangeTo is not "now" - return [TimeRangeComparisonType.PeriodBefore]; + return [TimeRangeComparisonEnum.PeriodBefore]; } diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts index da903e42bd3c7..7e67d76c2ada2 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.test.ts @@ -4,10 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { - getTimeRangeComparison, - TimeRangeComparisonType, -} from './get_time_range_comparison'; +import { TimeRangeComparisonEnum } from '../../../../common/runtime_types/comparison_type_rt'; +import { getTimeRangeComparison } from './get_time_range_comparison'; describe('getTimeRangeComparison', () => { describe('return empty object', () => { @@ -16,7 +14,7 @@ describe('getTimeRangeComparison', () => { const result = getTimeRangeComparison({ start: undefined, end, - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, comparisonEnabled: false, }); expect(result).toEqual({}); @@ -26,7 +24,7 @@ describe('getTimeRangeComparison', () => { const result = getTimeRangeComparison({ start: undefined, end, - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, comparisonEnabled: true, }); expect(result).toEqual({}); @@ -37,7 +35,7 @@ describe('getTimeRangeComparison', () => { const result = getTimeRangeComparison({ start, end: undefined, - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, comparisonEnabled: true, }); expect(result).toEqual({}); @@ -50,7 +48,7 @@ describe('getTimeRangeComparison', () => { const start = '2021-01-28T14:45:00.000Z'; const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, comparisonEnabled: true, start, end, @@ -65,7 +63,7 @@ describe('getTimeRangeComparison', () => { const start = '2021-01-28T14:45:00.000Z'; const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ - comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonType: TimeRangeComparisonEnum.WeekBefore, comparisonEnabled: true, start, end, @@ -82,7 +80,7 @@ describe('getTimeRangeComparison', () => { const result = getTimeRangeComparison({ start, end, - comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonType: TimeRangeComparisonEnum.PeriodBefore, comparisonEnabled: true, }); expect(result).toEqual({ @@ -100,7 +98,7 @@ describe('getTimeRangeComparison', () => { const start = '2021-01-26T15:00:00.000Z'; const end = '2021-01-28T15:00:00.000Z'; const result = getTimeRangeComparison({ - comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonType: TimeRangeComparisonEnum.WeekBefore, comparisonEnabled: true, start, end, @@ -117,7 +115,7 @@ describe('getTimeRangeComparison', () => { const start = '2021-01-10T15:00:00.000Z'; const end = '2021-01-18T15:00:00.000Z'; const result = getTimeRangeComparison({ - comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonType: TimeRangeComparisonEnum.PeriodBefore, comparisonEnabled: true, start, end, @@ -131,7 +129,7 @@ describe('getTimeRangeComparison', () => { const start = '2021-01-01T15:00:00.000Z'; const end = '2021-01-31T15:00:00.000Z'; const result = getTimeRangeComparison({ - comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonType: TimeRangeComparisonEnum.PeriodBefore, comparisonEnabled: true, start, end, diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts index d9f9a249f1320..547be69ff6298 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/get_time_range_comparison.ts @@ -7,14 +7,12 @@ import moment from 'moment'; import { EuiTheme } from 'src/plugins/kibana_react/common'; +import { + TimeRangeComparisonType, + TimeRangeComparisonEnum, +} from '../../../../common/runtime_types/comparison_type_rt'; import { getDateDifference } from '../../../../common/utils/formatters'; -export enum TimeRangeComparisonType { - WeekBefore = 'week', - DayBefore = 'day', - PeriodBefore = 'period', -} - export function getComparisonChartTheme(theme: EuiTheme) { return { areaSeriesStyle: { @@ -63,17 +61,17 @@ export function getTimeRangeComparison({ let offset: string; switch (comparisonType) { - case TimeRangeComparisonType.DayBefore: + case TimeRangeComparisonEnum.DayBefore: diff = oneDayInMilliseconds; offset = '1d'; break; - case TimeRangeComparisonType.WeekBefore: + case TimeRangeComparisonEnum.WeekBefore: diff = oneWeekInMilliseconds; offset = '1w'; break; - case TimeRangeComparisonType.PeriodBefore: + case TimeRangeComparisonEnum.PeriodBefore: diff = getDateDifference({ start: startMoment, end: endMoment, diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/index.test.tsx b/x-pack/plugins/apm/public/components/shared/time_comparison/index.test.tsx index ce7d05d467291..e20a6df12ad46 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/index.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/index.test.tsx @@ -16,10 +16,13 @@ import { import { getSelectOptions, TimeComparison } from './'; import * as urlHelpers from '../../shared/Links/url_helpers'; import moment from 'moment'; -import { TimeRangeComparisonType } from './get_time_range_comparison'; import { getComparisonTypes } from './get_comparison_types'; import { MockApmPluginContextWrapper } from '../../../context/apm_plugin/mock_apm_plugin_context'; import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; +import { + TimeRangeComparisonType, + TimeRangeComparisonEnum, +} from '../../../../common/runtime_types/comparison_type_rt'; import { MockUrlParamsContextProvider } from '../../../context/url_params_context/mock_url_params_context_provider'; function getWrapper({ @@ -68,8 +71,8 @@ describe('TimeComparison', () => { end: '2021-06-04T16:32:02.335Z', }) ).toEqual([ - TimeRangeComparisonType.DayBefore.valueOf(), - TimeRangeComparisonType.WeekBefore.valueOf(), + TimeRangeComparisonEnum.DayBefore.valueOf(), + TimeRangeComparisonEnum.WeekBefore.valueOf(), ]); }); @@ -80,8 +83,8 @@ describe('TimeComparison', () => { end: '2021-06-05T03:59:59.999Z', }) ).toEqual([ - TimeRangeComparisonType.DayBefore.valueOf(), - TimeRangeComparisonType.WeekBefore.valueOf(), + TimeRangeComparisonEnum.DayBefore.valueOf(), + TimeRangeComparisonEnum.WeekBefore.valueOf(), ]); }); @@ -92,8 +95,8 @@ describe('TimeComparison', () => { end: '2021-06-04T16:31:35.748Z', }) ).toEqual([ - TimeRangeComparisonType.DayBefore.valueOf(), - TimeRangeComparisonType.WeekBefore.valueOf(), + TimeRangeComparisonEnum.DayBefore.valueOf(), + TimeRangeComparisonEnum.WeekBefore.valueOf(), ]); }); @@ -104,8 +107,8 @@ describe('TimeComparison', () => { end: '2021-10-14T00:52:59.553Z', }) ).toEqual([ - TimeRangeComparisonType.DayBefore.valueOf(), - TimeRangeComparisonType.WeekBefore.valueOf(), + TimeRangeComparisonEnum.DayBefore.valueOf(), + TimeRangeComparisonEnum.WeekBefore.valueOf(), ]); }); @@ -115,7 +118,7 @@ describe('TimeComparison', () => { start: '2021-06-02T12:32:00.000Z', end: '2021-06-03T13:32:09.079Z', }) - ).toEqual([TimeRangeComparisonType.WeekBefore.valueOf()]); + ).toEqual([TimeRangeComparisonEnum.WeekBefore.valueOf()]); }); it('shows week before when 7 days is selected', () => { @@ -124,7 +127,7 @@ describe('TimeComparison', () => { start: '2021-05-28T16:32:17.520Z', end: '2021-06-04T16:32:17.520Z', }) - ).toEqual([TimeRangeComparisonType.WeekBefore.valueOf()]); + ).toEqual([TimeRangeComparisonEnum.WeekBefore.valueOf()]); }); it('shows period before when 8 days is selected', () => { expect( @@ -132,7 +135,7 @@ describe('TimeComparison', () => { start: '2021-05-27T16:32:46.747Z', end: '2021-06-04T16:32:46.747Z', }) - ).toEqual([TimeRangeComparisonType.PeriodBefore.valueOf()]); + ).toEqual([TimeRangeComparisonEnum.PeriodBefore.valueOf()]); }); }); @@ -141,24 +144,24 @@ describe('TimeComparison', () => { expect( getSelectOptions({ comparisonTypes: [ - TimeRangeComparisonType.DayBefore, - TimeRangeComparisonType.WeekBefore, - TimeRangeComparisonType.PeriodBefore, + TimeRangeComparisonEnum.DayBefore, + TimeRangeComparisonEnum.WeekBefore, + TimeRangeComparisonEnum.PeriodBefore, ], start: '2021-05-27T16:32:46.747Z', end: '2021-06-04T16:32:46.747Z', }) ).toEqual([ { - value: TimeRangeComparisonType.DayBefore.valueOf(), + value: TimeRangeComparisonEnum.DayBefore.valueOf(), text: 'Day before', }, { - value: TimeRangeComparisonType.WeekBefore.valueOf(), + value: TimeRangeComparisonEnum.WeekBefore.valueOf(), text: 'Week before', }, { - value: TimeRangeComparisonType.PeriodBefore.valueOf(), + value: TimeRangeComparisonEnum.PeriodBefore.valueOf(), text: '19/05 18:32 - 27/05 18:32', }, ]); @@ -167,13 +170,13 @@ describe('TimeComparison', () => { it('formats period before as DD/MM/YY HH:mm when range years are different', () => { expect( getSelectOptions({ - comparisonTypes: [TimeRangeComparisonType.PeriodBefore], + comparisonTypes: [TimeRangeComparisonEnum.PeriodBefore], start: '2020-05-27T16:32:46.747Z', end: '2021-06-04T16:32:46.747Z', }) ).toEqual([ { - value: TimeRangeComparisonType.PeriodBefore.valueOf(), + value: TimeRangeComparisonEnum.PeriodBefore.valueOf(), text: '20/05/19 18:32 - 27/05/20 18:32', }, ]); @@ -195,7 +198,7 @@ describe('TimeComparison', () => { expect(spy).toHaveBeenCalledWith(expect.anything(), { query: { comparisonEnabled: 'true', - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, }, }); }); @@ -204,7 +207,7 @@ describe('TimeComparison', () => { exactStart: '2021-06-04T16:17:02.335Z', exactEnd: '2021-06-04T16:32:02.335Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, }); const component = render(, { wrapper: Wrapper }); expectTextsInDocument(component, ['Day before', 'Week before']); @@ -219,7 +222,7 @@ describe('TimeComparison', () => { exactStart: '2021-06-03T16:31:35.748Z', exactEnd: '2021-06-04T16:31:35.748Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.DayBefore, + comparisonType: TimeRangeComparisonEnum.DayBefore, }); const component = render(, { wrapper: Wrapper }); expectTextsInDocument(component, ['Day before', 'Week before']); @@ -236,7 +239,7 @@ describe('TimeComparison', () => { exactStart: '2021-06-02T12:32:00.000Z', exactEnd: '2021-06-03T13:32:09.079Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonType: TimeRangeComparisonEnum.WeekBefore, }); const component = render(, { wrapper: Wrapper, @@ -255,7 +258,7 @@ describe('TimeComparison', () => { expect(spy).toHaveBeenCalledWith(expect.anything(), { query: { comparisonEnabled: 'true', - comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonType: TimeRangeComparisonEnum.WeekBefore, }, }); }); @@ -264,7 +267,7 @@ describe('TimeComparison', () => { exactStart: '2021-06-02T12:32:00.000Z', exactEnd: '2021-06-03T13:32:09.079Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.WeekBefore, + comparisonType: TimeRangeComparisonEnum.WeekBefore, }); const component = render(, { wrapper: Wrapper, @@ -284,7 +287,7 @@ describe('TimeComparison', () => { exactStart: '2021-05-27T16:32:46.747Z', exactEnd: '2021-06-04T16:32:46.747Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonType: TimeRangeComparisonEnum.PeriodBefore, }); const component = render(, { wrapper: Wrapper, @@ -302,7 +305,7 @@ describe('TimeComparison', () => { exactStart: '2020-05-27T16:32:46.747Z', exactEnd: '2021-06-04T16:32:46.747Z', comparisonEnabled: true, - comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonType: TimeRangeComparisonEnum.PeriodBefore, }); const component = render(, { wrapper: Wrapper, diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx b/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx index d5e38a3df7aac..35a6bc7634813 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx @@ -12,16 +12,14 @@ import React from 'react'; import { useHistory } from 'react-router-dom'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { useUiTracker } from '../../../../../observability/public'; +import { TimeRangeComparisonEnum } from '../../../../common/runtime_types/comparison_type_rt'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useBreakpoints } from '../../../hooks/use_breakpoints'; import { useTimeRange } from '../../../hooks/use_time_range'; import * as urlHelpers from '../../shared/Links/url_helpers'; import { getComparisonTypes } from './get_comparison_types'; -import { - getTimeRangeComparison, - TimeRangeComparisonType, -} from './get_time_range_comparison'; +import { getTimeRangeComparison } from './get_time_range_comparison'; const PrependContainer = euiStyled.div` display: flex; @@ -66,13 +64,13 @@ export function getSelectOptions({ start, end, }: { - comparisonTypes: TimeRangeComparisonType[]; + comparisonTypes: TimeRangeComparisonEnum[]; start?: string; end?: string; }) { return comparisonTypes.map((value) => { switch (value) { - case TimeRangeComparisonType.DayBefore: { + case TimeRangeComparisonEnum.DayBefore: { return { value, text: i18n.translate('xpack.apm.timeComparison.select.dayBefore', { @@ -80,7 +78,7 @@ export function getSelectOptions({ }), }; } - case TimeRangeComparisonType.WeekBefore: { + case TimeRangeComparisonEnum.WeekBefore: { return { value, text: i18n.translate('xpack.apm.timeComparison.select.weekBefore', { @@ -88,9 +86,9 @@ export function getSelectOptions({ }), }; } - case TimeRangeComparisonType.PeriodBefore: { + case TimeRangeComparisonEnum.PeriodBefore: { const { comparisonStart, comparisonEnd } = getTimeRangeComparison({ - comparisonType: TimeRangeComparisonType.PeriodBefore, + comparisonType: TimeRangeComparisonEnum.PeriodBefore, start, end, comparisonEnabled: true, diff --git a/x-pack/plugins/apm/public/context/apm_backend/apm_backend_context.tsx b/x-pack/plugins/apm/public/context/apm_backend/apm_backend_context.tsx deleted file mode 100644 index 6093f05c2cb02..0000000000000 --- a/x-pack/plugins/apm/public/context/apm_backend/apm_backend_context.tsx +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { createContext, useMemo } from 'react'; -import { FETCH_STATUS, useFetcher } from '../../hooks/use_fetcher'; -import { useApmParams } from '../../hooks/use_apm_params'; -import { APIReturnType } from '../../services/rest/createCallApmApi'; -import { useTimeRange } from '../../hooks/use_time_range'; - -export const ApmBackendContext = createContext< - | { - backendName: string; - metadata: { - data?: APIReturnType<'GET /internal/apm/backends/{backendName}/metadata'>; - status?: FETCH_STATUS; - }; - } - | undefined ->(undefined); - -export function ApmBackendContextProvider({ - children, -}: { - children: React.ReactNode; -}) { - const { - path: { backendName }, - query: { rangeFrom, rangeTo }, - } = useApmParams('/backends/{backendName}/overview'); - - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - - const backendMetadataFetch = useFetcher( - (callApmApi) => { - if (!start || !end) { - return; - } - - return callApmApi({ - endpoint: 'GET /internal/apm/backends/{backendName}/metadata', - params: { - path: { - backendName, - }, - query: { - start, - end, - }, - }, - }); - }, - [backendName, start, end] - ); - - const value = useMemo(() => { - return { - backendName, - metadata: { - data: backendMetadataFetch.data, - status: backendMetadataFetch.status, - }, - }; - }, [backendName, backendMetadataFetch.data, backendMetadataFetch.status]); - - return ( - - {children} - - ); -} diff --git a/x-pack/plugins/apm/public/context/apm_backend/use_apm_backend_context.tsx b/x-pack/plugins/apm/public/context/apm_backend/use_apm_backend_context.tsx deleted file mode 100644 index 5a48014c75662..0000000000000 --- a/x-pack/plugins/apm/public/context/apm_backend/use_apm_backend_context.tsx +++ /dev/null @@ -1,20 +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 { useContext } from 'react'; -import { ApmBackendContext } from './apm_backend_context'; - -export function useApmBackendContext() { - const context = useContext(ApmBackendContext); - - if (!context) { - throw new Error( - 'ApmBackendContext has no set value, did you forget rendering ApmBackendContextProvider?' - ); - } - - return context; -} diff --git a/x-pack/plugins/apm/public/context/url_params_context/resolve_url_params.ts b/x-pack/plugins/apm/public/context/url_params_context/resolve_url_params.ts index 32771bd56a72a..845fdb175bb65 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/resolve_url_params.ts +++ b/x-pack/plugins/apm/public/context/url_params_context/resolve_url_params.ts @@ -6,12 +6,12 @@ */ import { Location } from 'history'; +import { TimeRangeComparisonType } from '../../../common/runtime_types/comparison_type_rt'; import { uxLocalUIFilterNames } from '../../../common/ux_ui_filter'; import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; import { LatencyAggregationType } from '../../../common/latency_aggregation_types'; import { pickKeys } from '../../../common/utils/pick_keys'; import { toQuery } from '../../components/shared/Links/url_helpers'; -import { TimeRangeComparisonType } from '../../components/shared/time_comparison/get_time_range_comparison'; import { getDateRange, removeUndefinedProps, diff --git a/x-pack/plugins/apm/public/context/url_params_context/types.ts b/x-pack/plugins/apm/public/context/url_params_context/types.ts index 4deef1662c236..8f167fc0ab734 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/types.ts +++ b/x-pack/plugins/apm/public/context/url_params_context/types.ts @@ -5,9 +5,9 @@ * 2.0. */ +import { TimeRangeComparisonType } from '../../../common/runtime_types/comparison_type_rt'; import { LatencyAggregationType } from '../../../common/latency_aggregation_types'; import { UxLocalUIFilterName } from '../../../common/ux_ui_filter'; -import { TimeRangeComparisonType } from '../../components/shared/time_comparison/get_time_range_comparison'; export type UrlParams = { detailTab?: string; diff --git a/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx index 120cbba952f3e..2878353da8eb7 100644 --- a/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_error_group_distribution_fetcher.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { getTimeRangeComparison } from '../components/shared/time_comparison/get_time_range_comparison'; import { useApmParams } from './use_apm_params'; import { useFetcher } from './use_fetcher'; import { useTimeRange } from './use_time_range'; @@ -21,12 +21,18 @@ export function useErrorGroupDistributionFetcher({ environment: string; }) { const { - query: { rangeFrom, rangeTo }, - } = useApmParams('/services/{serviceName}'); + query: { rangeFrom, rangeTo, comparisonEnabled, comparisonType }, + } = useApmParams('/services/{serviceName}/errors'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const { comparisonStart, comparisonEnd } = getTimeRangeComparison({ + start, + end, + comparisonType, + comparisonEnabled, + }); - const { data } = useFetcher( + const { data, status } = useFetcher( (callApmApi) => { if (start && end) { return callApmApi({ @@ -39,14 +45,25 @@ export function useErrorGroupDistributionFetcher({ kuery, start, end, + comparisonStart, + comparisonEnd, groupId, }, }, }); } }, - [environment, kuery, serviceName, start, end, groupId] + [ + environment, + kuery, + serviceName, + start, + end, + comparisonStart, + comparisonEnd, + groupId, + ] ); - return { errorDistributionData: data }; + return { errorDistributionData: data, status }; } diff --git a/x-pack/plugins/apm/scripts/test/e2e.js b/x-pack/plugins/apm/scripts/test/e2e.js index 629cdc2498414..b3ce510a8e569 100644 --- a/x-pack/plugins/apm/scripts/test/e2e.js +++ b/x-pack/plugins/apm/scripts/test/e2e.js @@ -12,6 +12,11 @@ const yargs = require('yargs'); const childProcess = require('child_process'); const { argv } = yargs(process.argv.slice(2)) + .option('kibana-install-dir', { + default: '', + type: 'string', + description: 'Path to the Kibana install directory', + }) .option('server', { default: false, type: 'boolean', @@ -30,7 +35,7 @@ const { argv } = yargs(process.argv.slice(2)) }) .help(); -const { server, runner, open } = argv; +const { server, runner, open, kibanaInstallDir } = argv; const e2eDir = path.join(__dirname, '../../ftr_e2e'); @@ -44,6 +49,6 @@ if (server) { const config = open ? './cypress_open.ts' : './cypress_run.ts'; childProcess.execSync( - `node ../../../../scripts/${ftrScript} --config ${config}`, + `node ../../../../scripts/${ftrScript} --config ${config} --kibana-install-dir '${kibanaInstallDir}'`, { cwd: e2eDir, stdio: 'inherit' } ); diff --git a/x-pack/plugins/apm/server/index.ts b/x-pack/plugins/apm/server/index.ts index abf9b3f5fb774..227be79479696 100644 --- a/x-pack/plugins/apm/server/index.ts +++ b/x-pack/plugins/apm/server/index.ts @@ -14,7 +14,7 @@ import { maxSuggestions } from '../../observability/common'; import { SearchAggregatedTransactionSetting } from '../common/aggregated_transactions'; import { APMPlugin } from './plugin'; -// All options should be documented in the APM configuration settings: https://github.com/elastic/kibana/blob/master/docs/settings/apm-settings.asciidoc +// All options should be documented in the APM configuration settings: https://github.com/elastic/kibana/blob/main/docs/settings/apm-settings.asciidoc // and be included on cloud allow list unless there are specific reasons not to const configSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), @@ -69,23 +69,38 @@ export const config: PluginConfigDescriptor = { deprecate('enabled', '8.0.0'), renameFromRoot( 'apm_oss.transactionIndices', - 'xpack.apm.indices.transaction' + 'xpack.apm.indices.transaction', + { level: 'warning' } ), - renameFromRoot('apm_oss.spanIndices', 'xpack.apm.indices.span'), - renameFromRoot('apm_oss.errorIndices', 'xpack.apm.indices.error'), - renameFromRoot('apm_oss.metricsIndices', 'xpack.apm.indices.metric'), - renameFromRoot('apm_oss.sourcemapIndices', 'xpack.apm.indices.sourcemap'), - renameFromRoot('apm_oss.onboardingIndices', 'xpack.apm.indices.onboarding'), - deprecateFromRoot('apm_oss.enabled', '8.0.0'), - unusedFromRoot('apm_oss.fleetMode'), - unusedFromRoot('apm_oss.indexPattern'), + renameFromRoot('apm_oss.spanIndices', 'xpack.apm.indices.span', { + level: 'warning', + }), + renameFromRoot('apm_oss.errorIndices', 'xpack.apm.indices.error', { + level: 'warning', + }), + renameFromRoot('apm_oss.metricsIndices', 'xpack.apm.indices.metric', { + level: 'warning', + }), + renameFromRoot('apm_oss.sourcemapIndices', 'xpack.apm.indices.sourcemap', { + level: 'warning', + }), + renameFromRoot( + 'apm_oss.onboardingIndices', + 'xpack.apm.indices.onboarding', + { level: 'warning' } + ), + deprecateFromRoot('apm_oss.enabled', '8.0.0', { level: 'warning' }), + unusedFromRoot('apm_oss.fleetMode', { level: 'warning' }), + unusedFromRoot('apm_oss.indexPattern', { level: 'warning' }), renameFromRoot( 'xpack.apm.maxServiceEnvironments', - `uiSettings.overrides[${maxSuggestions}]` + `uiSettings.overrides[${maxSuggestions}]`, + { level: 'warning' } ), renameFromRoot( 'xpack.apm.maxServiceSelections', - `uiSettings.overrides[${maxSuggestions}]` + `uiSettings.overrides[${maxSuggestions}]`, + { level: 'warning' } ), ], exposeToBrowser: { diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts b/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts index 8ec6111fd2b8b..a2d22a2c8f6ad 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts +++ b/x-pack/plugins/apm/server/lib/errors/distribution/get_buckets.ts @@ -80,13 +80,12 @@ export async function getBuckets({ const buckets = (resp.aggregations?.distribution.buckets || []).map( (bucket) => ({ - key: bucket.key, - count: bucket.doc_count, + x: bucket.key, + y: bucket.doc_count, }) ); return { - noHits: resp.hits.total.value === 0, buckets: resp.hits.total.value > 0 ? buckets : [], }; } diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts b/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts index 5f88452d45b32..7d5cbe9f95584 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts +++ b/x-pack/plugins/apm/server/lib/errors/distribution/get_distribution.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { offsetPreviousPeriodCoordinates } from '../../../../common/utils/offset_previous_period_coordinate'; import { Setup } from '../../helpers/setup_request'; import { BUCKET_TARGET_COUNT } from '../../transactions/constants'; import { getBuckets } from './get_buckets'; @@ -21,6 +22,8 @@ export async function getErrorDistribution({ setup, start, end, + comparisonStart, + comparisonEnd, }: { environment: string; kuery: string; @@ -29,22 +32,43 @@ export async function getErrorDistribution({ setup: Setup; start: number; end: number; + comparisonStart?: number; + comparisonEnd?: number; }) { const bucketSize = getBucketSize({ start, end }); - const { buckets, noHits } = await getBuckets({ + const commonProps = { environment, kuery, serviceName, groupId, - bucketSize, setup, + bucketSize, + }; + const currentPeriodPromise = getBuckets({ + ...commonProps, start, end, }); + const previousPeriodPromise = + comparisonStart && comparisonEnd + ? getBuckets({ + ...commonProps, + start: comparisonStart, + end: comparisonEnd, + }) + : { buckets: [], bucketSize: null }; + + const [currentPeriod, previousPeriod] = await Promise.all([ + currentPeriodPromise, + previousPeriodPromise, + ]); return { - noHits, - buckets, + currentPeriod: currentPeriod.buckets, + previousPeriod: offsetPreviousPeriodCoordinates({ + currentPeriodTimeseries: currentPeriod.buckets, + previousPeriodTimeseries: previousPeriod.buckets, + }), bucketSize, }; } diff --git a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.test.ts b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.test.ts new file mode 100644 index 0000000000000..3940fa60a38f4 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { preprocessLegacyFields } from './get_apm_package_policy_definition'; + +const apmServerSchema = { + 'apm-server.host': '0.0.0.0:8200', + 'apm-server.secret_token': 'asdfkjhasdf', + 'apm-server.read_timeout': 3600, + 'apm-server.rum.event_rate.limit': 100, + 'apm-server.rum.event_rate.lru_size': 100, + 'apm-server.rum.allow_service_names': 'opbeans-test', + 'logging.level': 'error', + 'queue.mem.events': 2000, + 'queue.mem.flush.timeout': '1s', + 'setup.template.settings.index.number_of_jshards': 1, +}; + +describe('get_apm_package_policy_definition', () => { + describe('preprocessLegacyFields', () => { + it('should replace legacy fields with supported fields', () => { + const result = preprocessLegacyFields({ apmServerSchema }); + expect(result).toMatchInlineSnapshot(` + Object { + "apm-server.auth.anonymous.allow_service": "opbeans-test", + "apm-server.auth.anonymous.rate_limit.event_limit": 100, + "apm-server.auth.anonymous.rate_limit.ip_limit": 100, + "apm-server.auth.secret_token": "asdfkjhasdf", + "apm-server.host": "0.0.0.0:8200", + "apm-server.read_timeout": 3600, + "logging.level": "error", + "queue.mem.events": 2000, + "queue.mem.flush.timeout": "1s", + "setup.template.settings.index.number_of_jshards": 1, + } + `); + }); + }); +}); diff --git a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts index 98b6a6489c47b..df922dd18fe4d 100644 --- a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts +++ b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts @@ -45,7 +45,7 @@ export function getApmPackagePolicyDefinition( }; } -function preprocessLegacyFields({ +export function preprocessLegacyFields({ apmServerSchema, }: { apmServerSchema: Record; @@ -64,6 +64,10 @@ function preprocessLegacyFields({ key: 'apm-server.auth.anonymous.allow_service', legacyKey: 'apm-server.rum.allow_service_names', }, + { + key: 'apm-server.auth.secret_token', + legacyKey: 'apm-server.secret_token', + }, ].forEach(({ key, legacyKey }) => { if (!copyOfApmServerSchema[key]) { copyOfApmServerSchema[key] = copyOfApmServerSchema[legacyKey]; diff --git a/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.test.ts b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.test.ts new file mode 100644 index 0000000000000..cdc56ba9794f6 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.test.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsClientContract } from 'kibana/server'; +import { getUnsupportedApmServerSchema } from './get_unsupported_apm_server_schema'; + +const apmServerSchema = { + 'apm-server.host': '0.0.0.0:8200', + 'apm-server.secret_token': 'asdfkjhasdf', + 'apm-server.read_timeout': 3600, + 'apm-server.rum.event_rate.limit': 100, + 'apm-server.rum.event_rate.lru_size': 100, + 'apm-server.rum.allow_service_names': 'opbeans-test', + 'logging.level': 'error', + 'queue.mem.events': 2000, + 'queue.mem.flush.timeout': '1s', + 'setup.template.settings.index.number_of_jshards': 1, +}; + +const mockSavaedObectsClient = { + get: () => ({ + attributes: { schemaJson: JSON.stringify(apmServerSchema) }, + }), +} as unknown as SavedObjectsClientContract; + +describe('get_unsupported_apm_server_schema', () => { + describe('getUnsupportedApmServerSchema', () => { + it('should return key-value pairs of unsupported configs', async () => { + const result = await getUnsupportedApmServerSchema({ + savedObjectsClient: mockSavaedObectsClient, + }); + expect(result).toMatchInlineSnapshot(` + Array [ + Object { + "key": "logging.level", + "value": "error", + }, + Object { + "key": "queue.mem.events", + "value": 2000, + }, + Object { + "key": "queue.mem.flush.timeout", + "value": "1s", + }, + Object { + "key": "setup.template.settings.index.number_of_jshards", + "value": 1, + }, + ] + `); + }); + }); +}); diff --git a/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts index 5fec3c94cf7ac..2ced15245b593 100644 --- a/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts +++ b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts @@ -10,7 +10,10 @@ import { APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, APM_SERVER_SCHEMA_SAVED_OBJECT_ID, } from '../../../common/apm_saved_object_constants'; -import { apmConfigMapping } from './get_apm_package_policy_definition'; +import { + apmConfigMapping, + preprocessLegacyFields, +} from './get_apm_package_policy_definition'; export async function getUnsupportedApmServerSchema({ savedObjectsClient, @@ -24,7 +27,10 @@ export async function getUnsupportedApmServerSchema({ const apmServerSchema: Record = JSON.parse( (attributes as { schemaJson: string }).schemaJson ); - return Object.entries(apmServerSchema) + const preprocessedApmServerSchema = preprocessLegacyFields({ + apmServerSchema, + }); + return Object.entries(preprocessedApmServerSchema) .filter(([name]) => !(name in apmConfigMapping)) .map(([key, value]) => ({ key, value })); } diff --git a/x-pack/plugins/apm/server/routes/backends.ts b/x-pack/plugins/apm/server/routes/backends.ts index feb4ca8bb978c..03466c7443665 100644 --- a/x-pack/plugins/apm/server/routes/backends.ts +++ b/x-pack/plugins/apm/server/routes/backends.ts @@ -65,13 +65,14 @@ const topBackendsRoute = createApmServerRoute({ }); const upstreamServicesForBackendRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/backends/{backendName}/upstream_services', + endpoint: 'GET /internal/apm/backends/upstream_services', params: t.intersection([ t.type({ - path: t.type({ - backendName: t.string, - }), - query: t.intersection([rangeRt, t.type({ numBuckets: toNumberRt })]), + query: t.intersection([ + t.type({ backendName: t.string }), + rangeRt, + t.type({ numBuckets: toNumberRt }), + ]), }), t.partial({ query: t.intersection([environmentRt, offsetRt, kueryRt]), @@ -83,8 +84,15 @@ const upstreamServicesForBackendRoute = createApmServerRoute({ handler: async (resources) => { const setup = await setupRequest(resources); const { - path: { backendName }, - query: { environment, offset, numBuckets, kuery, start, end }, + query: { + backendName, + environment, + offset, + numBuckets, + kuery, + start, + end, + }, } = resources.params; const opts = { @@ -121,12 +129,9 @@ const upstreamServicesForBackendRoute = createApmServerRoute({ }); const backendMetadataRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/backends/{backendName}/metadata', + endpoint: 'GET /internal/apm/backends/metadata', params: t.type({ - path: t.type({ - backendName: t.string, - }), - query: rangeRt, + query: t.intersection([t.type({ backendName: t.string }), rangeRt]), }), options: { tags: ['access:apm'], @@ -134,9 +139,8 @@ const backendMetadataRoute = createApmServerRoute({ handler: async (resources) => { const setup = await setupRequest(resources); const { params } = resources; - const { backendName } = params.path; - const { start, end } = params.query; + const { backendName, start, end } = params.query; const metadata = await getMetadataForBackend({ backendName, @@ -150,12 +154,15 @@ const backendMetadataRoute = createApmServerRoute({ }); const backendLatencyChartsRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/backends/{backendName}/charts/latency', + endpoint: 'GET /internal/apm/backends/charts/latency', params: t.type({ - path: t.type({ - backendName: t.string, - }), - query: t.intersection([rangeRt, kueryRt, environmentRt, offsetRt]), + query: t.intersection([ + t.type({ backendName: t.string }), + rangeRt, + kueryRt, + environmentRt, + offsetRt, + ]), }), options: { tags: ['access:apm'], @@ -163,8 +170,8 @@ const backendLatencyChartsRoute = createApmServerRoute({ handler: async (resources) => { const setup = await setupRequest(resources); const { params } = resources; - const { backendName } = params.path; - const { kuery, environment, offset, start, end } = params.query; + const { backendName, kuery, environment, offset, start, end } = + params.query; const [currentTimeseries, comparisonTimeseries] = await Promise.all([ getLatencyChartsForBackend({ @@ -193,12 +200,15 @@ const backendLatencyChartsRoute = createApmServerRoute({ }); const backendThroughputChartsRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/backends/{backendName}/charts/throughput', + endpoint: 'GET /internal/apm/backends/charts/throughput', params: t.type({ - path: t.type({ - backendName: t.string, - }), - query: t.intersection([rangeRt, kueryRt, environmentRt, offsetRt]), + query: t.intersection([ + t.type({ backendName: t.string }), + rangeRt, + kueryRt, + environmentRt, + offsetRt, + ]), }), options: { tags: ['access:apm'], @@ -206,8 +216,8 @@ const backendThroughputChartsRoute = createApmServerRoute({ handler: async (resources) => { const setup = await setupRequest(resources); const { params } = resources; - const { backendName } = params.path; - const { kuery, environment, offset, start, end } = params.query; + const { backendName, kuery, environment, offset, start, end } = + params.query; const [currentTimeseries, comparisonTimeseries] = await Promise.all([ getThroughputChartsForBackend({ @@ -236,12 +246,15 @@ const backendThroughputChartsRoute = createApmServerRoute({ }); const backendFailedTransactionRateChartsRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/backends/{backendName}/charts/error_rate', + endpoint: 'GET /internal/apm/backends/charts/error_rate', params: t.type({ - path: t.type({ - backendName: t.string, - }), - query: t.intersection([rangeRt, kueryRt, environmentRt, offsetRt]), + query: t.intersection([ + t.type({ backendName: t.string }), + rangeRt, + kueryRt, + environmentRt, + offsetRt, + ]), }), options: { tags: ['access:apm'], @@ -249,8 +262,8 @@ const backendFailedTransactionRateChartsRoute = createApmServerRoute({ handler: async (resources) => { const setup = await setupRequest(resources); const { params } = resources; - const { backendName } = params.path; - const { kuery, environment, offset, start, end } = params.query; + const { backendName, kuery, environment, offset, start, end } = + params.query; const [currentTimeseries, comparisonTimeseries] = await Promise.all([ getErrorRateChartsForBackend({ diff --git a/x-pack/plugins/apm/server/routes/errors.ts b/x-pack/plugins/apm/server/routes/errors.ts index 0864276b67fee..3a6e07acd14bc 100644 --- a/x-pack/plugins/apm/server/routes/errors.ts +++ b/x-pack/plugins/apm/server/routes/errors.ts @@ -11,7 +11,12 @@ import { getErrorDistribution } from '../lib/errors/distribution/get_distributio import { getErrorGroupSample } from '../lib/errors/get_error_group_sample'; import { getErrorGroups } from '../lib/errors/get_error_groups'; import { setupRequest } from '../lib/helpers/setup_request'; -import { environmentRt, kueryRt, rangeRt } from './default_api_types'; +import { + environmentRt, + kueryRt, + rangeRt, + comparisonRangeRt, +} from './default_api_types'; import { createApmServerRouteRepository } from './create_apm_server_route_repository'; const errorsRoute = createApmServerRoute({ @@ -94,6 +99,7 @@ const errorDistributionRoute = createApmServerRoute({ environmentRt, kueryRt, rangeRt, + comparisonRangeRt, ]), }), options: { tags: ['access:apm'] }, @@ -101,7 +107,15 @@ const errorDistributionRoute = createApmServerRoute({ const setup = await setupRequest(resources); const { params } = resources; const { serviceName } = params.path; - const { environment, kuery, groupId, start, end } = params.query; + const { + environment, + kuery, + groupId, + start, + end, + comparisonStart, + comparisonEnd, + } = params.query; return getErrorDistribution({ environment, kuery, @@ -110,6 +124,8 @@ const errorDistributionRoute = createApmServerRoute({ setup, start, end, + comparisonStart, + comparisonEnd, }); }, }); diff --git a/x-pack/plugins/apm/server/routes/service_map.ts b/x-pack/plugins/apm/server/routes/service_map.ts index 17fb9d7c98c5f..96b4c1ca2ed93 100644 --- a/x-pack/plugins/apm/server/routes/service_map.ts +++ b/x-pack/plugins/apm/server/routes/service_map.ts @@ -114,12 +114,13 @@ const serviceMapServiceNodeRoute = createApmServerRoute({ }); const serviceMapBackendNodeRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/service-map/backend/{backendName}', + endpoint: 'GET /internal/apm/service-map/backend', params: t.type({ - path: t.type({ - backendName: t.string, - }), - query: t.intersection([environmentRt, rangeRt]), + query: t.intersection([ + t.type({ backendName: t.string }), + environmentRt, + rangeRt, + ]), }), options: { tags: ['access:apm'] }, handler: async (resources) => { @@ -134,8 +135,7 @@ const serviceMapBackendNodeRoute = createApmServerRoute({ const setup = await setupRequest(resources); const { - path: { backendName }, - query: { environment, start, end }, + query: { backendName, environment, start, end }, } = params; return getServiceMapBackendNodeInfo({ diff --git a/x-pack/plugins/apm/server/tutorial/index.ts b/x-pack/plugins/apm/server/tutorial/index.ts index 5caf2b4372483..7bb5454d52176 100644 --- a/x-pack/plugins/apm/server/tutorial/index.ts +++ b/x-pack/plugins/apm/server/tutorial/index.ts @@ -22,7 +22,7 @@ import apmIndexPattern from './index_pattern.json'; const apmIntro = i18n.translate('xpack.apm.tutorial.introduction', { defaultMessage: - 'Collect in-depth performance metrics and errors from inside your applications.', + 'Collect performance metrics from your applications with Elastic APM.', }); const moduleName = 'apm'; diff --git a/x-pack/plugins/canvas/PLUGINS.mdx b/x-pack/plugins/canvas/PLUGINS.mdx index 0f93948d663a0..77fe65f864607 100644 --- a/x-pack/plugins/canvas/PLUGINS.mdx +++ b/x-pack/plugins/canvas/PLUGINS.mdx @@ -222,7 +222,7 @@ Now, let's try out our new server function. You should now see one random number and one "Server Time in ms" value. -> More information about building Kibana Plugins can be found in [src/core](https://github.com/elastic/kibana/blob/master/src/core/README.md) +> More information about building Kibana Plugins can be found in [src/core](https://github.com/elastic/kibana/blob/main/src/core/README.md) ### My Canvas Plugin stopped working diff --git a/x-pack/plugins/canvas/i18n/README.md b/x-pack/plugins/canvas/i18n/README.md index 45459b4191fae..42e088abaa320 100644 --- a/x-pack/plugins/canvas/i18n/README.md +++ b/x-pack/plugins/canvas/i18n/README.md @@ -1,6 +1,6 @@ # Canvas and Internationalization (i18n) -Creating i18n strings in Kibana requires use of the [`@kbn/i18n`](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/GUIDELINE.md) library. The following outlines the strategy for localizing strings in Canvas +Creating i18n strings in Kibana requires use of the [`@kbn/i18n`](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/GUIDELINE.md) library. The following outlines the strategy for localizing strings in Canvas ## Why i18n Dictionaries diff --git a/x-pack/plugins/canvas/public/services/kibana/notify.ts b/x-pack/plugins/canvas/public/services/kibana/notify.ts index 0082b523d050e..1752840127fe1 100644 --- a/x-pack/plugins/canvas/public/services/kibana/notify.ts +++ b/x-pack/plugins/canvas/public/services/kibana/notify.ts @@ -42,7 +42,7 @@ export const notifyServiceFactory: CanvasNotifyServiceFactory = ({ coreStart }) return { /* * @param {(string | Object)} err: message or Error object - * @param {Object} opts: option to override toast title or icon, see https://github.com/elastic/kibana/blob/master/src/legacy/ui/public/notify/toasts/TOAST_NOTIFICATIONS.md + * @param {Object} opts: option to override toast title or icon, see https://github.com/elastic/kibana/blob/main/src/legacy/ui/public/notify/toasts/TOAST_NOTIFICATIONS.md */ error(err, opts) { toasts.addDanger(getToast(err, opts)); diff --git a/x-pack/plugins/canvas/storybook/addon/src/register.tsx b/x-pack/plugins/canvas/storybook/addon/src/register.tsx index 1e99d6bdb74eb..71a3684b171aa 100644 --- a/x-pack/plugins/canvas/storybook/addon/src/register.tsx +++ b/x-pack/plugins/canvas/storybook/addon/src/register.tsx @@ -39,7 +39,7 @@ addons.setConfig({ theme: create({ base: 'light', brandTitle: 'Canvas Storybook', - brandUrl: 'https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas', + brandUrl: 'https://github.com/elastic/kibana/tree/main/x-pack/plugins/canvas', }), showPanel: true, isFullscreen: false, diff --git a/x-pack/plugins/cases/README.md b/x-pack/plugins/cases/README.md index f28926eb52052..a4c3b46ae9973 100644 --- a/x-pack/plugins/cases/README.md +++ b/x-pack/plugins/cases/README.md @@ -167,7 +167,7 @@ UI component: _***Feature in development, disabled by default**_ -See [Kibana Actions](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions) for more information. +See [Kibana Actions](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions) for more information. ID: `.case` diff --git a/x-pack/plugins/cases/common/utils/index.ts b/x-pack/plugins/cases/common/utils/index.ts new file mode 100644 index 0000000000000..072c2b10dc225 --- /dev/null +++ b/x-pack/plugins/cases/common/utils/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './connectors_api'; diff --git a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx index 06a3897687921..c15722a3ec354 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx @@ -120,7 +120,7 @@ describe('AddComment ', () => { }); it('should insert a quote', async () => { - const sampleQuote = 'what a cool quote'; + const sampleQuote = 'what a cool quote \n with new lines'; const ref = React.createRef(); const wrapper = mount( @@ -138,10 +138,40 @@ describe('AddComment ', () => { }); expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe( - `${sampleData.comment}\n\n${sampleQuote}` + `${sampleData.comment}\n\n> what a cool quote \n> with new lines \n\n` ); }); + it('should call onFocus when adding a quote', async () => { + const ref = React.createRef(); + + mount( + + + + ); + + ref.current!.editor!.textarea!.focus = jest.fn(); + await act(async () => { + ref.current!.addQuote('a comment'); + }); + + expect(ref.current!.editor!.textarea!.focus).toHaveBeenCalled(); + }); + + it('should NOT call onFocus on mount', async () => { + const ref = React.createRef(); + + mount( + + + + ); + + ref.current!.editor!.textarea!.focus = jest.fn(); + expect(ref.current!.editor!.textarea!.focus).not.toHaveBeenCalled(); + }); + it('it should insert a timeline', async () => { const useInsertTimelineMock = jest.fn(); let attachTimeline = noop; diff --git a/x-pack/plugins/cases/public/components/add_comment/index.tsx b/x-pack/plugins/cases/public/components/add_comment/index.tsx index f788456a30dff..3ee7c1604b24d 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.tsx @@ -5,14 +5,22 @@ * 2.0. */ +import React, { + useCallback, + useRef, + forwardRef, + useImperativeHandle, + useEffect, + useState, +} from 'react'; import { EuiButton, EuiFlexItem, EuiFlexGroup, EuiLoadingSpinner } from '@elastic/eui'; -import React, { useCallback, useRef, forwardRef, useImperativeHandle } from 'react'; import styled from 'styled-components'; +import { isEmpty } from 'lodash'; import { CommentType } from '../../../common'; import { usePostComment } from '../../containers/use_post_comment'; import { Case } from '../../containers/types'; -import { MarkdownEditorForm } from '../markdown_editor'; +import { EuiMarkdownEditorRef, MarkdownEditorForm } from '../markdown_editor'; import { Form, useForm, UseField, useFormData } from '../../common/shared_imports'; import * as i18n from './translations'; @@ -33,6 +41,7 @@ const initialCommentValue: AddCommentFormSchema = { export interface AddCommentRefObject { addQuote: (quote: string) => void; setComment: (newComment: string) => void; + editor: EuiMarkdownEditorRef | null; } export interface AddCommentProps { @@ -61,7 +70,8 @@ export const AddComment = React.memo( }, ref ) => { - const editorRef = useRef(); + const editorRef = useRef(null); + const [focusOnContext, setFocusOnContext] = useState(false); const owner = useOwnerContext(); const { isLoading, postComment } = usePostComment(); @@ -77,7 +87,10 @@ export const AddComment = React.memo( const addQuote = useCallback( (quote) => { - setFieldValue(fieldName, `${comment}${comment.length > 0 ? '\n\n' : ''}${quote}`); + const addCarrots = quote.replace(new RegExp('\r?\n', 'g'), '\n> '); + const val = `> ${addCarrots} \n\n`; + setFieldValue(fieldName, `${comment}${comment.length > 0 ? '\n\n' : ''}${val}`); + setFocusOnContext(true); }, [comment, setFieldValue] ); @@ -111,6 +124,38 @@ export const AddComment = React.memo( } }, [submit, onCommentSaving, postComment, caseId, owner, onCommentPosted, subCaseId, reset]); + /** + * Focus on the text area when a quote has been added. + * + * The useEffect will run only when focusOnContext + * changes. + * + * The useEffect is also called once one mount + * where the comment is empty. We do not want to focus + * in this scenario. + * + * Ideally we would like to put the + * editorRef.current?.textarea?.focus(); inside the if (focusOnContext). + * The reason this is not feasible is because when it sets the + * focusOnContext to false a render will occur again and the + * focus will be lost. + * + * We do not put the comment in the dependency list + * because we do not want to focus when the user + * is typing. + */ + + useEffect(() => { + if (!isEmpty(comment)) { + editorRef.current?.textarea?.focus(); + } + + if (focusOnContext) { + setFocusOnContext(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [focusOnContext]); + return ( {isLoading && showLoading && } diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx index 9cbb13f7227a3..4a4e31230030e 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_generic.tsx @@ -28,7 +28,7 @@ import { useGetActionLicense } from '../../containers/use_get_action_license'; import { useGetCases } from '../../containers/use_get_cases'; import { usePostComment } from '../../containers/use_post_comment'; import { CaseDetailsHrefSchema, CasesNavigation } from '../links'; -import { Panel } from '../panel'; + import { getActionLicenseError } from '../use_push_to_service/helpers'; import { useCasesColumns } from './columns'; import { getExpandedRowMap } from './expanded_row'; @@ -240,8 +240,6 @@ export const AllCasesGeneric = React.memo( const isCasesLoading = useMemo(() => loading.indexOf('cases') > -1, [loading]); const isDataEmpty = useMemo(() => data.total === 0, [data]); - const TableWrap = useMemo(() => (isSelectorView ? 'span' : Panel), [isSelectorView]); - const tableRowProps = useCallback( (theCase: Case) => { const onTableRowClick = memoize(async () => { @@ -289,48 +287,43 @@ export const AllCasesGeneric = React.memo( className="essentialAnimation" $isShow={(isCasesLoading || isLoading || isCommentUpdating) && !isDataEmpty} /> - - - - + + ); } diff --git a/x-pack/plugins/cases/public/components/all_cases/header.tsx b/x-pack/plugins/cases/public/components/all_cases/header.tsx index 862f4a72c8cb5..b2e5dafe061cf 100644 --- a/x-pack/plugins/cases/public/components/all_cases/header.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/header.tsx @@ -49,7 +49,7 @@ export const CasesTableHeader: FunctionComponent = ({ showTitle = true, userCanCrud, }) => ( - + {userCanCrud ? ( <> diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx index 4e0f1689bd4d1..9bbddfae2f9bd 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx @@ -123,11 +123,11 @@ describe('Connectors', () => { ).toBe('Update My Connector'); }); - test('it shows the deprecated callout when the connector is legacy', async () => { + test('it shows the deprecated callout when the connector is deprecated', async () => { render( , { // wrapper: TestProviders produces a TS error diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx index 1b575e3ba9334..b7bf7c322f76e 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx @@ -23,7 +23,7 @@ import { ActionConnector, CaseConnectorMapping } from '../../containers/configur import { Mapping } from './mapping'; import { ActionTypeConnector, ConnectorTypes } from '../../../common'; import { DeprecatedCallout } from '../connectors/deprecated_callout'; -import { isLegacyConnector } from '../utils'; +import { isDeprecatedConnector } from '../utils'; const EuiFormRowExtended = styled(EuiFormRow)` .euiFormRow__labelWrapper { @@ -111,7 +111,7 @@ const ConnectorsComponent: React.FC = ({ appendAddConnectorButton={true} /> - {selectedConnector.type !== ConnectorTypes.none && isLegacyConnector(connector) && ( + {selectedConnector.type !== ConnectorTypes.none && isDeprecatedConnector(connector) && ( diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx index 6f05f9f940d25..03ed3d6512638 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx @@ -171,7 +171,7 @@ describe('ConnectorsDropdown', () => { "value": "servicenow-sir", }, Object { - "data-test-subj": "dropdown-connector-servicenow-legacy", + "data-test-subj": "dropdown-connector-servicenow-uses-table-api", "inputDisplay": { /> , - "value": "servicenow-legacy", + "value": "servicenow-uses-table-api", }, ] `); @@ -288,8 +288,8 @@ describe('ConnectorsDropdown', () => { ).not.toThrowError(); }); - test('it shows the deprecated tooltip when the connector is legacy', () => { - render(, { + test('it shows the deprecated tooltip when the connector is deprecated', () => { + render(, { wrapper: ({ children }) => {children}, }); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx index c5fe9c7470745..c7ce3c5b3c4b6 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx @@ -13,7 +13,7 @@ import { ConnectorTypes } from '../../../common'; import { ActionConnector } from '../../containers/configure/types'; import * as i18n from './translations'; import { useKibana } from '../../common/lib/kibana'; -import { getConnectorIcon, isLegacyConnector } from '../utils'; +import { getConnectorIcon, isDeprecatedConnector } from '../utils'; import { euiStyled } from '../../../../../../src/plugins/kibana_react/common'; export interface Props { @@ -95,10 +95,10 @@ const ConnectorsDropdownComponent: React.FC = ({ {connector.name} - {isLegacyConnector(connector) && ` (${i18n.DEPRECATED_TOOLTIP_TEXT})`} + {isDeprecatedConnector(connector) && ` (${i18n.DEPRECATED_TOOLTIP_TEXT})`} - {isLegacyConnector(connector) && ( + {isDeprecatedConnector(connector) && ( { }); }); -describe('closure options', () => { +// Failing: See https://github.com/elastic/kibana/issues/115366 +describe.skip('closure options', () => { let wrapper: ReactWrapper; let persistCaseConfigure: jest.Mock; diff --git a/x-pack/plugins/cases/public/components/connectors/deprecated_callout.test.tsx b/x-pack/plugins/cases/public/components/connectors/deprecated_callout.test.tsx index 367609df3c887..690a9331c568f 100644 --- a/x-pack/plugins/cases/public/components/connectors/deprecated_callout.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/deprecated_callout.test.tsx @@ -14,14 +14,14 @@ describe('DeprecatedCallout', () => { render(); expect(screen.getByText('This connector type is deprecated')).toBeInTheDocument(); expect(screen.getByText('Update this connector, or create a new one.')).toBeInTheDocument(); - expect(screen.getByTestId('legacy-connector-warning-callout')).toHaveClass( + expect(screen.getByTestId('deprecated-connector-warning-callout')).toHaveClass( 'euiCallOut euiCallOut--warning' ); }); test('it renders a danger flyout correctly', () => { render(); - expect(screen.getByTestId('legacy-connector-warning-callout')).toHaveClass( + expect(screen.getByTestId('deprecated-connector-warning-callout')).toHaveClass( 'euiCallOut euiCallOut--danger' ); }); diff --git a/x-pack/plugins/cases/public/components/connectors/deprecated_callout.tsx b/x-pack/plugins/cases/public/components/connectors/deprecated_callout.tsx index 9337f2843506b..195b2deb84d6e 100644 --- a/x-pack/plugins/cases/public/components/connectors/deprecated_callout.tsx +++ b/x-pack/plugins/cases/public/components/connectors/deprecated_callout.tsx @@ -9,15 +9,15 @@ import React from 'react'; import { EuiCallOut, EuiCallOutProps } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -const LEGACY_CONNECTOR_WARNING_TITLE = i18n.translate( - 'xpack.cases.connectors.serviceNow.legacyConnectorWarningTitle', +const DEPRECATED_CONNECTOR_WARNING_TITLE = i18n.translate( + 'xpack.cases.connectors.serviceNow.deprecatedConnectorWarningTitle', { defaultMessage: 'This connector type is deprecated', } ); -const LEGACY_CONNECTOR_WARNING_DESC = i18n.translate( - 'xpack.cases.connectors.serviceNow.legacyConnectorWarningDesc', +const DEPRECATED_CONNECTOR_WARNING_DESC = i18n.translate( + 'xpack.cases.connectors.serviceNow.deprecatedConnectorWarningDesc', { defaultMessage: 'Update this connector, or create a new one.', } @@ -29,12 +29,12 @@ interface Props { const DeprecatedCalloutComponent: React.FC = ({ type = 'warning' }) => ( - {LEGACY_CONNECTOR_WARNING_DESC} + {DEPRECATED_CONNECTOR_WARNING_DESC} ); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts b/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts index af4883ab4ba96..593e5fa5497f5 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/api.test.ts @@ -74,13 +74,33 @@ const fieldsResponse = { }, }; -const issueResponse = { +const issue = { id: '10267', key: 'RJ-107', - fields: { summary: 'Test title' }, + title: 'test title', +}; + +const issueResponse = { + status: 'ok' as const, + connector_id: '1', + data: issue, +}; + +const issuesResponse = { + ...issueResponse, + data: [issue], }; -const issuesResponse = [issueResponse]; +const camelCasedIssueResponse = { + status: 'ok' as const, + actionId: '1', + data: issue, +}; + +const camelCasedIssuesResponse = { + ...camelCasedIssueResponse, + data: [issue], +}; describe('Jira API', () => { const http = httpServiceMock.createStartContract(); @@ -131,7 +151,7 @@ describe('Jira API', () => { title: 'test issue', }); - expect(res).toEqual(issuesResponse); + expect(res).toEqual(camelCasedIssuesResponse); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/test/_execute', { body: '{"params":{"subAction":"issues","subActionParams":{"title":"test issue"}}}', signal: abortCtrl.signal, @@ -142,7 +162,7 @@ describe('Jira API', () => { describe('getIssue', () => { test('should call get fields API', async () => { const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(issuesResponse); + http.post.mockResolvedValueOnce(issueResponse); const res = await getIssue({ http, signal: abortCtrl.signal, @@ -150,7 +170,7 @@ describe('Jira API', () => { id: 'RJ-107', }); - expect(res).toEqual(issuesResponse); + expect(res).toEqual(camelCasedIssueResponse); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/test/_execute', { body: '{"params":{"subAction":"issue","subActionParams":{"id":"RJ-107"}}}', signal: abortCtrl.signal, diff --git a/x-pack/plugins/cases/public/components/connectors/jira/api.ts b/x-pack/plugins/cases/public/components/connectors/jira/api.ts index 109d8a6794c54..b4bbec156f04d 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/api.ts +++ b/x-pack/plugins/cases/public/components/connectors/jira/api.ts @@ -7,7 +7,11 @@ import { HttpSetup } from 'kibana/public'; import { ActionTypeExecutorResult } from '../../../../../actions/common'; -import { getExecuteConnectorUrl } from '../../../../common/utils/connectors_api'; +import { getExecuteConnectorUrl } from '../../../../common/utils'; +import { + ConnectorExecutorResult, + rewriteResponseToCamelCase, +} from '../rewrite_response_to_camel_case'; import { IssueTypes, Fields, Issues, Issue } from './types'; export interface GetIssueTypesProps { @@ -17,12 +21,17 @@ export interface GetIssueTypesProps { } export async function getIssueTypes({ http, signal, connectorId }: GetIssueTypesProps) { - return http.post>(getExecuteConnectorUrl(connectorId), { - body: JSON.stringify({ - params: { subAction: 'issueTypes', subActionParams: {} }, - }), - signal, - }); + const res = await http.post>( + getExecuteConnectorUrl(connectorId), + { + body: JSON.stringify({ + params: { subAction: 'issueTypes', subActionParams: {} }, + }), + signal, + } + ); + + return rewriteResponseToCamelCase(res); } export interface GetFieldsByIssueTypeProps { @@ -38,12 +47,16 @@ export async function getFieldsByIssueType({ connectorId, id, }: GetFieldsByIssueTypeProps): Promise> { - return http.post(getExecuteConnectorUrl(connectorId), { - body: JSON.stringify({ - params: { subAction: 'fieldsByIssueType', subActionParams: { id } }, - }), - signal, - }); + const res = await http.post>( + getExecuteConnectorUrl(connectorId), + { + body: JSON.stringify({ + params: { subAction: 'fieldsByIssueType', subActionParams: { id } }, + }), + signal, + } + ); + return rewriteResponseToCamelCase(res); } export interface GetIssuesTypeProps { @@ -59,12 +72,16 @@ export async function getIssues({ connectorId, title, }: GetIssuesTypeProps): Promise> { - return http.post(getExecuteConnectorUrl(connectorId), { - body: JSON.stringify({ - params: { subAction: 'issues', subActionParams: { title } }, - }), - signal, - }); + const res = await http.post>( + getExecuteConnectorUrl(connectorId), + { + body: JSON.stringify({ + params: { subAction: 'issues', subActionParams: { title } }, + }), + signal, + } + ); + return rewriteResponseToCamelCase(res); } export interface GetIssueTypeProps { @@ -80,10 +97,11 @@ export async function getIssue({ connectorId, id, }: GetIssueTypeProps): Promise> { - return http.post(getExecuteConnectorUrl(connectorId), { + const res = await http.post>(getExecuteConnectorUrl(connectorId), { body: JSON.stringify({ params: { subAction: 'issue', subActionParams: { id } }, }), signal, }); + return rewriteResponseToCamelCase(res); } diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx index 686df1022a0d7..d762c9d3aaf20 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_fields_by_issue_type.tsx @@ -6,7 +6,7 @@ */ import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../common'; import { getFieldsByIssueType } from './api'; import { Fields } from './types'; @@ -14,10 +14,7 @@ import * as i18n from './translations'; interface Props { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; issueType: string | null; connector?: ActionConnector; } diff --git a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx index 0d7073f3bf2d4..6f409f1ddef8d 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/use_get_issue_types.tsx @@ -6,7 +6,7 @@ */ import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../common'; import { getIssueTypes } from './api'; import { IssueTypes } from './types'; @@ -14,10 +14,7 @@ import * as i18n from './translations'; interface Props { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; connector?: ActionConnector; handleIssueType: (options: Array<{ value: string; text: string }>) => void; } diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/api.ts b/x-pack/plugins/cases/public/components/connectors/resilient/api.ts index 301d29866d302..6d803b6fbe542 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/api.ts +++ b/x-pack/plugins/cases/public/components/connectors/resilient/api.ts @@ -6,8 +6,11 @@ */ import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../actions/common'; import { getExecuteConnectorUrl } from '../../../../common/utils/connectors_api'; +import { + ConnectorExecutorResult, + rewriteResponseToCamelCase, +} from '../rewrite_response_to_camel_case'; import { ResilientIncidentTypes, ResilientSeverity } from './types'; export const BASE_ACTION_API_PATH = '/api/actions'; @@ -19,7 +22,7 @@ export interface Props { } export async function getIncidentTypes({ http, signal, connectorId }: Props) { - return http.post>( + const res = await http.post>( getExecuteConnectorUrl(connectorId), { body: JSON.stringify({ @@ -28,10 +31,12 @@ export async function getIncidentTypes({ http, signal, connectorId }: Props) { signal, } ); + + return rewriteResponseToCamelCase(res); } export async function getSeverity({ http, signal, connectorId }: Props) { - return http.post>( + const res = await http.post>( getExecuteConnectorUrl(connectorId), { body: JSON.stringify({ @@ -40,4 +45,6 @@ export async function getSeverity({ http, signal, connectorId }: Props) { signal, } ); + + return rewriteResponseToCamelCase(res); } diff --git a/x-pack/plugins/cases/public/components/connectors/rewrite_response_to_camel_case.test.ts b/x-pack/plugins/cases/public/components/connectors/rewrite_response_to_camel_case.test.ts new file mode 100644 index 0000000000000..28f901076759b --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/rewrite_response_to_camel_case.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ConnectorExecutorResult, + rewriteResponseToCamelCase, +} from './rewrite_response_to_camel_case'; + +const responseWithSnakeCasedFields: ConnectorExecutorResult<{}> = { + service_message: 'oh noooooo', + connector_id: '1213', + data: {}, + status: 'ok', +}; + +describe('rewriteResponseToCamelCase works correctly', () => { + it('correctly transforms snake case to camel case for ActionTypeExecuteResults', () => { + const camelCasedData = rewriteResponseToCamelCase(responseWithSnakeCasedFields); + + expect(camelCasedData).toEqual({ + serviceMessage: 'oh noooooo', + actionId: '1213', + data: {}, + status: 'ok', + }); + }); +}); diff --git a/x-pack/plugins/cases/public/components/connectors/rewrite_response_to_camel_case.ts b/x-pack/plugins/cases/public/components/connectors/rewrite_response_to_camel_case.ts new file mode 100644 index 0000000000000..e73488257d9d2 --- /dev/null +++ b/x-pack/plugins/cases/public/components/connectors/rewrite_response_to_camel_case.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ActionTypeExecutorResult, RewriteResponseCase } from '../../../../actions/common'; + +export type ConnectorExecutorResult = ReturnType< + RewriteResponseCase> +>; + +export const rewriteResponseToCamelCase = ({ + connector_id: actionId, + service_message: serviceMessage, + ...data +}: ConnectorExecutorResult): ActionTypeExecutorResult => ({ + ...data, + actionId, + ...(serviceMessage && { serviceMessage }), +}); diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts index 3d9211caa9b9a..de3ea1f16c359 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/api.ts @@ -6,8 +6,11 @@ */ import { HttpSetup } from 'kibana/public'; -import { ActionTypeExecutorResult } from '../../../../../actions/common'; import { getExecuteConnectorUrl } from '../../../../common/utils/connectors_api'; +import { + ConnectorExecutorResult, + rewriteResponseToCamelCase, +} from '../rewrite_response_to_camel_case'; import { Choice } from './types'; export const BASE_ACTION_API_PATH = '/api/actions'; @@ -20,10 +23,14 @@ export interface GetChoicesProps { } export async function getChoices({ http, signal, connectorId, fields }: GetChoicesProps) { - return http.post>(getExecuteConnectorUrl(connectorId), { - body: JSON.stringify({ - params: { subAction: 'getChoices', subActionParams: { fields } }, - }), - signal, - }); + const res = await http.post>( + getExecuteConnectorUrl(connectorId), + { + body: JSON.stringify({ + params: { subAction: 'getChoices', subActionParams: { fields } }, + }), + signal, + } + ); + return rewriteResponseToCamelCase(res); } diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx index 008340b6b7e97..324dcef8ba397 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.test.tsx @@ -127,15 +127,15 @@ describe('ServiceNowITSM Fields', () => { ); }); - test('it shows the deprecated callout when the connector is legacy', async () => { - const legacyConnector = { ...connector, config: { isLegacy: true } }; - render(); - expect(screen.getByTestId('legacy-connector-warning-callout')).toBeInTheDocument(); + test('it shows the deprecated callout when the connector uses the table API', async () => { + const tableApiConnector = { ...connector, config: { usesTableApi: true } }; + render(); + expect(screen.getByTestId('deprecated-connector-warning-callout')).toBeInTheDocument(); }); - test('it does not show the deprecated callout when the connector is not legacy', async () => { + test('it does not show the deprecated callout when the connector does not uses the table API', async () => { render(); - expect(screen.queryByTestId('legacy-connector-warning-callout')).not.toBeInTheDocument(); + expect(screen.queryByTestId('deprecated-connector-warning-callout')).not.toBeInTheDocument(); }); describe('onChange calls', () => { diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx index aac78b8266fb5..cd8f5f4abf7b5 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_sir_case_fields.test.tsx @@ -161,15 +161,15 @@ describe('ServiceNowSIR Fields', () => { ]); }); - test('it shows the deprecated callout when the connector is legacy', async () => { - const legacyConnector = { ...connector, config: { isLegacy: true } }; - render(); - expect(screen.getByTestId('legacy-connector-warning-callout')).toBeInTheDocument(); + test('it shows the deprecated callout when the connector uses the table API', async () => { + const tableApiConnector = { ...connector, config: { usesTableApi: true } }; + render(); + expect(screen.getByTestId('deprecated-connector-warning-callout')).toBeInTheDocument(); }); - test('it does not show the deprecated callout when the connector is not legacy', async () => { + test('it does not show the deprecated callout when the connector does not uses the table API', async () => { render(); - expect(screen.queryByTestId('legacy-connector-warning-callout')).not.toBeInTheDocument(); + expect(screen.queryByTestId('deprecated-connector-warning-callout')).not.toBeInTheDocument(); }); describe('onChange calls', () => { diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx index 4edf740a60011..2c6181dd08eb1 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/use_get_choices.tsx @@ -6,7 +6,7 @@ */ import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../common'; import { getChoices } from './api'; import { Choice } from './types'; @@ -14,10 +14,7 @@ import * as i18n from './translations'; export interface UseGetChoicesProps { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; connector?: ActionConnector; fields: string[]; onSuccess?: (choices: Choice[]) => void; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/validator.test.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/validator.test.ts index c098d803276bc..aa643191ac62e 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/validator.test.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/validator.test.ts @@ -10,24 +10,24 @@ import { connectorValidator } from './validator'; describe('ServiceNow validator', () => { describe('connectorValidator', () => { - test('it returns an error message if the connector is legacy', () => { + test('it returns an error message if the connector uses the table API', () => { const invalidConnector = { ...connector, config: { ...connector.config, - isLegacy: true, + usesTableApi: true, }, }; expect(connectorValidator(invalidConnector)).toEqual({ message: 'Deprecated connector' }); }); - test('it does not returns an error message if the connector is not legacy', () => { + test('it does not returns an error message if the connector does not uses the table API', () => { const invalidConnector = { ...connector, config: { ...connector.config, - isLegacy: false, + usesTableApi: false, }, }; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/validator.ts b/x-pack/plugins/cases/public/components/connectors/servicenow/validator.ts index 3f67f25549343..7d56163c48350 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/validator.ts +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/validator.ts @@ -9,16 +9,16 @@ import { ValidationConfig } from '../../../common/shared_imports'; import { CaseActionConnector } from '../../types'; /** - * The user can not use a legacy connector + * The user can not create cases with connectors that use the table API */ export const connectorValidator = ( connector: CaseActionConnector ): ReturnType => { const { - config: { isLegacy }, + config: { usesTableApi }, } = connector; - if (isLegacy) { + if (usesTableApi) { return { message: 'Deprecated connector', }; diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx index f2351a2b2d793..4bf25b23403e1 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editor.tsx @@ -37,7 +37,7 @@ interface MarkdownEditorProps { value: string; } -type EuiMarkdownEditorRef = ElementRef; +export type EuiMarkdownEditorRef = ElementRef; export interface MarkdownEditorRef { textarea: HTMLTextAreaElement | null; diff --git a/x-pack/plugins/cases/public/components/panel/index.test.tsx b/x-pack/plugins/cases/public/components/panel/index.test.tsx deleted file mode 100644 index 81c80158ae577..0000000000000 --- a/x-pack/plugins/cases/public/components/panel/index.test.tsx +++ /dev/null @@ -1,17 +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 { mount } from 'enzyme'; -import { Panel } from '.'; -import React from 'react'; - -describe('Panel', () => { - test('it does not have the boolean loading as a Eui Property', () => { - const wrapper = mount(); - expect(Object.keys(wrapper.find('EuiPanel').props())).not.toContain('loading'); - }); -}); diff --git a/x-pack/plugins/cases/public/components/panel/index.tsx b/x-pack/plugins/cases/public/components/panel/index.tsx deleted file mode 100644 index 802fd4c7f44a6..0000000000000 --- a/x-pack/plugins/cases/public/components/panel/index.tsx +++ /dev/null @@ -1,37 +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 styled from 'styled-components'; -import React from 'react'; -import { EuiPanel } from '@elastic/eui'; - -/** - * The reason for the type of syntax below of: - * `styled(({ loading, ...props })` - * is filter out the "loading" attribute from being put on the DOM - * and getting one of the stack traces from - * ``` - * ReactJS about non-standard HTML such as this one: - * Warning: Received `true` for a non-boolean attribute `loading`. - * If you want to write it to the DOM, pass a string instead: loading="true" or loading={value.toString()}. - * ``` - * - * Ref: https://github.com/styled-components/styled-components/issues/1198#issuecomment-425650423 - * Ref: https://github.com/elastic/kibana/pull/41596#issuecomment-514418978 - * Ref: https://www.styled-components.com/docs/faqs#why-am-i-getting-html-attribute-warnings - * Ref: https://reactjs.org/blog/2017/09/08/dom-attributes-in-react-16.html - */ -export const Panel = styled(({ loading, ...props }) => )` - position: relative; - ${({ loading }) => - loading && - ` - overflow: hidden; - `} -`; - -Panel.displayName = 'Panel'; diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx index dd5c993939b82..5241b0e66fb38 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.test.tsx @@ -348,7 +348,7 @@ describe(`UserActionTree`, () => { .first() .simulate('click'); await waitFor(() => { - expect(setFieldValue).toBeCalledWith('comment', `> ${props.data.description} \n`); + expect(setFieldValue).toBeCalledWith('comment', `> ${props.data.description} \n\n`); }); }); diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx index 7ea415324194c..92640a34548e8 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx @@ -226,10 +226,8 @@ export const UserActionTree = React.memo( const handleManageQuote = useCallback( (quote: string) => { - const addCarrots = quote.replace(new RegExp('\r?\n', 'g'), ' \n> '); - if (commentRefs.current[NEW_ID]) { - commentRefs.current[NEW_ID].addQuote(`> ${addCarrots} \n`); + commentRefs.current[NEW_ID].addQuote(quote); } handleOutlineComment('add-comment'); diff --git a/x-pack/plugins/cases/public/components/utils.test.ts b/x-pack/plugins/cases/public/components/utils.test.ts index 496dc8d8c8066..86d37d2e5e59e 100644 --- a/x-pack/plugins/cases/public/components/utils.test.ts +++ b/x-pack/plugins/cases/public/components/utils.test.ts @@ -7,7 +7,7 @@ import { actionTypeRegistryMock } from '../../../triggers_actions_ui/public/application/action_type_registry.mock'; import { triggersActionsUiMock } from '../../../triggers_actions_ui/public/mocks'; -import { getConnectorIcon } from './utils'; +import { getConnectorIcon, isDeprecatedConnector } from './utils'; describe('Utils', () => { describe('getConnectorIcon', () => { @@ -37,4 +37,10 @@ describe('Utils', () => { expect(getConnectorIcon(mockTriggersActionsUiService, '.not-registered')).toBe(''); }); }); + + describe('isDeprecatedConnector', () => { + it('returns false if the connector is not defined', () => { + expect(isDeprecatedConnector()).toBe(false); + }); + }); }); diff --git a/x-pack/plugins/cases/public/components/utils.ts b/x-pack/plugins/cases/public/components/utils.ts index ac5f4dbdd298e..3ac48135edae8 100644 --- a/x-pack/plugins/cases/public/components/utils.ts +++ b/x-pack/plugins/cases/public/components/utils.ts @@ -78,9 +78,9 @@ export const getConnectorIcon = ( }; // TODO: Remove when the applications are certified -export const isLegacyConnector = (connector?: CaseActionConnector) => { +export const isDeprecatedConnector = (connector?: CaseActionConnector): boolean => { if (connector == null) { - return true; + return false; } if (!ENABLE_NEW_SN_ITSM_CONNECTOR && connector.actionTypeId === '.servicenow') { @@ -91,5 +91,16 @@ export const isLegacyConnector = (connector?: CaseActionConnector) => { return true; } - return connector.config.isLegacy; + /** + * Connector's prior to the Elastic ServiceNow application + * use the Table API (https://developer.servicenow.com/dev.do#!/reference/api/rome/rest/c_TableAPI) + * Connectors after the Elastic ServiceNow application use the + * Import Set API (https://developer.servicenow.com/dev.do#!/reference/api/rome/rest/c_ImportSetAPI) + * A ServiceNow connector is considered deprecated if it uses the Table API. + * + * All other connectors do not have the usesTableApi config property + * so the function will always return false for them. + */ + + return !!connector.config.usesTableApi; }; diff --git a/x-pack/plugins/cases/public/containers/configure/mock.ts b/x-pack/plugins/cases/public/containers/configure/mock.ts index d1ae7f310a719..a5483e524e92d 100644 --- a/x-pack/plugins/cases/public/containers/configure/mock.ts +++ b/x-pack/plugins/cases/public/containers/configure/mock.ts @@ -72,12 +72,12 @@ export const connectorsMock: ActionConnector[] = [ isPreconfigured: false, }, { - id: 'servicenow-legacy', + id: 'servicenow-uses-table-api', actionTypeId: '.servicenow', name: 'My Connector', config: { apiUrl: 'https://instance1.service-now.com', - isLegacy: true, + usesTableApi: true, }, isPreconfigured: false, }, diff --git a/x-pack/plugins/code/server/plugin.test.ts b/x-pack/plugins/code/server/plugin.test.ts index 512658ca4da82..f2963d416409b 100644 --- a/x-pack/plugins/code/server/plugin.test.ts +++ b/x-pack/plugins/code/server/plugin.test.ts @@ -5,19 +5,37 @@ * 2.0. */ +import type { RegisterDeprecationsConfig, GetDeprecationsContext } from 'src/core/server'; import { coreMock } from '../../../../src/core/server/mocks'; import { CodePlugin } from './plugin'; describe('Code Plugin', () => { + let deprecationConfigs: RegisterDeprecationsConfig[]; + + beforeEach(() => { + deprecationConfigs = []; + }); + + const getDeprecationContextMock = () => ({} as GetDeprecationsContext); + describe('setup()', () => { it('does not log deprecation message if no xpack.code.* configurations are set', async () => { const context = coreMock.createPluginInitializerContext(); const plugin = new CodePlugin(context); - await plugin.setup(); + const coreSetup = coreMock.createSetup(); + coreSetup.deprecations.registerDeprecations.mockImplementation((deprecationConfig) => { + deprecationConfigs.push(deprecationConfig); + }); + + await plugin.setup(coreSetup); - expect(context.logger.get).not.toHaveBeenCalled(); + expect(coreSetup.deprecations.registerDeprecations).toHaveBeenCalledTimes(1); + expect(deprecationConfigs).toHaveLength(1); + + const deprecations = await deprecationConfigs[0].getDeprecations(getDeprecationContextMock()); + expect(deprecations).toHaveLength(0); }); it('logs deprecation message if any xpack.code.* configurations are set', async () => { @@ -28,12 +46,28 @@ describe('Code Plugin', () => { context.logger.get = jest.fn().mockReturnValue({ warn }); const plugin = new CodePlugin(context); - await plugin.setup(); + const coreSetup = coreMock.createSetup(); + coreSetup.deprecations.registerDeprecations.mockImplementation((deprecationConfig) => { + deprecationConfigs.push(deprecationConfig); + }); + + await plugin.setup(coreSetup); - expect(context.logger.get).toHaveBeenCalledWith('config', 'deprecation'); - expect(warn.mock.calls[0][0]).toMatchInlineSnapshot( - `"The experimental app \\"Code\\" has been removed from Kibana. Remove all xpack.code.* configurations from kibana.yml so Kibana does not fail to start up in the next major version."` - ); + expect(coreSetup.deprecations.registerDeprecations).toHaveBeenCalledTimes(1); + expect(deprecationConfigs).toHaveLength(1); + + const deprecations = await deprecationConfigs[0].getDeprecations(getDeprecationContextMock()); + expect(deprecations).toHaveLength(1); + expect(deprecations[0]).toEqual({ + level: 'critical', + deprecationType: 'feature', + title: expect.any(String), + message: expect.any(String), + requireRestart: true, + correctiveActions: expect.objectContaining({ + manualSteps: expect.any(Array), + }), + }); }); }); }); diff --git a/x-pack/plugins/code/server/plugin.ts b/x-pack/plugins/code/server/plugin.ts index eb7481d12387d..183cce69d057b 100644 --- a/x-pack/plugins/code/server/plugin.ts +++ b/x-pack/plugins/code/server/plugin.ts @@ -5,8 +5,9 @@ * 2.0. */ +import { i18n } from '@kbn/i18n'; import { TypeOf } from '@kbn/config-schema'; -import { PluginInitializerContext, Plugin } from 'src/core/server'; +import { PluginInitializerContext, Plugin, CoreSetup, DeprecationsDetails } from 'src/core/server'; import { CodeConfigSchema } from './config'; /** @@ -15,17 +16,37 @@ import { CodeConfigSchema } from './config'; export class CodePlugin implements Plugin { constructor(private readonly initializerContext: PluginInitializerContext) {} - public async setup() { + public async setup(core: CoreSetup) { const config = this.initializerContext.config.get>(); - if (config && Object.keys(config).length > 0) { - this.initializerContext.logger - .get('config', 'deprecation') - .warn( - 'The experimental app "Code" has been removed from Kibana. Remove all xpack.code.* ' + - 'configurations from kibana.yml so Kibana does not fail to start up in the next major version.' - ); - } + core.deprecations.registerDeprecations({ + getDeprecations: (context) => { + const deprecations: DeprecationsDetails[] = []; + if (config && Object.keys(config).length > 0) { + deprecations.push({ + level: 'critical', + deprecationType: 'feature', + title: i18n.translate('xpack.code.deprecations.removed.title', { + defaultMessage: 'The experimental plugin "Code" has been removed from Kibana', + }), + message: i18n.translate('xpack.code.deprecations.removed.message', { + defaultMessage: + 'The experimental plugin "Code" has been removed from Kibana. The associated configuration ' + + 'properties need to be removed from the Kibana configuration file.', + }), + requireRestart: true, + correctiveActions: { + manualSteps: [ + i18n.translate('xpack.code.deprecations.removed.manualSteps1', { + defaultMessage: 'Remove all xpack.code.* properties from the Kibana config file.', + }), + ], + }, + }); + } + return deprecations; + }, + }); } public start() {} diff --git a/x-pack/plugins/data_enhanced/kibana.json b/x-pack/plugins/data_enhanced/kibana.json index d678921e9ac7b..d89e76013ebd4 100644 --- a/x-pack/plugins/data_enhanced/kibana.json +++ b/x-pack/plugins/data_enhanced/kibana.json @@ -8,7 +8,15 @@ "githubTeam": "kibana-app-services" }, "configPath": ["xpack", "data_enhanced"], - "requiredPlugins": ["bfetch", "data", "features", "management", "share", "taskManager"], + "requiredPlugins": [ + "bfetch", + "data", + "features", + "management", + "share", + "taskManager", + "screenshotMode" + ], "optionalPlugins": ["kibanaUtils", "usageCollection", "security"], "server": true, "ui": true, diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts index f26c1e8d0b62b..6ec645c932e05 100644 --- a/x-pack/plugins/data_enhanced/public/plugin.ts +++ b/x-pack/plugins/data_enhanced/public/plugin.ts @@ -22,6 +22,7 @@ import { toMountPoint } from '../../../../src/plugins/kibana_react/public'; import { createConnectedSearchSessionIndicator } from './search'; import { ConfigSchema } from '../config'; import { Storage } from '../../../../src/plugins/kibana_utils/public'; +import { ScreenshotModePluginStart } from '../../../../src/plugins/screenshot_mode/public'; export interface DataEnhancedSetupDependencies { bfetch: BfetchPublicSetup; @@ -31,6 +32,7 @@ export interface DataEnhancedSetupDependencies { export interface DataEnhancedStartDependencies { data: DataPublicPluginStart; share: SharePluginStart; + screenshotMode: ScreenshotModePluginStart; } export type DataEnhancedSetup = ReturnType; @@ -77,6 +79,7 @@ export class DataEnhancedPlugin .duration(this.config.search.sessions.notTouchedTimeout) .asMilliseconds(), usageCollector: this.usageCollector, + tourDisabled: plugins.screenshotMode.isScreenshotMode(), }) ) ), diff --git a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.test.tsx b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.test.tsx index 893f352b5d828..2fcdd8a7a6745 100644 --- a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.test.tsx +++ b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.test.tsx @@ -39,6 +39,7 @@ timeFilter.getRefreshIntervalUpdate$.mockImplementation(() => refreshInterval$); timeFilter.getRefreshInterval.mockImplementation(() => refreshInterval$.getValue()); const disableSaveAfterSessionCompletesTimeout = 5 * 60 * 1000; +const tourDisabled = false; function Container({ children }: { children?: ReactNode }) { return {children}; @@ -64,6 +65,7 @@ test("shouldn't show indicator in case no active search session", async () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const { getByTestId, container } = render( @@ -92,6 +94,7 @@ test("shouldn't show indicator in case app hasn't opt-in", async () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const { getByTestId, container } = render( @@ -122,6 +125,7 @@ test('should show indicator in case there is an active search session', async () disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const { getByTestId } = render( @@ -147,6 +151,7 @@ test('should be disabled in case uiConfig says so ', async () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); render( @@ -170,6 +175,7 @@ test('should be disabled in case not enough permissions', async () => { storage, disableSaveAfterSessionCompletesTimeout, basePath, + tourDisabled, }); render( @@ -203,6 +209,7 @@ describe('Completed inactivity', () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); render( @@ -264,6 +271,7 @@ describe('tour steps', () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const rendered = render( @@ -305,6 +313,7 @@ describe('tour steps', () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const rendered = render( @@ -329,6 +338,51 @@ describe('tour steps', () => { expect(usageCollector.trackSessionIndicatorTourLoading).toHaveBeenCalledTimes(0); expect(usageCollector.trackSessionIndicatorTourRestored).toHaveBeenCalledTimes(0); }); + + test("doesn't show tour step on slow loading when tour is disabled", async () => { + const state$ = new BehaviorSubject(SearchSessionState.Loading); + const SearchSessionIndicator = createConnectedSearchSessionIndicator({ + sessionService: { ...sessionService, state$ }, + application, + storage, + disableSaveAfterSessionCompletesTimeout, + usageCollector, + basePath, + tourDisabled: true, + }); + const rendered = render( + + + + ); + + await waitFor(() => rendered.getByTestId('searchSessionIndicator')); + + expect(() => screen.getByTestId('searchSessionIndicatorPopoverContainer')).toThrow(); + + act(() => { + jest.advanceTimersByTime(10001); + }); + + expect( + screen.queryByTestId('searchSessionIndicatorPopoverContainer') + ).not.toBeInTheDocument(); + + act(() => { + jest.advanceTimersByTime(5000); + state$.next(SearchSessionState.Completed); + }); + + expect( + screen.queryByTestId('searchSessionIndicatorPopoverContainer') + ).not.toBeInTheDocument(); + + expect(storage.get(TOUR_RESTORE_STEP_KEY)).toBeFalsy(); + expect(storage.get(TOUR_TAKING_TOO_LONG_STEP_KEY)).toBeFalsy(); + + expect(usageCollector.trackSessionIndicatorTourLoading).toHaveBeenCalledTimes(0); + expect(usageCollector.trackSessionIndicatorTourRestored).toHaveBeenCalledTimes(0); + }); }); test('shows tour step for restored', async () => { @@ -340,6 +394,7 @@ describe('tour steps', () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const rendered = render( @@ -367,6 +422,7 @@ describe('tour steps', () => { disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }); const rendered = render( diff --git a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx index eed85a9d84ba8..f1ce93181f1ac 100644 --- a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx +++ b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx @@ -31,6 +31,7 @@ export interface SearchSessionIndicatorDeps { * after the last search in the session has completed */ disableSaveAfterSessionCompletesTimeout: number; + tourDisabled: boolean; usageCollector?: SearchUsageCollector; } @@ -41,6 +42,7 @@ export const createConnectedSearchSessionIndicator = ({ disableSaveAfterSessionCompletesTimeout, usageCollector, basePath, + tourDisabled, }: SearchSessionIndicatorDeps): React.FC => { const searchSessionsManagementUrl = basePath.prepend('/app/management/kibana/search_sessions'); @@ -113,6 +115,7 @@ export const createConnectedSearchSessionIndicator = ({ searchSessionIndicator, state, saveDisabled, + tourDisabled, usageCollector ); diff --git a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/search_session_tour.tsx b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/search_session_tour.tsx index 1568d54962eca..50ee3737ad92b 100644 --- a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/search_session_tour.tsx +++ b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/search_session_tour.tsx @@ -23,6 +23,7 @@ export function useSearchSessionTour( searchSessionIndicatorRef: SearchSessionIndicatorRef | null, state: SearchSessionState, searchSessionsDisabled: boolean, + disableSearchSessionsTour: boolean, usageCollector?: SearchUsageCollector ) { const markOpenedDone = useCallback(() => { @@ -55,6 +56,7 @@ export function useSearchSessionTour( useEffect(() => { if (searchSessionsDisabled) return; + if (disableSearchSessionsTour) return; if (!searchSessionIndicatorRef) return; let timeoutHandle: number; @@ -82,6 +84,7 @@ export function useSearchSessionTour( searchSessionIndicatorRef, state, searchSessionsDisabled, + disableSearchSessionsTour, markOpenedDone, markRestoredDone, usageCollector, diff --git a/x-pack/plugins/data_enhanced/tsconfig.json b/x-pack/plugins/data_enhanced/tsconfig.json index 544b50c21224f..5627951c3d9eb 100644 --- a/x-pack/plugins/data_enhanced/tsconfig.json +++ b/x-pack/plugins/data_enhanced/tsconfig.json @@ -22,6 +22,7 @@ { "path": "../../../src/plugins/kibana_utils/tsconfig.json" }, { "path": "../../../src/plugins/usage_collection/tsconfig.json" }, { "path": "../../../src/plugins/management/tsconfig.json" }, + { "path": "../../../src/plugins/screenshot_mode/tsconfig.json"}, { "path": "../security/tsconfig.json" }, { "path": "../task_manager/tsconfig.json" }, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.test.tsx index 78049d5832e9a..76622f9c12822 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.test.tsx @@ -87,6 +87,18 @@ describe('DomainsTable', () => { expect(tableContent).toContain('elastic.co'); }); + it('renders a clickable domain url', () => { + const basicTable = wrapper.find(EuiInMemoryTable).dive().find(EuiBasicTable).dive(); + const link = basicTable.find('[data-test-subj="CrawlerDomainURL"]').at(0); + + expect(link.dive().text()).toContain('elastic.co'); + expect(link.props()).toEqual( + expect.objectContaining({ + to: '/engines/some-engine/crawler/domains/1234', + }) + ); + }); + it('renders a last crawled column', () => { expect(tableContent).toContain('Last activity'); expect(tableContent).toContain('Jan 1, 2020'); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.tsx index 7214eace25e2d..1f0f6be22102f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/domains_table.tsx @@ -17,6 +17,7 @@ import { FormattedNumber } from '@kbn/i18n/react'; import { DELETE_BUTTON_LABEL, MANAGE_BUTTON_LABEL } from '../../../../shared/constants'; import { KibanaLogic } from '../../../../shared/kibana'; +import { EuiLinkTo } from '../../../../shared/react_router_helpers'; import { AppLogic } from '../../../app_logic'; import { ENGINE_CRAWLER_DOMAIN_PATH } from '../../../routes'; import { generateEnginePath } from '../../engine'; @@ -46,6 +47,14 @@ export const DomainsTable: React.FC = () => { defaultMessage: 'Domain URL', } ), + render: (_, domain: CrawlerDomain) => ( + + {domain.url} + + ), }, { field: 'lastCrawl', diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.test.tsx index 944d8315452b0..ddc9c69a35c8d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.test.tsx @@ -15,7 +15,7 @@ import React from 'react'; import { shallow, ShallowWrapper } from 'enzyme'; -import { EuiBadge, EuiButton, EuiLoadingSpinner, EuiTab } from '@elastic/eui'; +import { EuiBadge, EuiButton, EuiTab } from '@elastic/eui'; import { getPageHeaderActions, getPageHeaderTabs, getPageTitle } from '../../../../test_helpers'; @@ -24,15 +24,14 @@ jest.mock('./curation_logic', () => ({ CurationLogic: jest.fn() })); import { AppSearchPageTemplate } from '../../layout'; import { AutomatedCuration } from './automated_curation'; +import { AutomatedCurationHistory } from './automated_curation_history'; import { CurationLogic } from './curation_logic'; import { DeleteCurationButton } from './delete_curation_button'; import { PromotedDocuments, OrganicDocuments } from './documents'; -import { History } from './history'; describe('AutomatedCuration', () => { const values = { - dataLoading: false, queries: ['query A', 'query B'], isFlyoutOpen: false, curation: { @@ -49,6 +48,7 @@ describe('AutomatedCuration', () => { const actions = { convertToManual: jest.fn(), + onSelectPageTab: jest.fn(), }; beforeEach(() => { @@ -62,48 +62,41 @@ describe('AutomatedCuration', () => { const wrapper = shallow(); expect(wrapper.is(AppSearchPageTemplate)); - expect(wrapper.find(PromotedDocuments)).toHaveLength(1); - expect(wrapper.find(OrganicDocuments)).toHaveLength(1); - expect(wrapper.find(History)).toHaveLength(0); }); - it('includes tabs', () => { + it('includes set of tabs in the page header', () => { const wrapper = shallow(); - let tabs = getPageHeaderTabs(wrapper).find(EuiTab); - expect(tabs).toHaveLength(3); + const tabs = getPageHeaderTabs(wrapper).find(EuiTab); - expect(tabs.at(0).prop('isSelected')).toBe(true); + tabs.at(0).simulate('click'); + expect(actions.onSelectPageTab).toHaveBeenNthCalledWith(1, 'promoted'); - expect(tabs.at(1).prop('onClick')).toBeUndefined(); - expect(tabs.at(1).prop('isSelected')).toBe(false); expect(tabs.at(1).prop('disabled')).toBe(true); - expect(tabs.at(2).prop('isSelected')).toBe(false); - - // Clicking on the History tab shows the history view tabs.at(2).simulate('click'); + expect(actions.onSelectPageTab).toHaveBeenNthCalledWith(2, 'history'); + }); - tabs = getPageHeaderTabs(wrapper).find(EuiTab); - - expect(tabs.at(0).prop('isSelected')).toBe(false); - expect(tabs.at(2).prop('isSelected')).toBe(true); + it('renders promoted and organic documents when the promoted tab is selected', () => { + setMockValues({ ...values, selectedPageTab: 'promoted' }); + const wrapper = shallow(); + const tabs = getPageHeaderTabs(wrapper).find(EuiTab); - expect(wrapper.find(PromotedDocuments)).toHaveLength(0); - expect(wrapper.find(OrganicDocuments)).toHaveLength(0); - expect(wrapper.find(History)).toHaveLength(1); + expect(tabs.at(0).prop('isSelected')).toEqual(true); - // Clicking back to the Promoted tab shows promoted documents - tabs.at(0).simulate('click'); + expect(wrapper.find(PromotedDocuments)).toHaveLength(1); + expect(wrapper.find(OrganicDocuments)).toHaveLength(1); + }); - tabs = getPageHeaderTabs(wrapper).find(EuiTab); + it('renders curation history when the history tab is selected', () => { + setMockValues({ ...values, selectedPageTab: 'history' }); + const wrapper = shallow(); + const tabs = getPageHeaderTabs(wrapper).find(EuiTab); - expect(tabs.at(0).prop('isSelected')).toBe(true); - expect(tabs.at(2).prop('isSelected')).toBe(false); + expect(tabs.at(2).prop('isSelected')).toEqual(true); - expect(wrapper.find(PromotedDocuments)).toHaveLength(1); - expect(wrapper.find(OrganicDocuments)).toHaveLength(1); - expect(wrapper.find(History)).toHaveLength(0); + expect(wrapper.find(AutomatedCurationHistory)).toHaveLength(1); }); it('initializes CurationLogic with a curationId prop from URL param', () => { @@ -121,15 +114,6 @@ describe('AutomatedCuration', () => { expect(pageTitle.find(EuiBadge)).toHaveLength(1); }); - it('displays a spinner in the title when loading', () => { - setMockValues({ ...values, dataLoading: true }); - - const wrapper = shallow(); - const pageTitle = shallow(
{getPageTitle(wrapper)}
); - - expect(pageTitle.find(EuiLoadingSpinner)).toHaveLength(1); - }); - it('contains a button to delete the curation', () => { const wrapper = shallow(); const pageHeaderActions = getPageHeaderActions(wrapper); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.tsx index 276b40ba88677..0351d4c113d13 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation.tsx @@ -5,12 +5,12 @@ * 2.0. */ -import React, { useState } from 'react'; +import React from 'react'; import { useParams } from 'react-router-dom'; import { useValues, useActions } from 'kea'; -import { EuiButton, EuiBadge, EuiLoadingSpinner, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButton, EuiBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { EngineLogic } from '../../engine'; @@ -25,29 +25,25 @@ import { import { getCurationsBreadcrumbs } from '../utils'; +import { AutomatedCurationHistory } from './automated_curation_history'; import { HIDDEN_DOCUMENTS_TITLE, PROMOTED_DOCUMENTS_TITLE } from './constants'; import { CurationLogic } from './curation_logic'; import { DeleteCurationButton } from './delete_curation_button'; import { PromotedDocuments, OrganicDocuments } from './documents'; -import { History } from './history'; - -const PROMOTED = 'promoted'; -const HISTORY = 'history'; export const AutomatedCuration: React.FC = () => { const { curationId } = useParams<{ curationId: string }>(); const logic = CurationLogic({ curationId }); - const { convertToManual } = useActions(logic); - const { activeQuery, dataLoading, queries, curation } = useValues(logic); + const { convertToManual, onSelectPageTab } = useActions(logic); + const { activeQuery, queries, curation, selectedPageTab } = useValues(logic); const { engineName } = useValues(EngineLogic); - const [selectedPageTab, setSelectedPageTab] = useState(PROMOTED); const pageTabs = [ { label: PROMOTED_DOCUMENTS_TITLE, append: {curation.promoted.length}, - isSelected: selectedPageTab === PROMOTED, - onClick: () => setSelectedPageTab(PROMOTED), + isSelected: selectedPageTab === 'promoted', + onClick: () => onSelectPageTab('promoted'), }, { label: HIDDEN_DOCUMENTS_TITLE, @@ -62,8 +58,8 @@ export const AutomatedCuration: React.FC = () => { defaultMessage: 'History', } ), - isSelected: selectedPageTab === HISTORY, - onClick: () => setSelectedPageTab(HISTORY), + isSelected: selectedPageTab === 'history', + onClick: () => onSelectPageTab('history'), }, ]; @@ -73,7 +69,7 @@ export const AutomatedCuration: React.FC = () => { pageHeader={{ pageTitle: ( <> - {dataLoading ? : activeQuery}{' '} + {activeQuery}{' '} {AUTOMATED_LABEL} @@ -100,12 +96,11 @@ export const AutomatedCuration: React.FC = () => { ], tabs: pageTabs, }} - isLoading={dataLoading} > - {selectedPageTab === PROMOTED && } - {selectedPageTab === PROMOTED && } - {selectedPageTab === HISTORY && ( - + {selectedPageTab === 'promoted' && } + {selectedPageTab === 'promoted' && } + {selectedPageTab === 'history' && ( + )} ); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/history.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation_history.test.tsx similarity index 68% rename from x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/history.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation_history.test.tsx index a7f83fb0c61d9..b7d1b6f9ed809 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/history.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation_history.test.tsx @@ -11,13 +11,13 @@ import { shallow } from 'enzyme'; import { EntSearchLogStream } from '../../../../shared/log_stream'; -import { History } from './history'; +import { AutomatedCurationHistory } from './automated_curation_history'; -describe('History', () => { +describe('AutomatedCurationHistory', () => { it('renders', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find(EntSearchLogStream).prop('query')).toEqual( - 'appsearch.search_relevance_suggestions.query: some text and event.kind: event and event.dataset: search-relevance-suggestions and appsearch.search_relevance_suggestions.engine: foo and event.action: curation_suggestion' + 'appsearch.search_relevance_suggestions.query: some text and event.kind: event and event.dataset: search-relevance-suggestions and appsearch.search_relevance_suggestions.engine: foo and event.action: curation_suggestion and appsearch.search_relevance_suggestions.suggestion.new_status: automated' ); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/history.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation_history.tsx similarity index 90% rename from x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/history.tsx rename to x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation_history.tsx index 744141372469c..f523beeb0a821 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/history.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/automated_curation_history.tsx @@ -17,13 +17,14 @@ interface Props { engineName: string; } -export const History: React.FC = ({ query, engineName }) => { +export const AutomatedCurationHistory: React.FC = ({ query, engineName }) => { const filters = [ `appsearch.search_relevance_suggestions.query: ${query}`, 'event.kind: event', 'event.dataset: search-relevance-suggestions', `appsearch.search_relevance_suggestions.engine: ${engineName}`, 'event.action: curation_suggestion', + 'appsearch.search_relevance_suggestions.suggestion.new_status: automated', ]; return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.test.tsx index 62c3a6c7d4578..dce56a05f8f8c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.test.tsx @@ -14,6 +14,7 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { EnterpriseSearchPageTemplate } from '../../../../shared/layout'; import { rerender } from '../../../../test_helpers'; jest.mock('./curation_logic', () => ({ CurationLogic: jest.fn() })); @@ -26,6 +27,7 @@ import { Curation } from './'; describe('Curation', () => { const values = { + dataLoading: false, isAutomated: true, }; @@ -49,6 +51,13 @@ describe('Curation', () => { expect(actions.loadCuration).toHaveBeenCalledTimes(2); }); + it('renders a loading view when loading', () => { + setMockValues({ dataLoading: true }); + const wrapper = shallow(); + + expect(wrapper.is(EnterpriseSearchPageTemplate)).toBe(true); + }); + it('renders a view for automated curations', () => { setMockValues({ isAutomated: true }); const wrapper = shallow(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.tsx index 19b6542e96c4b..d1b0f43d976a8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation.tsx @@ -10,6 +10,8 @@ import { useParams } from 'react-router-dom'; import { useValues, useActions } from 'kea'; +import { EnterpriseSearchPageTemplate } from '../../../../shared/layout'; + import { AutomatedCuration } from './automated_curation'; import { CurationLogic } from './curation_logic'; import { ManualCuration } from './manual_curation'; @@ -17,11 +19,14 @@ import { ManualCuration } from './manual_curation'; export const Curation: React.FC = () => { const { curationId } = useParams() as { curationId: string }; const { loadCuration } = useActions(CurationLogic({ curationId })); - const { isAutomated } = useValues(CurationLogic({ curationId })); + const { dataLoading, isAutomated } = useValues(CurationLogic({ curationId })); useEffect(() => { loadCuration(); }, [curationId]); + if (dataLoading) { + return ; + } return isAutomated ? : ; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts index 5c3ac6d700de4..b1f16944c985b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts @@ -250,7 +250,7 @@ describe('CurationLogic', () => { }); describe('onSelectPageTab', () => { - it('should set the selected page tab', () => { + it('should set the selected page tab and clears flash messages', () => { mount({ selectedPageTab: 'promoted', }); @@ -261,6 +261,7 @@ describe('CurationLogic', () => { ...DEFAULT_VALUES, selectedPageTab: 'hidden', }); + expect(clearFlashMessages).toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts index 7b617dd89e962..6393ccf974225 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts @@ -21,7 +21,7 @@ import { DELETE_SUCCESS_MESSAGE } from '../constants'; import { Curation } from '../types'; import { addDocument, removeDocument } from '../utils'; -type CurationPageTabs = 'promoted' | 'hidden'; +type CurationPageTabs = 'promoted' | 'history' | 'hidden'; interface CurationValues { dataLoading: boolean; @@ -271,6 +271,9 @@ export const CurationLogic = kea { + clearFlashMessages(); + }, setActiveQuery: () => actions.updateCuration(), setPromotedIds: () => actions.updateCuration(), addPromotedId: () => actions.updateCuration(), diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.test.tsx index 103d7be37535b..548d111d6f96e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.test.tsx @@ -22,7 +22,7 @@ jest.mock('./curation_logic', () => ({ CurationLogic: jest.fn() })); import { CurationLogic } from './curation_logic'; import { DeleteCurationButton } from './delete_curation_button'; -import { PromotedDocuments, HiddenDocuments } from './documents'; +import { PromotedDocuments, HiddenDocuments, OrganicDocuments } from './documents'; import { ManualCuration } from './manual_curation'; import { ActiveQuerySelect, ManageQueriesModal } from './queries'; import { AddResultFlyout } from './results'; @@ -30,7 +30,6 @@ import { SuggestedDocumentsCallout } from './suggested_documents_callout'; describe('ManualCuration', () => { const values = { - dataLoading: false, queries: ['query A', 'query B'], isFlyoutOpen: false, selectedPageTab: 'promoted', @@ -74,13 +73,13 @@ describe('ManualCuration', () => { expect(actions.onSelectPageTab).toHaveBeenNthCalledWith(2, 'hidden'); }); - it('contains a suggested documents callout when the selectedPageTab is ', () => { + it('contains a suggested documents callout', () => { const wrapper = shallow(); expect(wrapper.find(SuggestedDocumentsCallout)).toHaveLength(1); }); - it('renders promoted documents when that tab is selected', () => { + it('renders promoted and organic documents when the promoted tab is selected', () => { setMockValues({ ...values, selectedPageTab: 'promoted' }); const wrapper = shallow(); const tabs = getPageHeaderTabs(wrapper).find(EuiTab); @@ -88,9 +87,10 @@ describe('ManualCuration', () => { expect(tabs.at(0).prop('isSelected')).toEqual(true); expect(wrapper.find(PromotedDocuments)).toHaveLength(1); + expect(wrapper.find(OrganicDocuments)).toHaveLength(1); }); - it('renders hidden documents when that tab is selected', () => { + it('renders hidden documents when the hidden tab is selected', () => { setMockValues({ ...values, selectedPageTab: 'hidden' }); const wrapper = shallow(); const tabs = getPageHeaderTabs(wrapper).find(EuiTab); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.tsx index 3aee306e3d2ff..45b1b6212f504 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/manual_curation.tsx @@ -26,10 +26,10 @@ import { SuggestedDocumentsCallout } from './suggested_documents_callout'; export const ManualCuration: React.FC = () => { const { curationId } = useParams() as { curationId: string }; - const { onSelectPageTab } = useActions(CurationLogic({ curationId })); - const { dataLoading, queries, selectedPageTab, curation } = useValues( - CurationLogic({ curationId }) - ); + const logic = CurationLogic({ curationId }); + const { onSelectPageTab } = useActions(logic); + const { queries, selectedPageTab, curation } = useValues(logic); + const { isFlyoutOpen } = useValues(AddResultLogic); const pageTabs = [ @@ -64,7 +64,6 @@ export const ManualCuration: React.FC = () => { ], tabs: pageTabs, }} - isLoading={dataLoading} > {selectedPageTab === 'promoted' && } diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.test.tsx index 29418d09218f4..b1f02b960aa8a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.test.tsx @@ -26,6 +26,10 @@ const MOCK_VALUES = { }, queries: ['some query'], }, + // EngineLogic + engine: { + search_relevance_suggestions_active: true, + }, }; describe('SuggestedDocumentsCallout', () => { @@ -40,7 +44,7 @@ describe('SuggestedDocumentsCallout', () => { expect(wrapper.is(SuggestionsCallout)); }); - it('is empty when the suggested is undefined', () => { + it('is empty when the suggestion is undefined', () => { setMockValues({ ...MOCK_VALUES, curation: {} }); const wrapper = shallow(); @@ -48,6 +52,15 @@ describe('SuggestedDocumentsCallout', () => { expect(wrapper.isEmptyRender()).toBe(true); }); + it('is empty when suggestions are not active', () => { + const values = set('engine.search_relevance_suggestions_active', false, MOCK_VALUES); + setMockValues(values); + + const wrapper = shallow(); + + expect(wrapper.isEmptyRender()).toBe(true); + }); + it('is empty when curation status is not pending', () => { const values = set('curation.suggestion.status', 'applied', MOCK_VALUES); setMockValues(values); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.tsx index e443e77d76190..af76ebee16bad 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/suggested_documents_callout.tsx @@ -11,7 +11,7 @@ import { useValues } from 'kea'; import { i18n } from '@kbn/i18n'; import { ENGINE_CURATION_SUGGESTION_PATH } from '../../../routes'; -import { generateEnginePath } from '../../engine'; +import { EngineLogic, generateEnginePath } from '../../engine'; import { SuggestionsCallout } from '../components/suggestions_callout'; @@ -21,8 +21,15 @@ export const SuggestedDocumentsCallout: React.FC = () => { const { curation: { suggestion, queries }, } = useValues(CurationLogic); - - if (typeof suggestion === 'undefined' || suggestion.status !== 'pending') { + const { + engine: { search_relevance_suggestions_active: searchRelevanceSuggestionsActive }, + } = useValues(EngineLogic); + + if ( + typeof suggestion === 'undefined' || + suggestion.status !== 'pending' || + searchRelevanceSuggestionsActive === false + ) { return null; } diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.test.ts index 42c3985e4dcf1..44ff66e5f46eb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.test.ts @@ -92,7 +92,7 @@ describe('CurationsLogic', () => { }); describe('onSelectPageTab', () => { - it('should set the selected page tab', () => { + it('should set the selected page tab and clear flash messages', () => { mount(); CurationsLogic.actions.onSelectPageTab('settings'); @@ -101,6 +101,7 @@ describe('CurationsLogic', () => { ...DEFAULT_VALUES, selectedPageTab: 'settings', }); + expect(clearFlashMessages).toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts index 4419603efddf0..487072584583f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_logic.ts @@ -126,5 +126,8 @@ export const CurationsLogic = kea { + clearFlashMessages(); + }, }), }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.test.tsx index a0fd778ac7dde..9598212d3e0c9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.test.tsx @@ -5,9 +5,6 @@ * 2.0. */ -import '../../../__mocks__/shallow_useeffect.mock'; -import '../../../__mocks__/react_router'; -import { setMockActions, setMockValues } from '../../../__mocks__/kea_logic'; import '../../__mocks__/engine_logic.mock'; import React from 'react'; @@ -15,110 +12,13 @@ import { Route, Switch } from 'react-router-dom'; import { shallow } from 'enzyme'; -import { LogRetentionOptions } from '../log_retention'; - import { CurationsRouter } from './'; -const MOCK_VALUES = { - // CurationsSettingsLogic - dataLoading: false, - curationsSettings: { - enabled: true, - mode: 'automatic', - }, - // LogRetentionLogic - logRetention: { - [LogRetentionOptions.Analytics]: { - enabled: true, - }, - }, - // LicensingLogic - hasPlatinumLicense: true, -}; - -const MOCK_ACTIONS = { - // CurationsSettingsLogic - loadCurationsSettings: jest.fn(), - onSkipLoadingCurationsSettings: jest.fn(), - // LogRetentionLogic - fetchLogRetention: jest.fn(), -}; - describe('CurationsRouter', () => { - beforeEach(() => { - jest.clearAllMocks(); - setMockActions(MOCK_ACTIONS); - }); - it('renders', () => { const wrapper = shallow(); expect(wrapper.find(Switch)).toHaveLength(1); expect(wrapper.find(Route)).toHaveLength(4); }); - - it('loads log retention settings', () => { - setMockValues(MOCK_VALUES); - shallow(); - - expect(MOCK_ACTIONS.fetchLogRetention).toHaveBeenCalled(); - }); - - describe('when the user has no platinum license', () => { - beforeEach(() => { - setMockValues({ - ...MOCK_VALUES, - hasPlatinumLicense: false, - }); - }); - - it('it does not fetch log retention', () => { - shallow(); - expect(MOCK_ACTIONS.fetchLogRetention).toHaveBeenCalledTimes(0); - }); - }); - - describe('loading curation settings based on log retention', () => { - it('loads curation settings when log retention is enabled', () => { - setMockValues({ - ...MOCK_VALUES, - logRetention: { - [LogRetentionOptions.Analytics]: { - enabled: true, - }, - }, - }); - - shallow(); - - expect(MOCK_ACTIONS.loadCurationsSettings).toHaveBeenCalledTimes(1); - }); - - it('skips loading curation settings when log retention is enabled', () => { - setMockValues({ - ...MOCK_VALUES, - logRetention: { - [LogRetentionOptions.Analytics]: { - enabled: false, - }, - }, - }); - - shallow(); - - expect(MOCK_ACTIONS.onSkipLoadingCurationsSettings).toHaveBeenCalledTimes(1); - }); - - it('takes no action if log retention has not yet been loaded', () => { - setMockValues({ - ...MOCK_VALUES, - logRetention: null, - }); - - shallow(); - - expect(MOCK_ACTIONS.loadCurationsSettings).toHaveBeenCalledTimes(0); - expect(MOCK_ACTIONS.onSkipLoadingCurationsSettings).toHaveBeenCalledTimes(0); - }); - }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.tsx index a3b000ea5054a..693e5406b714b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curations_router.tsx @@ -5,53 +5,20 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React from 'react'; import { Route, Switch } from 'react-router-dom'; -import { useValues, useActions } from 'kea'; - -import { LicensingLogic } from '../../../shared/licensing'; import { ENGINE_CURATIONS_PATH, ENGINE_CURATIONS_NEW_PATH, ENGINE_CURATION_PATH, ENGINE_CURATION_SUGGESTION_PATH, } from '../../routes'; -import { LogRetentionLogic, LogRetentionOptions } from '../log_retention'; import { Curation } from './curation'; import { Curations, CurationCreation, CurationSuggestion } from './views'; -import { CurationsSettingsLogic } from './views/curations_settings'; export const CurationsRouter: React.FC = () => { - // We need to loadCurationsSettings here so they are available across all views - - const { hasPlatinumLicense } = useValues(LicensingLogic); - - const { loadCurationsSettings, onSkipLoadingCurationsSettings } = - useActions(CurationsSettingsLogic); - - const { logRetention } = useValues(LogRetentionLogic); - const { fetchLogRetention } = useActions(LogRetentionLogic); - - const analyticsDisabled = !logRetention?.[LogRetentionOptions.Analytics].enabled; - - useEffect(() => { - if (hasPlatinumLicense) { - fetchLogRetention(); - } - }, [hasPlatinumLicense]); - - useEffect(() => { - if (logRetention) { - if (!analyticsDisabled) { - loadCurationsSettings(); - } else { - onSkipLoadingCurationsSettings(); - } - } - }, [logRetention]); - return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curation_suggestion/curation_suggestion_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curation_suggestion/curation_suggestion_logic.ts index b206c0c79ed26..8e6c3a9c6a6ae 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curation_suggestion/curation_suggestion_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curation_suggestion/curation_suggestion_logic.ts @@ -137,7 +137,7 @@ export const CurationSuggestionLogic = kea< setQueuedSuccessMessage( i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.curations.suggestedCuration.successfullyAppliedMessage', - { defaultMessage: 'Suggestion was succefully applied.' } + { defaultMessage: 'Suggestion was successfully applied.' } ) ); if (suggestion!.operation === 'delete') { @@ -177,7 +177,7 @@ export const CurationSuggestionLogic = kea< 'xpack.enterpriseSearch.appSearch.engine.curations.suggestedCuration.successfullyAutomatedMessage', { defaultMessage: - 'Suggestion was succefully applied and all future suggestions for the query "{query}" will be automatically applied.', + 'Suggestion was successfully applied and all future suggestions for the query "{query}" will be automatically applied.', values: { query: suggestion!.query }, } ) @@ -208,7 +208,7 @@ export const CurationSuggestionLogic = kea< i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.curations.suggestedCuration.successfullyRejectedMessage', { - defaultMessage: 'Suggestion was succefully rejected.', + defaultMessage: 'Suggestion was successfully rejected.', } ) ); @@ -230,7 +230,7 @@ export const CurationSuggestionLogic = kea< 'xpack.enterpriseSearch.appSearch.engine.curations.suggestedCuration.successfullyDisabledMessage', { defaultMessage: - 'Suggestion was succefully rejected and you will no longer receive suggestions for the query "{query}".', + 'Suggestion was successfully rejected and you will no longer receive suggestions for the query "{query}".', values: { query: suggestion!.query }, } ) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx index aacabf0ac7303..49d48c8c05ba6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.test.tsx @@ -14,6 +14,8 @@ import React from 'react'; import { shallow } from 'enzyme'; +import { set } from 'lodash/fp'; + import { EuiTab } from '@elastic/eui'; import { getPageHeaderTabs, getPageTitle } from '../../../../test_helpers'; @@ -47,8 +49,14 @@ describe('Curations', () => { }, }, selectedPageTab: 'overview', - // LicensingLogic - hasPlatinumLicense: true, + // CurationsSettingsLogic + curationsSettings: { + enabled: true, + }, + // EngineLogic + engine: { + search_relevance_suggestions_active: true, + }, }; const actions = { @@ -78,20 +86,36 @@ describe('Curations', () => { tabs.at(2).simulate('click'); expect(actions.onSelectPageTab).toHaveBeenNthCalledWith(3, 'settings'); - // The settings tab should NOT have an icon next to it - expect(tabs.at(2).prop('prepend')).toBeUndefined(); }); - it('renders less tabs when less than platinum license', () => { - setMockValues({ ...values, hasPlatinumLicense: false }); + it('renders less tabs when suggestions are not active', () => { + setMockValues(set('engine.search_relevance_suggestions_active', false, values)); const wrapper = shallow(); expect(getPageTitle(wrapper)).toEqual('Curated results'); const tabs = getPageHeaderTabs(wrapper).find(EuiTab); expect(tabs.length).toBe(2); - // The settings tab should have an icon next to it - expect(tabs.at(1).prop('prepend')).not.toBeUndefined(); + }); + + it('renders a New! badge when suggestions are not active', () => { + setMockValues(set('engine.search_relevance_suggestions_active', false, values)); + const wrapper = shallow(); + + expect(getPageTitle(wrapper)).toEqual('Curated results'); + + const tabs = getPageHeaderTabs(wrapper).find(EuiTab); + expect(tabs.at(1).prop('append')).not.toBeUndefined(); + }); + + it('hides the badge when suggestions are active', () => { + setMockValues(set('engine.search_relevance_suggestions_active', true, values)); + const wrapper = shallow(); + + expect(getPageTitle(wrapper)).toEqual('Curated results'); + + const tabs = getPageHeaderTabs(wrapper).find(EuiTab); + expect(tabs.at(2).prop('append')).toBeUndefined(); }); it('renders an overview view', () => { @@ -125,18 +149,20 @@ describe('Curations', () => { }); describe('loading state', () => { - it('renders a full-page loading state on initial page load', () => { + it('renders a full-page loading state and hides tabs on initial page load', () => { setMockValues({ ...values, dataLoading: true }); const wrapper = shallow(); expect(wrapper.prop('isLoading')).toEqual(true); + expect(wrapper.prop('tabs')).toBeUndefined(); }); - it('does not re-render a full-page loading state when data is loaded', () => { + it('does not re-render a full-page loading and shows tabs state when data is loaded', () => { setMockValues({ ...values, dataLoading: false }); const wrapper = shallow(); expect(wrapper.prop('isLoading')).toEqual(false); + expect(typeof wrapper.prop('tabs')).not.toBeUndefined(); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx index 3d4751fcb343f..b0f4f03789af2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations.tsx @@ -9,14 +9,13 @@ import React, { useEffect } from 'react'; import { useValues, useActions } from 'kea'; -import { EuiIcon } from '@elastic/eui'; +import { EuiBadge } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { LicensingLogic } from '../../../../shared/licensing'; import { EuiButtonTo } from '../../../../shared/react_router_helpers'; import { ENGINE_CURATIONS_NEW_PATH } from '../../../routes'; -import { generateEnginePath } from '../../engine'; +import { EngineLogic, generateEnginePath } from '../../engine'; import { AppSearchPageTemplate } from '../../layout'; import { CURATIONS_OVERVIEW_TITLE, CREATE_NEW_CURATION_TITLE } from '../constants'; @@ -25,13 +24,16 @@ import { getCurationsBreadcrumbs } from '../utils'; import { CurationsHistory } from './curations_history/curations_history'; import { CurationsOverview } from './curations_overview'; -import { CurationsSettings, CurationsSettingsLogic } from './curations_settings'; +import { CurationsSettings } from './curations_settings'; export const Curations: React.FC = () => { - const { dataLoading: curationsDataLoading, meta, selectedPageTab } = useValues(CurationsLogic); + const { dataLoading, meta, selectedPageTab } = useValues(CurationsLogic); const { loadCurations, onSelectPageTab } = useActions(CurationsLogic); - const { hasPlatinumLicense } = useValues(LicensingLogic); - const { dataLoading: curationsSettingsDataLoading } = useValues(CurationsSettingsLogic); + const { + engine: { search_relevance_suggestions_active: searchRelevanceSuggestionsActive }, + } = useValues(EngineLogic); + + const suggestionsEnabled = searchRelevanceSuggestionsActive; const OVERVIEW_TAB = { label: i18n.translate( @@ -61,17 +63,18 @@ export const Curations: React.FC = () => { ), isSelected: selectedPageTab === 'settings', onClick: () => onSelectPageTab('settings'), + append: suggestionsEnabled ? undefined : ( + + {i18n.translate('xpack.enterpriseSearch.appSearch.engine.curations.newBadgeLabel', { + defaultMessage: 'New!', + })} + + ), }; - const pageTabs = hasPlatinumLicense + const pageTabs = searchRelevanceSuggestionsActive ? [OVERVIEW_TAB, HISTORY_TAB, SETTINGS_TAB] - : [ - OVERVIEW_TAB, - { - ...SETTINGS_TAB, - prepend: , - }, - ]; + : [OVERVIEW_TAB, SETTINGS_TAB]; useEffect(() => { loadCurations(); @@ -91,9 +94,9 @@ export const Curations: React.FC = () => { {CREATE_NEW_CURATION_TITLE} , ], - tabs: pageTabs, + tabs: dataLoading ? undefined : pageTabs, }} - isLoading={curationsSettingsDataLoading || curationsDataLoading} + isLoading={dataLoading} > {selectedPageTab === 'overview' && } {selectedPageTab === 'history' && } diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.test.tsx index 809157704a14e..43ef9dfd7ad2b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.test.tsx @@ -12,6 +12,7 @@ import '../../../__mocks__/engine_logic.mock'; import React from 'react'; import { shallow } from 'enzyme'; +import { set } from 'lodash/fp'; import { CurationsTable, EmptyState } from '../components'; @@ -33,8 +34,10 @@ const MOCK_VALUES = { id: 'cur-id-2', }, ], - // LicensingLogics - hasPlatinumLicense: true, + // EngineLogic + engine: { + search_relevance_suggestions_active: true, + }, }; describe('CurationsOverview', () => { @@ -67,36 +70,15 @@ describe('CurationsOverview', () => { expect(wrapper.find(CurationsTable)).toHaveLength(1); }); - it('renders a suggestions table when the user has a platinum license and curations suggestions enabled', () => { - setMockValues({ - ...MOCK_VALUES, - hasPlatinumLicense: true, - curationsSettings: { - enabled: true, - }, - }); + it('renders a suggestions table when suggestions are active', () => { + setMockValues(set('engine.search_relevance_suggestions_active', true, MOCK_VALUES)); const wrapper = shallow(); expect(wrapper.find(SuggestionsTable).exists()).toBe(true); }); - it('doesn\t render a suggestions table when the user has no platinum license', () => { - setMockValues({ - ...MOCK_VALUES, - hasPlatinumLicense: false, - }); - const wrapper = shallow(); - - expect(wrapper.find(SuggestionsTable).exists()).toBe(false); - }); - - it('doesn\t render a suggestions table when the user has disabled suggestions', () => { - setMockValues({ - ...MOCK_VALUES, - curationsSettings: { - enabled: false, - }, - }); + it('doesn\t render a suggestions table when suggestions are not active', () => { + setMockValues(set('engine.search_relevance_suggestions_active', false, MOCK_VALUES)); const wrapper = shallow(); expect(wrapper.find(SuggestionsTable).exists()).toBe(false); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.tsx index 00593403b08cf..a611ca88cefd4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_overview.tsx @@ -11,22 +11,18 @@ import { useValues } from 'kea'; import { EuiSpacer } from '@elastic/eui'; -import { LicensingLogic } from '../../../../shared/licensing'; +import { EngineLogic } from '../../engine'; import { CurationsTable, EmptyState } from '../components'; import { SuggestionsTable } from '../components/suggestions_table'; import { CurationsLogic } from '../curations_logic'; -import { CurationsSettingsLogic } from './curations_settings'; - export const CurationsOverview: React.FC = () => { const { curations } = useValues(CurationsLogic); - const { hasPlatinumLicense } = useValues(LicensingLogic); - const { - curationsSettings: { enabled }, - } = useValues(CurationsSettingsLogic); + engine: { search_relevance_suggestions_active: searchRelevanceSuggestionsActive }, + } = useValues(EngineLogic); - const shouldShowSuggestions = enabled && hasPlatinumLicense; + const shouldShowSuggestions = searchRelevanceSuggestionsActive; return ( <> diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.test.tsx index 3b01d1e41c271..4b4e11c31d4b8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.test.tsx @@ -17,6 +17,8 @@ import { shallow, ShallowWrapper } from 'enzyme'; import { EuiButtonEmpty, EuiCallOut, EuiSwitch } from '@elastic/eui'; +import { mountWithIntl } from '@kbn/test/jest'; + import { Loading } from '../../../../../shared/loading'; import { EuiButtonTo } from '../../../../../shared/react_router_helpers'; import { DataPanel } from '../../../data_panel'; @@ -44,6 +46,8 @@ const MOCK_VALUES = { const MOCK_ACTIONS = { // CurationsSettingsLogic + loadCurationsSettings: jest.fn(), + onSkipLoadingCurationsSettings: jest.fn(), toggleCurationsEnabled: jest.fn(), toggleCurationsMode: jest.fn(), // LogRetentionLogic @@ -56,6 +60,14 @@ describe('CurationsSettings', () => { setMockActions(MOCK_ACTIONS); }); + it('loads curations and log retention settings on load', () => { + setMockValues(MOCK_VALUES); + mountWithIntl(); + + expect(MOCK_ACTIONS.loadCurationsSettings).toHaveBeenCalled(); + expect(MOCK_ACTIONS.fetchLogRetention).toHaveBeenCalled(); + }); + it('contains a switch to toggle curations settings', () => { let wrapper: ShallowWrapper; @@ -154,6 +166,50 @@ describe('CurationsSettings', () => { expect(wrapper.is(Loading)).toBe(true); }); + describe('loading curation settings based on log retention', () => { + it('loads curation settings when log retention is enabled', () => { + setMockValues({ + ...MOCK_VALUES, + logRetention: { + [LogRetentionOptions.Analytics]: { + enabled: true, + }, + }, + }); + + shallow(); + + expect(MOCK_ACTIONS.loadCurationsSettings).toHaveBeenCalledTimes(1); + }); + + it('skips loading curation settings when log retention is enabled', () => { + setMockValues({ + ...MOCK_VALUES, + logRetention: { + [LogRetentionOptions.Analytics]: { + enabled: false, + }, + }, + }); + + shallow(); + + expect(MOCK_ACTIONS.onSkipLoadingCurationsSettings).toHaveBeenCalledTimes(1); + }); + + it('takes no action if log retention has not yet been loaded', () => { + setMockValues({ + ...MOCK_VALUES, + logRetention: null, + }); + + shallow(); + + expect(MOCK_ACTIONS.loadCurationsSettings).toHaveBeenCalledTimes(0); + expect(MOCK_ACTIONS.onSkipLoadingCurationsSettings).toHaveBeenCalledTimes(0); + }); + }); + describe('when the user has no platinum license', () => { beforeEach(() => { setMockValues({ @@ -162,6 +218,11 @@ describe('CurationsSettings', () => { }); }); + it('it does not fetch log retention', () => { + shallow(); + expect(MOCK_ACTIONS.fetchLogRetention).toHaveBeenCalledTimes(0); + }); + it('shows a CTA to upgrade your license when the user when the user', () => { const wrapper = shallow(); expect(wrapper.is(DataPanel)).toBe(true); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.tsx index a5d4a33d8b870..de669298b11d9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useEffect } from 'react'; import { useActions, useValues } from 'kea'; @@ -43,12 +43,34 @@ export const CurationsSettings: React.FC = () => { curationsSettings: { enabled, mode }, dataLoading, } = useValues(CurationsSettingsLogic); - const { toggleCurationsEnabled, toggleCurationsMode } = useActions(CurationsSettingsLogic); + const { + loadCurationsSettings, + onSkipLoadingCurationsSettings, + toggleCurationsEnabled, + toggleCurationsMode, + } = useActions(CurationsSettingsLogic); const { isLogRetentionUpdating, logRetention } = useValues(LogRetentionLogic); + const { fetchLogRetention } = useActions(LogRetentionLogic); const analyticsDisabled = !logRetention?.[LogRetentionOptions.Analytics].enabled; + useEffect(() => { + if (hasPlatinumLicense) { + fetchLogRetention(); + } + }, [hasPlatinumLicense]); + + useEffect(() => { + if (logRetention) { + if (!analyticsDisabled) { + loadCurationsSettings(); + } else { + onSkipLoadingCurationsSettings(); + } + } + }, [logRetention]); + if (!hasPlatinumLicense) return ( ({ + CurationsLogic: { + values: {}, + actions: { + loadCurations: jest.fn(), + }, + }, +})); + import { nextTick } from '@kbn/test/jest'; +import { CurationsLogic } from '../..'; +import { EngineLogic } from '../../../engine'; + import { CurationsSettingsLogic } from './curations_settings_logic'; const DEFAULT_VALUES = { @@ -205,6 +217,10 @@ describe('CurationsSettingsLogic', () => { enabled: true, mode: 'automatic', }); + + // data should have been reloaded + expect(EngineLogic.actions.initializeEngine).toHaveBeenCalled(); + expect(CurationsLogic.actions.loadCurations).toHaveBeenCalled(); }); it('presents any API errors to the user', async () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings_logic.ts index d79ad64a69788..3984cbd024da4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_settings/curations_settings_logic.ts @@ -10,6 +10,7 @@ import { kea, MakeLogicType } from 'kea'; import { flashAPIErrors } from '../../../../../shared/flash_messages'; import { HttpLogic } from '../../../../../shared/http'; import { EngineLogic } from '../../../engine'; +import { CurationsLogic } from '../../curations_logic'; export interface CurationsSettings { enabled: boolean; @@ -101,6 +102,10 @@ export const CurationsSettingsLogic = kea< } ); actions.onCurationsSettingsLoad(response.curation); + + // Re-fetch data so that UI updates to new settings + CurationsLogic.actions.loadCurations(); + EngineLogic.actions.initializeEngine(); } catch (e) { flashAPIErrors(e); } diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts index 28739a2799332..bb30190833dd3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts @@ -43,6 +43,7 @@ describe('EngineLogic', () => { schema: { test: SchemaType.Text }, apiTokens: [], apiKey: 'some-key', + search_relevance_suggestions_active: true, }; const DEFAULT_VALUES = { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/types.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/types.ts index d4c652ab9c7a7..0bfbc185b85f3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/types.ts @@ -54,6 +54,7 @@ export interface EngineDetails extends Engine { engine_count?: number; includedEngines?: EngineDetails[]; search_relevance_suggestions?: SearchRelevanceSuggestionDetails; + search_relevance_suggestions_active: boolean; } interface ResultField { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.test.tsx index 58e2cd8cf4c9b..c65d95a5254ee 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.test.tsx @@ -18,16 +18,14 @@ import { SuggestionsCallout } from '../../curations/components/suggestions_callo import { SuggestedCurationsCallout } from './suggested_curations_callout'; const MOCK_VALUES = { - // EngineLogic engine: { search_relevance_suggestions: { curation: { pending: 1, }, }, + search_relevance_suggestions_active: true, }, - // LicensingLogic - hasPlatinumLicense: true, }; describe('SuggestedCurationsCallout', () => { @@ -43,15 +41,20 @@ describe('SuggestedCurationsCallout', () => { }); it('is empty when the suggestions are undefined', () => { - setMockValues({ ...MOCK_VALUES, engine: {} }); + setMockValues({ + ...MOCK_VALUES, + engine: { + search_relevance_suggestions_active: true, + }, + }); const wrapper = shallow(); expect(wrapper.isEmptyRender()).toBe(true); }); - it('is empty when no pending curations', () => { - const values = set('engine.search_relevance_suggestions.curation.pending', 0, MOCK_VALUES); + it('is empty when suggestions are not active', () => { + const values = set('engine.search_relevance_suggestions_active', false, MOCK_VALUES); setMockValues(values); const wrapper = shallow(); @@ -59,9 +62,8 @@ describe('SuggestedCurationsCallout', () => { expect(wrapper.isEmptyRender()).toBe(true); }); - it('is empty when the user has no platinum license', () => { - // This would happen if the user *had* suggestions and then downgraded from platinum to gold or something - const values = set('hasPlatinumLicense', false, MOCK_VALUES); + it('is empty when no pending curations', () => { + const values = set('engine.search_relevance_suggestions.curation.pending', 0, MOCK_VALUES); setMockValues(values); const wrapper = shallow(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.tsx index 046cc2d744b00..04b2d2b207e94 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/components/suggested_curations_callout.tsx @@ -10,23 +10,24 @@ import { useValues } from 'kea'; import { i18n } from '@kbn/i18n'; -import { LicensingLogic } from '../../../../shared/licensing'; import { ENGINE_CURATIONS_PATH } from '../../../routes'; import { SuggestionsCallout } from '../../curations/components/suggestions_callout'; import { EngineLogic, generateEnginePath } from '../../engine'; export const SuggestedCurationsCallout: React.FC = () => { const { - engine: { search_relevance_suggestions: searchRelevanceSuggestions }, + engine: { + search_relevance_suggestions: searchRelevanceSuggestions, + search_relevance_suggestions_active: searchRelevanceSuggestionsActive, + }, } = useValues(EngineLogic); - const { hasPlatinumLicense } = useValues(LicensingLogic); const pendingCount = searchRelevanceSuggestions?.curation.pending; if ( typeof searchRelevanceSuggestions === 'undefined' || pendingCount === 0 || - hasPlatinumLicense === false + searchRelevanceSuggestionsActive === false ) { return null; } diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx index 7b041e885dfef..3be30b77bc2e4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx @@ -25,7 +25,7 @@ const MOCK_VALUES = { const MOCK_ACTIONS = { // RelevanceTuningLogic - updatePrecision: jest.fn(), + setPrecision: jest.fn(), }; describe('PrecisionSlider', () => { @@ -49,12 +49,12 @@ describe('PrecisionSlider', () => { expect(wrapper.find('[data-test-subj="PrecisionRange"]').prop('value')).toEqual(2); }); - it('calls updatePrecision on change', () => { + it('updates the precision on change', () => { wrapper .find('[data-test-subj="PrecisionRange"]') .simulate('change', { target: { value: 10 } }); - expect(MOCK_ACTIONS.updatePrecision).toHaveBeenCalledWith(10); + expect(MOCK_ACTIONS.setPrecision).toHaveBeenCalledWith(10); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.tsx index 6fcfb28cb9e37..8e7a59c290ce2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.tsx @@ -33,7 +33,7 @@ export const PrecisionSlider: React.FC = () => { searchSettings: { precision }, } = useValues(RelevanceTuningLogic); - const { updatePrecision } = useActions(RelevanceTuningLogic); + const { setPrecision } = useActions(RelevanceTuningLogic); const stepDescription = STEP_DESCRIPTIONS[precision]; @@ -102,7 +102,7 @@ export const PrecisionSlider: React.FC = () => { data-test-subj="PrecisionRange" value={precision} onChange={(e) => { - updatePrecision(parseInt((e.target as HTMLInputElement).value, 10)); + setPrecision(parseInt((e.target as HTMLInputElement).value, 10)); }} min={1} max={11} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.test.ts index 7590633b7afef..193c5dbe8ac24 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.test.ts @@ -228,10 +228,10 @@ describe('RelevanceTuningLogic', () => { }); }); - describe('updatePrecision', () => { + describe('setPrecision', () => { it('should set precision inside search settings and set unsavedChanges to true', () => { mount(); - RelevanceTuningLogic.actions.updatePrecision(9); + RelevanceTuningLogic.actions.setPrecision(9); expect(RelevanceTuningLogic.values).toEqual({ ...DEFAULT_VALUES, @@ -1007,15 +1007,24 @@ describe('RelevanceTuningLogic', () => { }); }); - describe('updateSearchValue', () => { - it('should update the query then update search results', () => { + describe('setSearchQuery', () => { + it('shoulds update search results', () => { + mount(); + jest.spyOn(RelevanceTuningLogic.actions, 'getSearchResults'); + + RelevanceTuningLogic.actions.setSearchQuery('foo'); + + expect(RelevanceTuningLogic.actions.getSearchResults).toHaveBeenCalled(); + }); + }); + + describe('setPrecision', () => { + it('shoulds update search results', () => { mount(); - jest.spyOn(RelevanceTuningLogic.actions, 'setSearchQuery'); jest.spyOn(RelevanceTuningLogic.actions, 'getSearchResults'); - RelevanceTuningLogic.actions.updateSearchValue('foo'); + RelevanceTuningLogic.actions.setPrecision(9); - expect(RelevanceTuningLogic.actions.setSearchQuery).toHaveBeenCalledWith('foo'); expect(RelevanceTuningLogic.actions.getSearchResults).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.ts index 02df792f515a2..c94de74b5ab22 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_logic.ts @@ -88,8 +88,7 @@ interface RelevanceTuningActions { optionType: keyof Pick; value: string; }; - updatePrecision(precision: number): { precision: number }; - updateSearchValue(query: string): string; + setPrecision(precision: number): { precision: number }; } interface RelevanceTuningValues { @@ -144,8 +143,7 @@ export const RelevanceTuningLogic = kea< optionType, value, }), - updatePrecision: (precision) => ({ precision }), - updateSearchValue: (query) => query, + setPrecision: (precision) => ({ precision }), }), reducers: () => ({ searchSettings: [ @@ -158,7 +156,7 @@ export const RelevanceTuningLogic = kea< onInitializeRelevanceTuning: (_, { searchSettings }) => searchSettings, setSearchSettings: (_, { searchSettings }) => searchSettings, setSearchSettingsResponse: (_, { searchSettings }) => searchSettings, - updatePrecision: (currentSearchSettings, { precision }) => ({ + setPrecision: (currentSearchSettings, { precision }) => ({ ...currentSearchSettings, precision, }), @@ -191,7 +189,7 @@ export const RelevanceTuningLogic = kea< unsavedChanges: [ false, { - updatePrecision: () => true, + setPrecision: () => true, setSearchSettings: () => true, setSearchSettingsResponse: () => false, }, @@ -268,7 +266,11 @@ export const RelevanceTuningLogic = kea< const { engineName } = EngineLogic.values; const { http } = HttpLogic.values; - const { search_fields: searchFields, boosts } = removeBoostStateProps(values.searchSettings); + const { + search_fields: searchFields, + boosts, + precision, + } = removeBoostStateProps(values.searchSettings); const url = `/internal/app_search/engines/${engineName}/search`; actions.setResultsLoading(true); @@ -283,6 +285,7 @@ export const RelevanceTuningLogic = kea< body: JSON.stringify({ boosts: isEmpty(filteredBoosts) ? undefined : filteredBoosts, search_fields: isEmpty(searchFields) ? undefined : searchFields, + precision, }), }); @@ -472,8 +475,10 @@ export const RelevanceTuningLogic = kea< }, }); }, - updateSearchValue: (query) => { - actions.setSearchQuery(query); + setSearchQuery: () => { + actions.getSearchResults(); + }, + setPrecision: () => { actions.getSearchResults(); }, }), diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.test.tsx index b39faa6029436..32325c13efdae 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.test.tsx @@ -22,7 +22,7 @@ describe('RelevanceTuningPreview', () => { const result3 = { id: { raw: 3 } }; const actions = { - updateSearchValue: jest.fn(), + setSearchQuery: jest.fn(), }; const values = { @@ -79,7 +79,7 @@ describe('RelevanceTuningPreview', () => { wrapper.find(EuiFieldSearch).simulate('change', { target: { value: 'some search text' } }); - expect(actions.updateSearchValue).toHaveBeenCalledWith('some search text'); + expect(actions.setSearchQuery).toHaveBeenCalledWith('some search text'); }); it('will show user a prompt to enter a query if they have not entered one', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.tsx index 4f3b20b419e80..3a36a3df2b472 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning_preview.tsx @@ -44,7 +44,7 @@ const noResultsCallout = ( ); export const RelevanceTuningPreview: React.FC = () => { - const { updateSearchValue } = useActions(RelevanceTuningLogic); + const { setSearchQuery } = useActions(RelevanceTuningLogic); const { searchResults, schema } = useValues(RelevanceTuningLogic); const { engineName, isMetaEngine } = useValues(EngineLogic); @@ -59,7 +59,7 @@ export const RelevanceTuningPreview: React.FC = () => {
updateSearchValue(e.target.value)} + onChange={(e) => setSearchQuery(e.target.value)} placeholder={i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.preview.searchPlaceholder', { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/utils.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/utils.ts index be953f973ebf8..0edace74d0cb9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/utils.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/utils.ts @@ -16,7 +16,7 @@ export const filterIfTerm = (array: string[], filterTerm: string): string[] => { return filterTerm === '' ? array : array.filter((item) => item.includes(filterTerm)); }; -export const removeBoostStateProps = (searchSettings: SearchSettings) => { +export const removeBoostStateProps = (searchSettings: SearchSettings): SearchSettings => { const updatedSettings = cloneDeep(searchSettings); const { boosts } = updatedSettings; const keys = Object.keys(boosts); diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index 04fa3ae681045..fef40ed00bfc1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.tsx @@ -96,7 +96,7 @@ export const renderApp = ( * Render function for Kibana's header action menu chrome - * reusable by any Enterprise Search plugin simply by passing in * a custom HeaderActions component (e.g., WorkplaceSearchHeaderActions) - * @see https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.appmountparameters.setheaderactionmenu.md + * @see https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.appmountparameters.setheaderactionmenu.md */ export const renderHeaderActions = ( diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts index ca24be5864b84..650aa00d1801d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts @@ -13,7 +13,7 @@ import { /** * Generate a document title that generally follows our breadcrumb trails - * https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.chromedoctitle.md + * https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.chromedoctitle.md */ type Title = string[]; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx index e639f9d22fb4b..0d7e14f063248 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx @@ -22,7 +22,7 @@ import { enterpriseSearchTitle, appSearchTitle, workplaceSearchTitle } from './g /** * Helpers for setting Kibana chrome (breadcrumbs, doc titles) on React view mount - * @see https://github.com/elastic/kibana/blob/master/src/core/public/chrome/chrome_service.tsx + * @see https://github.com/elastic/kibana/blob/main/src/core/public/chrome/chrome_service.tsx * * Example usage (don't forget to i18n.translate() page titles!): * diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx index 5b02756e44b52..8d480b69b3fe5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx @@ -79,7 +79,7 @@ describe('EnterpriseSearchPageTemplate', () => { expect(wrapper.find('.emptyState').exists()).toBe(true); expect(wrapper.find('.test').exists()).toBe(false); - // @see https://github.com/elastic/kibana/blob/master/dev_docs/tutorials/kibana_page_template.mdx#isemptystate + // @see https://github.com/elastic/kibana/blob/main/dev_docs/tutorials/kibana_page_template.mdx#isemptystate // if you want to use KibanaPageTemplate's `isEmptyState` without a custom emptyState }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx index affec11921545..7528fa14b7ae4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx @@ -32,7 +32,7 @@ import './page_template.scss'; * WorkplaceSearchPageTemplate sitting on top of this template (:nesting_dolls:), * which in turn manages individual product-specific concerns (e.g. side navs, telemetry, etc.) * - * @see https://github.com/elastic/kibana/tree/master/src/plugins/kibana_react/public/page_template + * @see https://github.com/elastic/kibana/tree/main/src/plugins/kibana_react/public/page_template * @see https://elastic.github.io/eui/#/layout/page */ diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/log_stream/log_stream.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/log_stream/log_stream.tsx index e5dabdd51e543..c1f4262881bd2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/log_stream/log_stream.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/log_stream/log_stream.tsx @@ -17,7 +17,7 @@ import { LOGS_SOURCE_ID } from '../../../../common/constants'; * default for timestamps. All other props get passed as-is to the underlying LogStream. * * Documentation links for reference: - * - https://github.com/elastic/kibana/blob/master/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx + * - https://github.com/elastic/kibana/blob/main/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx * - Run `yarn storybook infra` for live docs */ diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts index 48cbf4ba00d87..7222edad56822 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts @@ -376,7 +376,7 @@ export const exampleResult = { source: 'custom', }, ], - schemaFields: {}, + schemaFields: { cats: 'text', dogs: 'text' }, }; export const mostRecentIndexJob = { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.test.tsx index 5a15ef641be99..eeb7f6b54f2c0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.test.tsx @@ -45,6 +45,7 @@ describe('ExampleResultDetailCard', () => { ...exampleResult, searchResultConfig: { detailFields: [{ fieldName: 'date', label: 'Date' }] }, exampleDocuments: [{ date }], + schemaFields: { date: 'date' }, }); const wrapper = shallow(); @@ -52,4 +53,17 @@ describe('ExampleResultDetailCard', () => { new Date(Date.parse(date)).toLocaleString() ); }); + + it('shows non-formatted value when not a date field', () => { + const value = '9999'; + setMockValues({ + ...exampleResult, + searchResultConfig: { detailFields: [{ fieldName: 'value', label: 'Value' }] }, + exampleDocuments: [{ value }], + schemaFields: { value: 'text' }, + }); + const wrapper = shallow(); + + expect(wrapper.find(EuiText).children().text()).toContain(value); + }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.tsx index 8b0a72ac23e39..734e370e4c53d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/example_result_detail_card.tsx @@ -12,6 +12,7 @@ import { useValues } from 'kea'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; +import { SchemaType } from '../../../../../shared/schema/types'; import { URL_LABEL } from '../../../../constants'; import { getAsLocalDateTimeString } from '../../../../utils'; @@ -26,6 +27,7 @@ export const ExampleResultDetailCard: React.FC = () => { titleFieldHover, urlFieldHover, exampleDocuments, + schemaFields, } = useValues(DisplaySettingsLogic); const result = exampleDocuments[0]; @@ -63,7 +65,8 @@ export const ExampleResultDetailCard: React.FC = () => { {detailFields.length > 0 ? ( detailFields.map(({ fieldName, label }, index) => { const value = result[fieldName]; - const dateValue = getAsLocalDateTimeString(value); + const fieldType = (schemaFields as { [key: string]: SchemaType })[fieldName]; + const dateValue = fieldType === SchemaType.Date && getAsLocalDateTimeString(value); return (
{ - const { searchResultConfig, exampleDocuments } = exampleResult; + const { searchResultConfig, exampleDocuments, schemaFields } = exampleResult; const availableFieldOptions = [ { value: 'foo', @@ -70,6 +70,7 @@ describe('ResultDetail', () => { searchResultConfig, availableFieldOptions, exampleDocuments, + schemaFields, }); }); @@ -94,6 +95,7 @@ describe('ResultDetail', () => { }, availableFieldOptions, exampleDocuments, + schemaFields, }); const wrapper = shallow(); @@ -122,6 +124,7 @@ describe('ResultDetail', () => { }, availableFieldOptions, exampleDocuments, + schemaFields, }); const wrapper = mount(); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts index 53f16a303f70a..8518485c98b24 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.test.ts @@ -26,6 +26,8 @@ describe('SourcesLogic', () => { const { flashAPIErrors, flashSuccessToast } = mockFlashMessageHelpers; const { mount, unmount } = new LogicMounter(SourcesLogic); + const mockBreakpoint = jest.fn(); + const contentSource = contentSources[0]; const defaultValues = { @@ -65,6 +67,10 @@ describe('SourcesLogic', () => { mount(); }); + afterEach(() => { + jest.clearAllTimers(); + }); + it('has expected default values', () => { expect(SourcesLogic.values).toEqual(defaultValues); }); @@ -193,6 +199,30 @@ describe('SourcesLogic', () => { expect(flashAPIErrors).toHaveBeenCalledWith(error); }); + + it('handles early logic unmount gracefully in org context', async () => { + AppLogic.values.isOrganization = true; + const promise = Promise.resolve(contentSource); + http.get.mockReturnValue(promise); + + SourcesLogic.actions.initializeSources(); + unmount(); + await promise; + + expect(flashAPIErrors).not.toHaveBeenCalled(); + }); + + it('handles early logic unmount gracefully in account context', async () => { + AppLogic.values.isOrganization = false; + const promise = Promise.resolve(contentSource); + http.get.mockReturnValue(promise); + + SourcesLogic.actions.initializeSources(); + unmount(); + await promise; + + expect(flashAPIErrors).not.toHaveBeenCalled(); + }); }); describe('setSourceSearchability', () => { @@ -246,7 +276,25 @@ describe('SourcesLogic', () => { }); describe('pollForSourceStatusChanges', () => { - it('calls API and sets values', async () => { + it('calls API and sets values if there are no server statuses yet in the logic', async () => { + AppLogic.values.isOrganization = true; + + const setServerSourceStatusesSpy = jest.spyOn( + SourcesLogic.actions, + 'setServerSourceStatuses' + ); + const promise = Promise.resolve(contentSources); + http.get.mockReturnValue(promise); + SourcesLogic.actions.pollForSourceStatusChanges(); + + jest.advanceTimersByTime(POLLING_INTERVAL); + + expect(http.get).toHaveBeenCalledWith('/internal/workplace_search/org/sources/status'); + await promise; + expect(setServerSourceStatusesSpy).toHaveBeenCalledWith(contentSources); + }); + + it('calls API and sets values if server statuses are already in the logic', async () => { AppLogic.values.isOrganization = true; SourcesLogic.actions.setServerSourceStatuses(serverStatuses); @@ -264,6 +312,20 @@ describe('SourcesLogic', () => { await promise; expect(setServerSourceStatusesSpy).toHaveBeenCalledWith(contentSources); }); + + it('handles early logic unmount gracefully', async () => { + AppLogic.values.isOrganization = true; + SourcesLogic.actions.setServerSourceStatuses(serverStatuses); + const promise = Promise.resolve(contentSources); + http.get.mockReturnValue(promise); + + SourcesLogic.actions.pollForSourceStatusChanges(); + jest.advanceTimersByTime(POLLING_INTERVAL); + unmount(); + await promise; + + expect(flashAPIErrors).not.toHaveBeenCalled(); + }); }); it('resetSourcesState', () => { @@ -290,7 +352,7 @@ describe('SourcesLogic', () => { ); const promise = Promise.resolve(contentSources); http.get.mockReturnValue(promise); - fetchSourceStatuses(true); + fetchSourceStatuses(true, mockBreakpoint); expect(http.get).toHaveBeenCalledWith('/internal/workplace_search/org/sources/status'); await promise; @@ -300,7 +362,7 @@ describe('SourcesLogic', () => { it('calls API (account)', async () => { const promise = Promise.resolve(contentSource); http.get.mockReturnValue(promise); - fetchSourceStatuses(false); + fetchSourceStatuses(false, mockBreakpoint); expect(http.get).toHaveBeenCalledWith('/internal/workplace_search/account/sources/status'); }); @@ -314,7 +376,7 @@ describe('SourcesLogic', () => { }; const promise = Promise.reject(error); http.get.mockReturnValue(promise); - fetchSourceStatuses(true); + fetchSourceStatuses(true, mockBreakpoint); await expectedAsyncError(promise); expect(flashAPIErrors).toHaveBeenCalledWith(error); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts index 9a88f6238bcc4..b2c53b0a4b549 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_logic.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { kea, MakeLogicType } from 'kea'; +import { kea, MakeLogicType, isBreakpoint } from 'kea'; +import type { BreakPointFunction } from 'kea'; import { cloneDeep, findIndex } from 'lodash'; import { i18n } from '@kbn/i18n'; @@ -155,7 +156,7 @@ export const SourcesLogic = kea>( ], }), listeners: ({ actions, values }) => ({ - initializeSources: async () => { + initializeSources: async (_, breakpoint) => { const { isOrganization } = AppLogic.values; const route = isOrganization ? '/internal/workplace_search/org/sources' @@ -163,26 +164,31 @@ export const SourcesLogic = kea>( try { const response = await HttpLogic.values.http.get(route); + breakpoint(); // Prevents errors if logic unmounts while fetching actions.pollForSourceStatusChanges(); actions.onInitializeSources(response); } catch (e) { - flashAPIErrors(e); + if (isBreakpoint(e)) { + return; // do not continue if logic is unmounted + } else { + flashAPIErrors(e); + } } if (isOrganization && !values.serverStatuses) { // We want to get the initial statuses from the server to compare our polling results to. - const sourceStatuses = await fetchSourceStatuses(isOrganization); + const sourceStatuses = await fetchSourceStatuses(isOrganization, breakpoint); actions.setServerSourceStatuses(sourceStatuses); } }, // We poll the server and if the status update, we trigger a new fetch of the sources. - pollForSourceStatusChanges: () => { + pollForSourceStatusChanges: (_, breakpoint) => { const { isOrganization } = AppLogic.values; if (!isOrganization) return; const serverStatuses = values.serverStatuses; pollingInterval = window.setInterval(async () => { - const sourceStatuses = await fetchSourceStatuses(isOrganization); + const sourceStatuses = await fetchSourceStatuses(isOrganization, breakpoint); sourceStatuses.some((source: ContentSourceStatus) => { if (serverStatuses && serverStatuses[source.id] !== source.status.status) { @@ -240,7 +246,10 @@ export const SourcesLogic = kea>( }), }); -export const fetchSourceStatuses = async (isOrganization: boolean) => { +export const fetchSourceStatuses = async ( + isOrganization: boolean, + breakpoint: BreakPointFunction +) => { const route = isOrganization ? '/internal/workplace_search/org/sources/status' : '/internal/workplace_search/account/sources/status'; @@ -248,9 +257,14 @@ export const fetchSourceStatuses = async (isOrganization: boolean) => { try { response = await HttpLogic.values.http.get(route); + breakpoint(); SourcesLogic.actions.setServerSourceStatuses(response); } catch (e) { - flashAPIErrors(e); + if (isBreakpoint(e)) { + // Do nothing, silence the error + } else { + flashAPIErrors(e); + } } return response; diff --git a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_http_agent.ts b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_http_agent.ts index 89210def248b3..b117918311120 100644 --- a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_http_agent.ts +++ b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_http_agent.ts @@ -59,7 +59,7 @@ class EnterpriseSearchHttpAgent { /* * Convert verificationMode to rejectUnauthorized for more consistent config settings * with the rest of Kibana - * @see https://github.com/elastic/kibana/blob/master/x-pack/plugins/actions/server/builtin_action_types/lib/get_node_tls_options.ts + * @see https://github.com/elastic/kibana/blob/main/x-pack/plugins/actions/server/builtin_action_types/lib/get_node_tls_options.ts */ getAgentOptions(verificationMode: 'full' | 'certificate' | 'none') { const agentOptions: AgentOptions = {}; diff --git a/x-pack/plugins/enterprise_search/server/lib/route_config_helpers.ts b/x-pack/plugins/enterprise_search/server/lib/route_config_helpers.ts index 87defff89bad4..554fe127b4353 100644 --- a/x-pack/plugins/enterprise_search/server/lib/route_config_helpers.ts +++ b/x-pack/plugins/enterprise_search/server/lib/route_config_helpers.ts @@ -33,8 +33,8 @@ interface ConfigWithoutBodyOptions * The will pass a String Buffer to the route handler. The proper way to validate this when validation * is enabled to to use `body: schema.buffer()`. * - * @see https://github.com/elastic/kibana/blob/master/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.md - * @see https://github.com/elastic/kibana/blob/master/packages/kbn-config-schema/README.md#schemabuffer + * @see https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.routeconfigoptionsbody.md + * @see https://github.com/elastic/kibana/blob/main/packages/kbn-config-schema/README.md#schemabuffer * * Example: * router.put({ diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index 1d58da5bbdd2b..069000adf277b 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -172,7 +172,7 @@ export class EnterpriseSearchPlugin implements Plugin { /* * Register logs source configuration, used by LogStream components - * @see https://github.com/elastic/kibana/blob/master/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx#with-a-source-configuration + * @see https://github.com/elastic/kibana/blob/main/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx#with-a-source-configuration */ infra.defineInternalSourceConfiguration(LOGS_SOURCE_ID, { name: 'Enterprise Search Logs', diff --git a/x-pack/plugins/event_log/README.md b/x-pack/plugins/event_log/README.md index 33c7fcabc9f46..5b02679aa60f4 100644 --- a/x-pack/plugins/event_log/README.md +++ b/x-pack/plugins/event_log/README.md @@ -424,7 +424,7 @@ yarn test:jest x-pack/plugins/event_log --watch ### API Integration tests -See: [`x-pack/test/plugin_api_integration/test_suites/event_log`](https://github.com/elastic/kibana/tree/master/x-pack/test/plugin_api_integration/test_suites/event_log). +See: [`x-pack/test/plugin_api_integration/test_suites/event_log`](https://github.com/elastic/kibana/tree/main/x-pack/test/plugin_api_integration/test_suites/event_log). To develop integration tests, first start the test server from the root of the repo: diff --git a/x-pack/plugins/fleet/README.md b/x-pack/plugins/fleet/README.md index ce8e95c83d6bd..80d13b28c8265 100644 --- a/x-pack/plugins/fleet/README.md +++ b/x-pack/plugins/fleet/README.md @@ -2,7 +2,7 @@ ## Plugin -- The plugin is enabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/master/x-pack/plugins/fleet/common/types/index.ts#L9-L27) +- The plugin is enabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/main/x-pack/plugins/fleet/common/types/index.ts#L9-L27) - Adding `xpack.fleet.enabled=false` will disable the plugin including the EPM and Fleet features. It will also remove the `PACKAGE_POLICY_API_ROUTES` and `AGENT_POLICY_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) - Adding `--xpack.fleet.agents.enabled=false` will disable the Fleet API & UI - [code for adding the routes](https://github.com/elastic/kibana/blob/1f27d349533b1c2865c10c45b2cf705d7416fb36/x-pack/plugins/ingest_manager/server/plugin.ts#L115-L133) @@ -26,7 +26,7 @@ Also you need to configure the hosts your agent is going to use to comunication ### Getting started -See the Kibana docs for [how to set up your dev environment](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#setting-up-your-development-environment), [run Elasticsearch](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-elasticsearch), and [start Kibana](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-kibana) +See the Kibana docs for [how to set up your dev environment](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md#setting-up-your-development-environment), [run Elasticsearch](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md#running-elasticsearch), and [start Kibana](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md#running-kibana) One common development workflow is: @@ -44,7 +44,7 @@ One common development workflow is: ``` This plugin follows the `common`, `server`, `public` structure from the [Architecture Style Guide -](https://github.com/elastic/kibana/blob/master/style_guides/architecture_style_guide.md#file-and-folder-structure). We also follow the pattern of developing feature branches under your personal fork of Kibana. +](https://github.com/elastic/kibana/blob/main/style_guides/architecture_style_guide.md#file-and-folder-structure). We also follow the pattern of developing feature branches under your personal fork of Kibana. Note: The plugin was previously named Ingest Manager it's possible that some variables are still named with that old plugin name. diff --git a/x-pack/plugins/fleet/common/constants/epm.ts b/x-pack/plugins/fleet/common/constants/epm.ts index 131cc276fc073..734d578687bcd 100644 --- a/x-pack/plugins/fleet/common/constants/epm.ts +++ b/x-pack/plugins/fleet/common/constants/epm.ts @@ -15,6 +15,10 @@ export const FLEET_SERVER_PACKAGE = 'fleet_server'; export const FLEET_ENDPOINT_PACKAGE = 'endpoint'; export const FLEET_APM_PACKAGE = 'apm'; export const FLEET_SYNTHETICS_PACKAGE = 'synthetics'; +export const FLEET_KUBERNETES_PACKAGE = 'kubernetes'; +export const KUBERNETES_RUN_INSTRUCTIONS = + 'kubectl apply -f elastic-agent-standalone-kubernetes.yaml'; +export const STANDALONE_RUN_INSTRUCTIONS = './elastic-agent install'; /* Package rules: diff --git a/x-pack/plugins/fleet/common/openapi/README.md b/x-pack/plugins/fleet/common/openapi/README.md index 7b302ab3cd478..0e3caae0f8e82 100644 --- a/x-pack/plugins/fleet/common/openapi/README.md +++ b/x-pack/plugins/fleet/common/openapi/README.md @@ -1,6 +1,6 @@ -# OpenAPI +# OpenAPI (Experimental) -The current self-contained spec file is [as JSON](https://raw.githubusercontent.com/elastic/kibana/7.x/x-pack/plugins/fleet/common/openapi/bundled.json) or [as YAML](https://raw.githubusercontent.com/elastic/kibana/7.x/x-pack/plugins/fleet/common/openapi/bundled.yaml) and can be used for online tools like those found at https://openapi.tools/ +The current self-contained spec file is [as JSON](https://raw.githubusercontent.com/elastic/kibana/7.x/x-pack/plugins/fleet/common/openapi/bundled.json) or [as YAML](https://raw.githubusercontent.com/elastic/kibana/7.x/x-pack/plugins/fleet/common/openapi/bundled.yaml) and can be used for online tools like those found at https://openapi.tools/. This spec is experiemental and may be incomplete or change later. For example, online viewers for the specification like these: diff --git a/x-pack/plugins/fleet/common/services/agent_cm_to_yaml.ts b/x-pack/plugins/fleet/common/services/agent_cm_to_yaml.ts new file mode 100644 index 0000000000000..5987110d7752f --- /dev/null +++ b/x-pack/plugins/fleet/common/services/agent_cm_to_yaml.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { safeDump } from 'js-yaml'; + +import type { FullAgentConfigMap } from '../types/models/agent_cm'; + +const CM_KEYS_ORDER = ['apiVersion', 'kind', 'metadata', 'data']; + +export const fullAgentConfigMapToYaml = ( + policy: FullAgentConfigMap, + toYaml: typeof safeDump +): string => { + return toYaml(policy, { + skipInvalid: true, + sortKeys: (keyA: string, keyB: string) => { + const indexA = CM_KEYS_ORDER.indexOf(keyA); + const indexB = CM_KEYS_ORDER.indexOf(keyB); + if (indexA >= 0 && indexB < 0) { + return -1; + } + + if (indexA < 0 && indexB >= 0) { + return 1; + } + + return indexA - indexB; + }, + }); +}; diff --git a/x-pack/plugins/fleet/common/types/models/agent_cm.ts b/x-pack/plugins/fleet/common/types/models/agent_cm.ts new file mode 100644 index 0000000000000..bd8200c96ad88 --- /dev/null +++ b/x-pack/plugins/fleet/common/types/models/agent_cm.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FullAgentPolicy } from './agent_policy'; + +export interface FullAgentConfigMap { + apiVersion: string; + kind: string; + metadata: Metadata; + data: AgentYML; +} + +interface Metadata { + name: string; + namespace: string; + labels: Labels; +} + +interface Labels { + 'k8s-app': string; +} + +interface AgentYML { + 'agent.yml': FullAgentPolicy; +} diff --git a/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts b/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts index 927368694693a..0975b1e28fb8b 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/agent_policy.ts @@ -78,3 +78,7 @@ export interface GetFullAgentPolicyRequest { export interface GetFullAgentPolicyResponse { item: FullAgentPolicy; } + +export interface GetFullAgentConfigMapResponse { + item: string; +} diff --git a/x-pack/plugins/fleet/dev_docs/api_integration_tests.md b/x-pack/plugins/fleet/dev_docs/api_integration_tests.md index bf1a84ae4c563..7372c06269ce4 100644 --- a/x-pack/plugins/fleet/dev_docs/api_integration_tests.md +++ b/x-pack/plugins/fleet/dev_docs/api_integration_tests.md @@ -35,7 +35,7 @@ Port `12345` is used as an example here, it can be anything, but the environment ## DockerServers service setup We use the `DockerServers` service provided by `kbn-test`. The documentation for this functionality can be found here: -https://github.com/elastic/kibana/blob/master/packages/kbn-test/src/functional_test_runner/lib/docker_servers/README.md +https://github.com/elastic/kibana/blob/main/packages/kbn-test/src/functional_test_runner/lib/docker_servers/README.md The main configuration for the `DockerServers` service for our tests can be found in `x-pack/test/fleet_api_integration/config.ts`: diff --git a/x-pack/plugins/fleet/dev_docs/diagrams/architecture_overview/architecture_overview.excalidraw b/x-pack/plugins/fleet/dev_docs/diagrams/architecture_overview/architecture_overview.excalidraw index bfd73693d156d..5be5f2758f00c 100644 --- a/x-pack/plugins/fleet/dev_docs/diagrams/architecture_overview/architecture_overview.excalidraw +++ b/x-pack/plugins/fleet/dev_docs/diagrams/architecture_overview/architecture_overview.excalidraw @@ -358,7 +358,7 @@ ], "fontSize": 20, "fontFamily": 2, - "text": "Fleet and Integrations are both Kibana applications. Kibana's architecture\nallows for many plugins/application to exist and register themselves as distinct\nexperiences. The Fleet team mainly works on these two Kibana applications \nwithin the `xpack/plugins/fleet` directory in the Kibana codebase.\n\nhttps://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet\nhttps://www.elastic.co/guide/en/fleet/current/fleet-overview.html\n", + "text": "Fleet and Integrations are both Kibana applications. Kibana's architecture\nallows for many plugins/application to exist and register themselves as distinct\nexperiences. The Fleet team mainly works on these two Kibana applications \nwithin the `xpack/plugins/fleet` directory in the Kibana codebase.\n\nhttps://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet\nhttps://www.elastic.co/guide/en/fleet/current/fleet-overview.html\n", "baseline": 179, "textAlign": "left", "verticalAlign": "top" diff --git a/x-pack/plugins/fleet/dev_docs/tracing.md b/x-pack/plugins/fleet/dev_docs/tracing.md index 1f2d51cc214ec..e560766745043 100644 --- a/x-pack/plugins/fleet/dev_docs/tracing.md +++ b/x-pack/plugins/fleet/dev_docs/tracing.md @@ -10,7 +10,7 @@ To use it in Fleet, https://github.com/elastic/kibana/blob/a537f9af500bc3d3a6e2ceea8817ee89c474cbb0/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts#L30-L31 -
an example for startTransaction Transaction docs

Screen Shot 2020-11-02 at 9 06 50 AM

-
an example for startSpanSpan docs

Screen Shot 2020-06-02 at 9 15 42 PM

- 1. start Kibana with APM enabled (as described in [Instrumenting with Elastic APM](https://github.com/elastic/kibana/blob/master/docs/developer/getting-started/debugging.asciidoc#instrumenting-with-elastic-apm)) + 1. start Kibana with APM enabled (as described in [Instrumenting with Elastic APM](https://github.com/elastic/kibana/blob/main/docs/developer/getting-started/debugging.asciidoc#instrumenting-with-elastic-apm)) -
via env variable or config/apm.dev.js ELASTIC_APM_ACTIVE=true yarn start

or module.exports = { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx index f6ad41f69e99e..90f072852463a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx @@ -553,7 +553,7 @@ export const CreatePackagePolicyPage: React.FunctionComponent = () => { > diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_define_package_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_define_package_policy.tsx index 29c226ca64f57..e11aaabb4fd95 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_define_package_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_define_package_policy.tsx @@ -312,6 +312,34 @@ export const StepDefinePackagePolicy: React.FunctionComponent<{ /> + + + } + helpText={ + + {i18n.translate( + 'xpack.fleet.createPackagePolicy.stepConfigure.packagePolicyDataRetentionLearnMoreLink', + { defaultMessage: 'Learn more' } + )} + + ), + }} + /> + } + > +

+ + {/* Advanced vars */} {advancedVars.map((varDef) => { const { name: varName, type: varType } = varDef; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index 71dfb610a9151..f082a2931681e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -283,6 +283,7 @@ export const EditPackagePolicyForm = memo<{ // Update package policy method const updatePackagePolicy = useCallback( (updatedFields: Partial) => { + setIsEdited(true); const newPackagePolicy = { ...packagePolicy, ...updatedFields, @@ -343,6 +344,7 @@ export const EditPackagePolicyForm = memo<{ }, [from, getHref, packageInfo, policyId]); // Save package policy + const [isEdited, setIsEdited] = useState(false); const [formState, setFormState] = useState('INVALID'); const savePackagePolicy = async () => { setFormState('LOADING'); @@ -582,7 +584,8 @@ export const EditPackagePolicyForm = memo<{ { !( cname.endsWith('elastic-cloud.com') || cname.endsWith('found.io') || - cname.endsWith('found.no') + cname.endsWith('found.no') || + cname.endsWith('foundit.no') ) ) { return null; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx index 4634996d6bc73..fa9b9a7ed190e 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/integration_preference.tsx @@ -22,6 +22,8 @@ import { EuiFlexItem, } from '@elastic/eui'; +import { useStartServices } from '../../../hooks'; + export type IntegrationPreferenceType = 'recommended' | 'beats' | 'agent'; interface Option { @@ -34,23 +36,6 @@ export interface Props { onChange: (type: IntegrationPreferenceType) => void; } -const link = ( - - - -); - -const title = ( - -); - const recommendedTooltip = ( { const [idSelected, setIdSelected] = React.useState(initialType); + + const { docLinks } = useStartServices(); + + const link = ( + + + + ); + + const title = ( + + ); + const radios = options.map((option) => ({ id: option.type, value: option.type, @@ -115,6 +120,7 @@ export const IntegrationPreference = ({ initialType, onChange }: Props) => { name="preference" /> + ); }; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid.tsx index d2d361cd212a6..91bd29d14d0b3 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid.tsx @@ -18,6 +18,7 @@ import { EuiText, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; + import { FormattedMessage } from '@kbn/i18n/react'; import { Loading } from '../../../components'; @@ -32,6 +33,7 @@ export interface Props { controls?: ReactNode | ReactNode[]; title?: string; list: IntegrationCardItem[]; + featuredList?: JSX.Element | null; initialSearch?: string; setSelectedCategory: (category: string) => void; onSearchChange: (search: string) => void; @@ -48,6 +50,7 @@ export const PackageListGrid: FunctionComponent = ({ onSearchChange, setSelectedCategory, showMissingIntegrationMessage = false, + featuredList = null, callout, }) => { const [searchTerm, setSearchTerm] = useState(initialSearch || ''); @@ -106,42 +109,45 @@ export const PackageListGrid: FunctionComponent = ({ } return ( -
- - - {controlsContent} - - - - {callout ? ( - <> - - {callout} - - ) : null} - - {gridContent} - {showMissingIntegrationMessage && ( - <> - - - - )} - - -
+ <> + {featuredList} +
+ + + {controlsContent} + + + + {callout ? ( + <> + + {callout} + + ) : null} + + {gridContent} + {showMissingIntegrationMessage && ( + <> + + + + )} + + +
+ ); }; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx index 6e3eba19c52e3..c8c6f49356810 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx @@ -271,6 +271,7 @@ export function Detail() { { path: pagePathGetters.integration_details_policies({ pkgkey, + ...(integration ? { integration } : {}), })[1], }, ]; @@ -289,6 +290,7 @@ export function Detail() { { path: pagePathGetters.integration_details_overview({ pkgkey, + ...(integration ? { integration } : {}), })[1], }, ], diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx index 73de0e51bea65..f1d0717584e2e 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx @@ -8,7 +8,18 @@ import React, { memo, useMemo, useState } from 'react'; import { useLocation, useHistory, useParams } from 'react-router-dom'; import _ from 'lodash'; -import { EuiHorizontalRule, EuiFlexItem } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { + EuiHorizontalRule, + EuiFlexItem, + EuiFlexGrid, + EuiSpacer, + EuiCard, + EuiIcon, +} from '@elastic/eui'; + +import { useStartServices } from '../../../../hooks'; +import { TrackApplicationView } from '../../../../../../../../../../src/plugins/usage_collection/public'; import { pagePathGetters } from '../../../../constants'; import { @@ -98,6 +109,9 @@ export const AvailablePackages: React.FC = memo(() => { const [preference, setPreference] = useState('recommended'); useBreadcrumbs('integrations_all'); + const { http } = useStartServices(); + const addBasePath = http.basePath.prepend; + const { selectedCategory, searchParam } = getParams( useParams(), useLocation().search @@ -210,8 +224,65 @@ export const AvailablePackages: React.FC = memo(() => { return c.categories.includes(selectedCategory); }); + // TODO: Remove this hard coded list of integrations with a suggestion service + const featuredList = ( + <> + + + + } + href={addBasePath('/app/integrations/detail/endpoint/')} + title={i18n.translate('xpack.fleet.featuredSecurityTitle', { + defaultMessage: 'Endpoint Security', + })} + description={i18n.translate('xpack.fleet.featuredSecurityDesc', { + defaultMessage: + 'Protect your hosts with threat prevention, detection, and deep security data visibility.', + })} + /> + + + + + } + /> + + + + + } + href={addBasePath('/app/enterprise_search/app_search')} + title={i18n.translate('xpack.fleet.featuredSearchTitle', { + defaultMessage: 'Web site crawler', + })} + description={i18n.translate('xpack.fleet.featuredSearchDesc', { + defaultMessage: 'Add search to your website with the App Search web crawler.', + })} + /> + + + + + + ); + return ( { const { docLinks } = useStartServices(); @@ -56,10 +56,6 @@ const Callout = () => ( ); -const title = i18n.translate('xpack.fleet.epmList.installedTitle', { - defaultMessage: 'Installed integrations', -}); - // TODO: clintandrewhall - this component is hard to test due to the hooks, particularly those that use `http` // or `location` to load data. Ideally, we'll split this into "connected" and "pure" components. export const InstalledPackages: React.FC = memo(() => { @@ -115,7 +111,7 @@ export const InstalledPackages: React.FC = memo(() => { const categories: CategoryFacet[] = useMemo( () => [ { - ...ALL_CATEGORY, + ...INSTALLED_CATEGORY, count: allInstalledPackages.length, }, { @@ -153,7 +149,7 @@ export const InstalledPackages: React.FC = memo(() => { return ( (({ agentPolicy, agentPolicies }) => { const { getHref } = useLink(); const core = useStartServices(); @@ -40,12 +51,34 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol const [selectedPolicyId, setSelectedPolicyId] = useState(agentPolicy?.id); const [fullAgentPolicy, setFullAgentPolicy] = useState(); + const [isK8s, setIsK8s] = useState<'IS_LOADING' | 'IS_KUBERNETES' | 'IS_NOT_KUBERNETES'>( + 'IS_LOADING' + ); + const [yaml, setYaml] = useState(''); + const runInstructions = + isK8s === 'IS_KUBERNETES' ? KUBERNETES_RUN_INSTRUCTIONS : STANDALONE_RUN_INSTRUCTIONS; - const downloadLink = selectedPolicyId - ? core.http.basePath.prepend( - `${agentPolicyRouteService.getInfoFullDownloadPath(selectedPolicyId)}?standalone=true` - ) - : undefined; + useEffect(() => { + async function checkifK8s() { + if (!selectedPolicyId) { + return; + } + const agentPolicyRequest = await sendGetOneAgentPolicy(selectedPolicyId); + const agentPol = agentPolicyRequest.data ? agentPolicyRequest.data.item : null; + + if (!agentPol) { + setIsK8s('IS_NOT_KUBERNETES'); + return; + } + const k8s = (pkg: PackagePolicy) => pkg.package?.name === FLEET_KUBERNETES_PACKAGE; + setIsK8s( + (agentPol.package_policies as PackagePolicy[]).some(k8s) + ? 'IS_KUBERNETES' + : 'IS_NOT_KUBERNETES' + ); + } + checkifK8s(); + }, [selectedPolicyId, notifications.toasts]); useEffect(() => { async function fetchFullPolicy() { @@ -53,7 +86,11 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol if (!selectedPolicyId) { return; } - const res = await sendGetOneAgentPolicyFull(selectedPolicyId, { standalone: true }); + let query = { standalone: true, kubernetes: false }; + if (isK8s === 'IS_KUBERNETES') { + query = { standalone: true, kubernetes: true }; + } + const res = await sendGetOneAgentPolicyFull(selectedPolicyId, query); if (res.error) { throw res.error; } @@ -61,7 +98,6 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol if (!res.data) { throw new Error('No data while fetching full agent policy'); } - setFullAgentPolicy(res.data.item); } catch (error) { notifications.toasts.addError(error, { @@ -69,10 +105,86 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol }); } } - fetchFullPolicy(); - }, [selectedPolicyId, notifications.toasts]); + if (isK8s !== 'IS_LOADING') { + fetchFullPolicy(); + } + }, [selectedPolicyId, notifications.toasts, isK8s, core.http.basePath]); + + useEffect(() => { + if (isK8s === 'IS_KUBERNETES') { + if (typeof fullAgentPolicy === 'object') { + return; + } + setYaml(fullAgentPolicy); + } else { + if (typeof fullAgentPolicy === 'string') { + return; + } + setYaml(fullAgentPolicyToYaml(fullAgentPolicy, safeDump)); + } + }, [fullAgentPolicy, isK8s]); + + const policyMsg = + isK8s === 'IS_KUBERNETES' ? ( + ES_USERNAME, + ESPasswordVariable: ES_PASSWORD, + }} + /> + ) : ( + elastic-agent.yml, + ESUsernameVariable: ES_USERNAME, + ESPasswordVariable: ES_PASSWORD, + outputSection: outputs, + }} + /> + ); + + let downloadLink = ''; + if (selectedPolicyId) { + downloadLink = + isK8s === 'IS_KUBERNETES' + ? core.http.basePath.prepend( + `${agentPolicyRouteService.getInfoFullDownloadPath(selectedPolicyId)}?kubernetes=true` + ) + : core.http.basePath.prepend( + `${agentPolicyRouteService.getInfoFullDownloadPath(selectedPolicyId)}?standalone=true` + ); + } + + const downloadMsg = + isK8s === 'IS_KUBERNETES' ? ( + + ) : ( + + ); + + const applyMsg = + isK8s === 'IS_KUBERNETES' ? ( + + ) : ( + + ); - const yaml = useMemo(() => fullAgentPolicyToYaml(fullAgentPolicy, safeDump), [fullAgentPolicy]); const steps = [ DownloadStep(), !agentPolicy @@ -85,16 +197,7 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol children: ( <> - elastic-agent.yml, - ESUsernameVariable: ES_USERNAME, - ESPasswordVariable: ES_PASSWORD, - outputSection: outputs, - }} - /> + <>{policyMsg} @@ -111,10 +214,7 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol - + <>{downloadMsg} @@ -133,14 +233,11 @@ export const StandaloneInstructions = React.memo(({ agentPolicy, agentPol children: ( <> - + <>{applyMsg} - {RUN_INSTRUCTIONS} + {runInstructions} - + {(copy) => ( { export const sendGetOneAgentPolicyFull = ( agentPolicyId: string, - query: { standalone?: boolean } = {} + query: { standalone?: boolean; kubernetes?: boolean } = {} ) => { return sendRequest({ path: agentPolicyRouteService.getInfoFullPath(agentPolicyId), diff --git a/x-pack/plugins/fleet/public/search_provider.test.ts b/x-pack/plugins/fleet/public/search_provider.test.ts index ef6bda44d512b..97ed199c44502 100644 --- a/x-pack/plugins/fleet/public/search_provider.test.ts +++ b/x-pack/plugins/fleet/public/search_provider.test.ts @@ -87,22 +87,22 @@ describe('Package search provider', () => { ).toBe('--(a|)', { a: [ { - id: 'test-test', + id: 'test', score: 80, title: 'test', type: 'integration', url: { - path: 'undefined/detail/test-test/overview', + path: 'undefined/detail/test/overview', prependBasePath: false, }, }, { - id: 'test1-test1', + id: 'test1', score: 80, title: 'test1', type: 'integration', url: { - path: 'undefined/detail/test1-test1/overview', + path: 'undefined/detail/test1/overview', prependBasePath: false, }, }, @@ -170,12 +170,12 @@ describe('Package search provider', () => { ).toBe('--(a|)', { a: [ { - id: 'test1-test1', + id: 'test1', score: 80, title: 'test1', type: 'integration', url: { - path: 'undefined/detail/test1-test1/overview', + path: 'undefined/detail/test1/overview', prependBasePath: false, }, }, @@ -226,22 +226,22 @@ describe('Package search provider', () => { ).toBe('--(a|)', { a: [ { - id: 'test-test', + id: 'test', score: 80, title: 'test', type: 'integration', url: { - path: 'undefined/detail/test-test/overview', + path: 'undefined/detail/test/overview', prependBasePath: false, }, }, { - id: 'test1-test1', + id: 'test1', score: 80, title: 'test1', type: 'integration', url: { - path: 'undefined/detail/test1-test1/overview', + path: 'undefined/detail/test1/overview', prependBasePath: false, }, }, @@ -269,12 +269,12 @@ describe('Package search provider', () => { ).toBe('--(a|)', { a: [ { - id: 'test1-test1', + id: 'test1', score: 80, title: 'test1', type: 'integration', url: { - path: 'undefined/detail/test1-test1/overview', + path: 'undefined/detail/test1/overview', prependBasePath: false, }, }, diff --git a/x-pack/plugins/fleet/public/search_provider.ts b/x-pack/plugins/fleet/public/search_provider.ts index 403abf89715c8..d919462f38c28 100644 --- a/x-pack/plugins/fleet/public/search_provider.ts +++ b/x-pack/plugins/fleet/public/search_provider.ts @@ -53,21 +53,19 @@ export const toSearchResult = ( pkg: PackageListItem, application: ApplicationStart, basePath: IBasePath -): GlobalSearchProviderResult => { - const pkgkey = `${pkg.name}-${pkg.version}`; - return { - id: pkgkey, - type: packageType, - title: pkg.title, - score: 80, - icon: getEuiIconType(pkg, basePath), - url: { - // prettier-ignore - path: `${application.getUrlForApp(INTEGRATIONS_PLUGIN_ID)}${pagePathGetters.integration_details_overview({ pkgkey })[1]}`, - prependBasePath: false, - }, - }; -}; +): GlobalSearchProviderResult => ({ + id: pkg.name, + type: packageType, + title: pkg.title, + score: 80, + icon: getEuiIconType(pkg, basePath), + url: { + path: `${application.getUrlForApp(INTEGRATIONS_PLUGIN_ID)}${ + pagePathGetters.integration_details_overview({ pkgkey: pkg.name })[1] + }`, + prependBasePath: false, + }, +}); export const createPackageSearchProvider = (core: CoreSetup): GlobalSearchResultProvider => { const coreStart$ = from(core.getStartServices()).pipe( diff --git a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts index b3197d918d231..c3da75183f581 100644 --- a/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts @@ -34,6 +34,7 @@ import type { CopyAgentPolicyResponse, DeleteAgentPolicyResponse, GetFullAgentPolicyResponse, + GetFullAgentConfigMapResponse, } from '../../../common'; import { defaultIngestErrorHandler } from '../../errors'; @@ -232,27 +233,52 @@ export const getFullAgentPolicy: RequestHandler< > = async (context, request, response) => { const soClient = context.core.savedObjects.client; - try { - const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy( - soClient, - request.params.agentPolicyId, - { standalone: request.query.standalone === true } - ); - if (fullAgentPolicy) { - const body: GetFullAgentPolicyResponse = { - item: fullAgentPolicy, - }; - return response.ok({ - body, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent policy not found' }, - }); + if (request.query.kubernetes === true) { + try { + const fullAgentConfigMap = await agentPolicyService.getFullAgentConfigMap( + soClient, + request.params.agentPolicyId, + { standalone: request.query.standalone === true } + ); + if (fullAgentConfigMap) { + const body: GetFullAgentConfigMapResponse = { + item: fullAgentConfigMap, + }; + return response.ok({ + body, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent config map not found' }, + }); + } + } catch (error) { + return defaultIngestErrorHandler({ error, response }); + } + } else { + try { + const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy( + soClient, + request.params.agentPolicyId, + { standalone: request.query.standalone === true } + ); + if (fullAgentPolicy) { + const body: GetFullAgentPolicyResponse = { + item: fullAgentPolicy, + }; + return response.ok({ + body, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent policy not found' }, + }); + } + } catch (error) { + return defaultIngestErrorHandler({ error, response }); } - } catch (error) { - return defaultIngestErrorHandler({ error, response }); } }; @@ -265,27 +291,55 @@ export const downloadFullAgentPolicy: RequestHandler< params: { agentPolicyId }, } = request; - try { - const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy(soClient, agentPolicyId, { - standalone: request.query.standalone === true, - }); - if (fullAgentPolicy) { - const body = fullAgentPolicyToYaml(fullAgentPolicy, safeDump); - const headers: ResponseHeaders = { - 'content-type': 'text/x-yaml', - 'content-disposition': `attachment; filename="elastic-agent.yml"`, - }; - return response.ok({ - body, - headers, - }); - } else { - return response.customError({ - statusCode: 404, - body: { message: 'Agent policy not found' }, + if (request.query.kubernetes === true) { + try { + const fullAgentConfigMap = await agentPolicyService.getFullAgentConfigMap( + soClient, + request.params.agentPolicyId, + { standalone: request.query.standalone === true } + ); + if (fullAgentConfigMap) { + const body = fullAgentConfigMap; + const headers: ResponseHeaders = { + 'content-type': 'text/x-yaml', + 'content-disposition': `attachment; filename="elastic-agent-standalone-kubernetes.yaml"`, + }; + return response.ok({ + body, + headers, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent config map not found' }, + }); + } + } catch (error) { + return defaultIngestErrorHandler({ error, response }); + } + } else { + try { + const fullAgentPolicy = await agentPolicyService.getFullAgentPolicy(soClient, agentPolicyId, { + standalone: request.query.standalone === true, }); + if (fullAgentPolicy) { + const body = fullAgentPolicyToYaml(fullAgentPolicy, safeDump); + const headers: ResponseHeaders = { + 'content-type': 'text/x-yaml', + 'content-disposition': `attachment; filename="elastic-agent.yml"`, + }; + return response.ok({ + body, + headers, + }); + } else { + return response.customError({ + statusCode: 404, + body: { message: 'Agent policy not found' }, + }); + } + } catch (error) { + return defaultIngestErrorHandler({ error, response }); } - } catch (error) { - return defaultIngestErrorHandler({ error, response }); } }; diff --git a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts index 073ff7806d9fe..050b1a2441fed 100644 --- a/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/data_streams/handlers.ts @@ -6,7 +6,7 @@ */ import type { estypes } from '@elastic/elasticsearch'; import { keyBy, keys, merge } from 'lodash'; -import type { RequestHandler, SavedObjectsBulkGetObject } from 'src/core/server'; +import type { RequestHandler } from 'src/core/server'; import type { DataStream } from '../../types'; import { KibanaSavedObjectType } from '../../../common'; @@ -15,7 +15,6 @@ import { getPackageSavedObjects } from '../../services/epm/packages/get'; import { defaultIngestErrorHandler } from '../../errors'; const DATA_STREAM_INDEX_PATTERN = 'logs-*-*,metrics-*-*,traces-*-*,synthetics-*-*'; - interface ESDataStreamInfo { name: string; timestamp_field: { @@ -94,17 +93,12 @@ export const getListHandler: RequestHandler = async (context, request, response) const allDashboardSavedObjectsResponse = await context.core.savedObjects.client.bulkGet<{ title?: string; }>( - Object.values(dashboardIdsByPackageName).reduce( - (allDashboards, dashboardIds) => { - return allDashboards.concat( - dashboardIds.map((id) => ({ - id, - type: KibanaSavedObjectType.dashboard, - fields: ['title'], - })) - ); - }, - [] + Object.values(dashboardIdsByPackageName).flatMap((dashboardIds) => + dashboardIds.map((id) => ({ + id, + type: KibanaSavedObjectType.dashboard, + fields: ['title'], + })) ) ); // Ignore dashboards not found @@ -142,12 +136,12 @@ export const getListHandler: RequestHandler = async (context, request, response) const { body: { aggregations: dataStreamAggs }, } = await esClient.search({ - index: dataStream.indices.map((index) => index.index_name), + index: dataStream.name, body: { size: 0, query: { bool: { - must: [ + filter: [ { exists: { field: 'data_stream.namespace', @@ -234,7 +228,7 @@ export const getListHandler: RequestHandler = async (context, request, response) return dataStreamResponse; }); - // Return final data streams objects sorted by last activity, decending + // Return final data streams objects sorted by last activity, descending // After filtering out data streams that are missing dataset/namespace/type fields body.data_streams = (await Promise.all(dataStreamPromises)) .filter(({ dataset, namespace, type }) => dataset && namespace && type) diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index f0b51b19dda33..e8fda952f17e6 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -44,7 +44,7 @@ import { } from './migrations/to_v7_13_0'; import { migratePackagePolicyToV7140, migrateInstallationToV7140 } from './migrations/to_v7_14_0'; import { migratePackagePolicyToV7150 } from './migrations/to_v7_15_0'; -import { migrateInstallationToV7160 } from './migrations/to_v7_16_0'; +import { migrateInstallationToV7160, migratePackagePolicyToV7160 } from './migrations/to_v7_16_0'; /* * Saved object types and mappings @@ -294,6 +294,7 @@ const getSavedObjectTypes = ( '7.13.0': migratePackagePolicyToV7130, '7.14.0': migratePackagePolicyToV7140, '7.15.0': migratePackagePolicyToV7150, + '7.16.0': migratePackagePolicyToV7160, }, }, [PACKAGES_SAVED_OBJECT_TYPE]: { diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_16_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_16_0.ts index 7d12c550ec406..b69523434408b 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_16_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_16_0.ts @@ -7,9 +7,11 @@ import type { SavedObjectMigrationFn } from 'kibana/server'; -import type { Installation } from '../../../common'; +import type { Installation, PackagePolicy } from '../../../common'; import { AUTO_UPDATE_PACKAGES, DEFAULT_PACKAGES } from '../../../common'; +import { migratePackagePolicyToV7160 as SecSolMigratePackagePolicyToV7160 } from './security_solution'; + export const migrateInstallationToV7160: SavedObjectMigrationFn = ( installationDoc, migrationContext @@ -26,3 +28,17 @@ export const migrateInstallationToV7160: SavedObjectMigrationFn = ( + packagePolicyDoc, + migrationContext +) => { + let updatedPackagePolicyDoc = packagePolicyDoc; + + // Endpoint specific migrations + if (packagePolicyDoc.attributes.package?.name === 'endpoint') { + updatedPackagePolicyDoc = SecSolMigratePackagePolicyToV7160(packagePolicyDoc, migrationContext); + } + + return updatedPackagePolicyDoc; +}; diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts index 561c463b998d4..60cf9c8d96257 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts @@ -70,12 +70,14 @@ export async function getFullAgentPolicy( if (!monitoringOutput) { throw new Error(`Monitoring output not found ${monitoringOutputId}`); } - const fullAgentPolicy: FullAgentPolicy = { id: agentPolicy.id, outputs: { ...outputs.reduce((acc, output) => { - acc[getOutputIdForAgentPolicy(output)] = transformOutputToFullPolicyOutput(output); + acc[getOutputIdForAgentPolicy(output)] = transformOutputToFullPolicyOutput( + output, + standalone + ); return acc; }, {}), @@ -179,8 +181,8 @@ function transformOutputToFullPolicyOutput( if (standalone) { delete newOutput.api_key; - newOutput.username = 'ES_USERNAME'; - newOutput.password = 'ES_PASSWORD'; + newOutput.username = '{ES_USERNAME}'; + newOutput.password = '{ES_PASSWORD}'; } return newOutput; diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 6ebe890aeaef2..321bc7f289594 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -13,6 +13,8 @@ import type { SavedObjectsBulkUpdateResponse, } from 'src/core/server'; +import { safeDump } from 'js-yaml'; + import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; import type { AuthenticatedUser } from '../../../security/server'; @@ -41,6 +43,12 @@ import type { } from '../../common'; import { AgentPolicyNameExistsError, HostedAgentPolicyRestrictionRelatedError } from '../errors'; +import type { FullAgentConfigMap } from '../../common/types/models/agent_cm'; + +import { fullAgentConfigMapToYaml } from '../../common/services/agent_cm_to_yaml'; + +import { elasticAgentManifest } from './elastic_agent_manifest'; + import { getPackageInfo } from './epm/packages'; import { getAgentsByKuery } from './agents'; import { packagePolicyService } from './package_policy'; @@ -49,7 +57,6 @@ import { agentPolicyUpdateEventHandler } from './agent_policy_update'; import { normalizeKuery, escapeSearchQueryPhrase } from './saved_object'; import { appContextService } from './app_context'; import { getFullAgentPolicy } from './agent_policies'; - const SAVED_OBJECT_TYPE = AGENT_POLICY_SAVED_OBJECT_TYPE; class AgentPolicyService { @@ -717,6 +724,40 @@ class AgentPolicyService { return res.body.hits.hits[0]._source; } + public async getFullAgentConfigMap( + soClient: SavedObjectsClientContract, + id: string, + options?: { standalone: boolean } + ): Promise { + const fullAgentPolicy = await getFullAgentPolicy(soClient, id, options); + if (fullAgentPolicy) { + const fullAgentConfigMap: FullAgentConfigMap = { + apiVersion: 'v1', + kind: 'ConfigMap', + metadata: { + name: 'agent-node-datastreams', + namespace: 'kube-system', + labels: { + 'k8s-app': 'elastic-agent', + }, + }, + data: { + 'agent.yml': fullAgentPolicy, + }, + }; + + const configMapYaml = fullAgentConfigMapToYaml(fullAgentConfigMap, safeDump); + const updateManifestVersion = elasticAgentManifest.replace( + 'VERSION', + appContextService.getKibanaVersion() + ); + const fixedAgentYML = configMapYaml.replace('agent.yml:', 'agent.yml: |-'); + return [fixedAgentYML, updateManifestVersion].join('\n'); + } else { + return ''; + } + } + public async getFullAgentPolicy( soClient: SavedObjectsClientContract, id: string, diff --git a/x-pack/plugins/fleet/server/services/agents/helpers.ts b/x-pack/plugins/fleet/server/services/agents/helpers.ts index 195b2567c24ae..74fdd51ab0f8b 100644 --- a/x-pack/plugins/fleet/server/services/agents/helpers.ts +++ b/x-pack/plugins/fleet/server/services/agents/helpers.ts @@ -42,5 +42,9 @@ export function agentSOAttributesToFleetServerAgentDoc( doc.policy_revision_idx = policyRevison; } + if (!doc.updated_at) { + doc.updated_at = new Date().toISOString(); + } + return doc; } diff --git a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts new file mode 100644 index 0000000000000..392ee170d02ad --- /dev/null +++ b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts @@ -0,0 +1,222 @@ +/* + * Copyright 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 elasticAgentManifest = ` +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: elastic-agent + namespace: kube-system + labels: + app: elastic-agent +spec: + selector: + matchLabels: + app: elastic-agent + template: + metadata: + labels: + app: elastic-agent + spec: + tolerations: + - key: node-role.kubernetes.io/master + effect: NoSchedule + serviceAccountName: elastic-agent + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + containers: + - name: elastic-agent + image: docker.elastic.co/beats/elastic-agent:VERSION + args: [ + "-c", "/etc/agent.yml", + "-e", + "-d", "'*'", + ] + env: + - name: ES_USERNAME + value: "elastic" + - name: ES_PASSWORD + value: "changeme" + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + securityContext: + runAsUser: 0 + resources: + limits: + memory: 500Mi + requests: + cpu: 100m + memory: 200Mi + volumeMounts: + - name: datastreams + mountPath: /etc/agent.yml + readOnly: true + subPath: agent.yml + - name: proc + mountPath: /hostfs/proc + readOnly: true + - name: cgroup + mountPath: /hostfs/sys/fs/cgroup + readOnly: true + - name: varlibdockercontainers + mountPath: /var/lib/docker/containers + readOnly: true + - name: varlog + mountPath: /var/log + readOnly: true + volumes: + - name: datastreams + configMap: + defaultMode: 0640 + name: agent-node-datastreams + - name: proc + hostPath: + path: /proc + - name: cgroup + hostPath: + path: /sys/fs/cgroup + - name: varlibdockercontainers + hostPath: + path: /var/lib/docker/containers + - name: varlog + hostPath: + path: /var/log +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: elastic-agent +subjects: + - kind: ServiceAccount + name: elastic-agent + namespace: kube-system +roleRef: + kind: ClusterRole + name: elastic-agent + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + namespace: kube-system + name: elastic-agent +subjects: + - kind: ServiceAccount + name: elastic-agent + namespace: kube-system +roleRef: + kind: Role + name: elastic-agent + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: elastic-agent-kubeadm-config + namespace: kube-system +subjects: + - kind: ServiceAccount + name: elastic-agent + namespace: kube-system +roleRef: + kind: Role + name: elastic-agent-kubeadm-config + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: elastic-agent + labels: + k8s-app: elastic-agent +rules: + - apiGroups: [""] + resources: + - nodes + - namespaces + - events + - pods + - services + - configmaps + verbs: ["get", "list", "watch"] + # Enable this rule only if planing to use kubernetes_secrets provider + #- apiGroups: [""] + # resources: + # - secrets + # verbs: ["get"] + - apiGroups: ["extensions"] + resources: + - replicasets + verbs: ["get", "list", "watch"] + - apiGroups: ["apps"] + resources: + - statefulsets + - deployments + - replicasets + verbs: ["get", "list", "watch"] + - apiGroups: ["batch"] + resources: + - jobs + verbs: ["get", "list", "watch"] + - apiGroups: + - "" + resources: + - nodes/stats + verbs: + - get + # required for apiserver + - nonResourceURLs: + - "/metrics" + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: elastic-agent + # should be the namespace where elastic-agent is running + namespace: kube-system + labels: + k8s-app: elastic-agent +rules: + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: ["get", "create", "update"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: elastic-agent-kubeadm-config + namespace: kube-system + labels: + k8s-app: elastic-agent +rules: + - apiGroups: [""] + resources: + - configmaps + resourceNames: + - kubeadm-config + verbs: ["get"] +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: elastic-agent + namespace: kube-system + labels: + k8s-app: elastic-agent +--- +`; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/cleanup.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/cleanup.test.ts index 482e42a46060e..07fd2d400b8d5 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/cleanup.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/cleanup.test.ts @@ -17,7 +17,7 @@ import { removeOldAssets } from './cleanup'; jest.mock('../..', () => ({ appContextService: { getLogger: () => ({ - info: jest.fn(), + debug: jest.fn(), }), }, })); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/cleanup.ts b/x-pack/plugins/fleet/server/services/epm/packages/cleanup.ts index d70beb53eddab..87eaa82aa85f0 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/cleanup.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/cleanup.ts @@ -57,7 +57,7 @@ async function removeAssetsFromVersion( if (total > 0) { appContextService .getLogger() - .info(`Package "${pkgName}-${oldVersion}" still being used by policies`); + .debug(`Package "${pkgName}-${oldVersion}" still being used by policies`); return; } diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 9dc05ee2cb4ba..46747762213f1 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -128,6 +128,12 @@ jest.mock('./agent_policy', () => { }; }); +jest.mock('./epm/packages/cleanup', () => { + return { + removeOldAssets: jest.fn(), + }; +}); + const mockedFetchInfo = fetchInfo as jest.Mock>; type CombinedExternalCallback = PutPackagePolicyUpdateCallback | PostPackagePolicyCreateCallback; @@ -572,6 +578,12 @@ describe('Package policy service', () => { }); describe('update', () => { + beforeEach(() => { + appContextService.start(createAppContextStartContractMock()); + }); + afterEach(() => { + appContextService.stop(); + }); it('should fail to update on version conflict', async () => { const savedObjectsClient = savedObjectsClientMock.create(); savedObjectsClient.get.mockResolvedValue({ diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index 9928ce3063159..c03ccfc43ebd8 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -9,7 +9,7 @@ import { omit, partition } from 'lodash'; import { i18n } from '@kbn/i18n'; import semverLte from 'semver/functions/lte'; import { getFlattenedObject } from '@kbn/std'; -import type { KibanaRequest } from 'src/core/server'; +import type { KibanaRequest, LogMeta } from 'src/core/server'; import type { ElasticsearchClient, RequestHandlerContext, @@ -84,6 +84,17 @@ export const DATA_STREAM_ALLOWED_INDEX_PRIVILEGES = new Set([ 'read_cross_cluster', ]); +interface PackagePolicyUpgradeLogMeta extends LogMeta { + package_policy_upgrade: { + package_name: string; + current_version: string; + new_version: string; + status: 'success' | 'failure'; + error?: any[]; + dryRun?: boolean; + }; +} + class PackagePolicyService { public async create( soClient: SavedObjectsClientContract, @@ -424,7 +435,34 @@ class PackagePolicyService { user: options?.user, }); - return (await this.get(soClient, id)) as PackagePolicy; + const newPolicy = (await this.get(soClient, id)) as PackagePolicy; + + if (packagePolicy.package) { + await removeOldAssets({ + soClient, + pkgName: packagePolicy.package.name, + currentVersion: packagePolicy.package.version, + }); + + const upgradeMeta: PackagePolicyUpgradeLogMeta = { + package_policy_upgrade: { + package_name: packagePolicy.package.name, + new_version: packagePolicy.package.version, + current_version: 'unknown', + status: 'success', + dryRun: false, + }, + }; + + appContextService + .getLogger() + .info( + `Package policy successfully upgraded ${JSON.stringify(upgradeMeta)}`, + upgradeMeta + ); + } + + return newPolicy; } public async delete( @@ -596,11 +634,6 @@ class PackagePolicyService { name: packagePolicy.name, success: true, }); - await removeOldAssets({ - soClient, - pkgName: packageInfo.name, - currentVersion: packageInfo.version, - }); } catch (error) { // We only want to specifically handle validation errors for the new package policy. If a more severe or // general error is thrown elsewhere during the upgrade process, we want to surface that directly in @@ -656,6 +689,27 @@ class PackagePolicyService { const hasErrors = 'errors' in updatedPackagePolicy; + if (packagePolicy.package.version !== packageInfo.version) { + const upgradeMeta: PackagePolicyUpgradeLogMeta = { + package_policy_upgrade: { + package_name: packageInfo.name, + current_version: packagePolicy.package.version, + new_version: packageInfo.version, + status: hasErrors ? 'failure' : 'success', + error: hasErrors ? updatedPackagePolicy.errors : undefined, + dryRun: true, + }, + }; + appContextService + .getLogger() + .info( + `Package policy upgrade dry run ${ + hasErrors ? 'resulted in errors' : 'ran successfully' + } ${JSON.stringify(upgradeMeta)}`, + upgradeMeta + ); + } + return { name: updatedPackagePolicy.name, diff: [packagePolicy, updatedPackagePolicy], diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts index 102b059515151..c900cd85c4389 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts @@ -9,7 +9,11 @@ import { elasticsearchServiceMock, savedObjectsClientMock } from 'src/core/serve import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; -import type { PreconfiguredAgentPolicy, PreconfiguredOutput } from '../../common/types'; +import type { + InstallResult, + PreconfiguredAgentPolicy, + PreconfiguredOutput, +} from '../../common/types'; import type { AgentPolicy, NewPackagePolicy, Output } from '../types'; import { AGENT_POLICY_SAVED_OBJECT_TYPE } from '../constants'; @@ -30,6 +34,7 @@ jest.mock('./output'); const mockedOutputService = outputService as jest.Mocked; const mockInstalledPackages = new Map(); +const mockInstallPackageErrors = new Map(); const mockConfiguredPolicies = new Map(); const mockDefaultOutput: Output = { @@ -99,8 +104,22 @@ function getPutPreconfiguredPackagesMock() { } jest.mock('./epm/packages/install', () => ({ - installPackage({ pkgkey, force }: { pkgkey: string; force?: boolean }) { + async installPackage({ + pkgkey, + force, + }: { + pkgkey: string; + force?: boolean; + }): Promise { const [pkgName, pkgVersion] = pkgkey.split('-'); + const installError = mockInstallPackageErrors.get(pkgName); + if (installError) { + return { + error: new Error(installError), + installType: 'install', + }; + } + const installedPackage = mockInstalledPackages.get(pkgName); if (installedPackage) { if (installedPackage.version === pkgVersion) return installedPackage; @@ -109,7 +128,10 @@ jest.mock('./epm/packages/install', () => ({ const packageInstallation = { name: pkgName, version: pkgVersion, title: pkgName }; mockInstalledPackages.set(pkgName, packageInstallation); - return packageInstallation; + return { + status: 'installed', + installType: 'install', + }; }, ensurePackagesCompletedInstall() { return []; @@ -133,6 +155,8 @@ jest.mock('./epm/packages/get', () => ({ }, })); +jest.mock('./epm/kibana/index_pattern/install'); + jest.mock('./package_policy', () => ({ ...jest.requireActual('./package_policy'), packagePolicyService: { @@ -177,6 +201,7 @@ const spyAgentPolicyServicBumpAllAgentPoliciesForOutput = jest.spyOn( describe('policy preconfiguration', () => { beforeEach(() => { mockInstalledPackages.clear(); + mockInstallPackageErrors.clear(); mockConfiguredPolicies.clear(); spyAgentPolicyServiceUpdate.mockClear(); spyAgentPolicyServicBumpAllAgentPoliciesForOutput.mockClear(); @@ -266,7 +291,7 @@ describe('policy preconfiguration', () => { ); }); - it('should not create a policy if we are not able to add packages ', async () => { + it('should not create a policy and throw an error if install fails for required package', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; const policies: PreconfiguredAgentPolicy[] = [ @@ -282,23 +307,48 @@ describe('policy preconfiguration', () => { ], }, ]; + mockInstallPackageErrors.set('test_package', 'REGISTRY ERROR'); - let error; - try { - await ensurePreconfiguredPackagesAndPolicies( + await expect( + ensurePreconfiguredPackagesAndPolicies( soClient, esClient, policies, - [{ name: 'CANNOT_MATCH', version: 'x.y.z' }], + [{ name: 'test_package', version: '3.0.0' }], mockDefaultOutput - ); - } catch (err) { - error = err; - } + ) + ).rejects.toThrow( + '[Test policy] could not be added. [test_package] could not be installed due to error: [Error: REGISTRY ERROR]' + ); + }); - expect(error).toBeDefined(); - expect(error.message).toEqual( - 'Test policy could not be added. test_package is not installed, add test_package to `xpack.fleet.packages` or remove it from Test package.' + it('should not create a policy and throw an error if package is not installed for an unknown reason', async () => { + const soClient = getPutPreconfiguredPackagesMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + const policies: PreconfiguredAgentPolicy[] = [ + { + name: 'Test policy', + namespace: 'default', + id: 'test-id', + package_policies: [ + { + package: { name: 'test_package' }, + name: 'Test package', + }, + ], + }, + ]; + + await expect( + ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + policies, + [{ name: 'CANNOT_MATCH', version: 'x.y.z' }], + mockDefaultOutput + ) + ).rejects.toThrow( + '[Test policy] could not be added. [test_package] is not installed, add [test_package] to [xpack.fleet.packages] or remove it from [Test package].' ); }); it('should not attempt to recreate or modify an agent policy if its ID is unchanged', async () => { diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.ts b/x-pack/plugins/fleet/server/services/preconfiguration.ts index 3b322e1112d6a..d171030b06a81 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.ts @@ -147,6 +147,8 @@ export async function ensurePreconfiguredPackagesAndPolicies( packages: PreconfiguredPackage[] = [], defaultOutput: Output ): Promise { + const logger = appContextService.getLogger(); + // Validate configured packages to ensure there are no version conflicts const packageNames = groupBy(packages, (pkg) => pkg.name); const duplicatePackages = Object.entries(packageNames).filter( @@ -181,15 +183,20 @@ export async function ensurePreconfiguredPackagesAndPolicies( }); const fulfilledPackages = []; - const rejectedPackages = []; + const rejectedPackages: PreconfigurationError[] = []; for (let i = 0; i < preconfiguredPackages.length; i++) { const packageResult = preconfiguredPackages[i]; - if ('error' in packageResult) + if ('error' in packageResult) { + logger.warn( + `Failed installing package [${packages[i].name}] due to error: [${packageResult.error}]` + ); rejectedPackages.push({ package: { name: packages[i].name, version: packages[i].version }, error: packageResult.error, - } as PreconfigurationError); - else fulfilledPackages.push(packageResult); + }); + } else { + fulfilledPackages.push(packageResult); + } } // Keeping this outside of the Promise.all because it introduces a race condition. @@ -264,14 +271,14 @@ export async function ensurePreconfiguredPackagesAndPolicies( ); const fulfilledPolicies = []; - const rejectedPolicies = []; + const rejectedPolicies: PreconfigurationError[] = []; for (let i = 0; i < preconfiguredPolicies.length; i++) { const policyResult = preconfiguredPolicies[i]; if (policyResult.status === 'rejected') { rejectedPolicies.push({ error: policyResult.reason as Error, agentPolicy: { name: policies[i].name }, - } as PreconfigurationError); + }); continue; } fulfilledPolicies.push(policyResult.value); @@ -288,10 +295,25 @@ export async function ensurePreconfiguredPackagesAndPolicies( pkgName: pkg.name, }); if (!installedPackage) { + const rejectedPackage = rejectedPackages.find((rp) => rp.package?.name === pkg.name); + + if (rejectedPackage) { + throw new Error( + i18n.translate('xpack.fleet.preconfiguration.packageRejectedError', { + defaultMessage: `[{agentPolicyName}] could not be added. [{pkgName}] could not be installed due to error: [{errorMessage}]`, + values: { + agentPolicyName: preconfiguredAgentPolicy.name, + pkgName: pkg.name, + errorMessage: rejectedPackage.error.toString(), + }, + }) + ); + } + throw new Error( i18n.translate('xpack.fleet.preconfiguration.packageMissingError', { defaultMessage: - '{agentPolicyName} could not be added. {pkgName} is not installed, add {pkgName} to `{packagesConfigValue}` or remove it from {packagePolicyName}.', + '[{agentPolicyName}] could not be added. [{pkgName}] is not installed, add [{pkgName}] to [{packagesConfigValue}] or remove it from [{packagePolicyName}].', values: { agentPolicyName: preconfiguredAgentPolicy.name, packagePolicyName: name, diff --git a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts index 714ffab922dd9..64d142f150bfd 100644 --- a/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/rest_spec/agent_policy.ts @@ -56,5 +56,6 @@ export const GetFullAgentPolicyRequestSchema = { query: schema.object({ download: schema.maybe(schema.boolean()), standalone: schema.maybe(schema.boolean()), + kubernetes: schema.maybe(schema.boolean()), }), }; diff --git a/x-pack/plugins/fleet/storybook/manager.ts b/x-pack/plugins/fleet/storybook/manager.ts index 471a735ed370f..193364f06a62e 100644 --- a/x-pack/plugins/fleet/storybook/manager.ts +++ b/x-pack/plugins/fleet/storybook/manager.ts @@ -13,7 +13,7 @@ addons.setConfig({ theme: create({ base: 'light', brandTitle: 'Kibana Fleet Storybook', - brandUrl: 'https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet', + brandUrl: 'https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet', }), showPanel: true.valueOf, selectedPanel: PANEL_ID, diff --git a/x-pack/plugins/global_search_bar/public/components/__snapshots__/search_bar.test.tsx.snap b/x-pack/plugins/global_search_bar/public/components/__snapshots__/search_bar.test.tsx.snap deleted file mode 100644 index 8433d98c232d6..0000000000000 --- a/x-pack/plugins/global_search_bar/public/components/__snapshots__/search_bar.test.tsx.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`SearchBar correctly filters and sorts results 1`] = ` -Array [ - "Canvas • Kibana", - "Discover • Kibana", - "Graph • Kibana", -] -`; - -exports[`SearchBar correctly filters and sorts results 2`] = ` -Array [ - "Discover • Kibana", - "My Dashboard • Test", -] -`; - -exports[`SearchBar only display results from the last search 1`] = ` -Array [ - "Visualize • Kibana", - "Map • Kibana", -] -`; - -exports[`SearchBar only display results from the last search 2`] = ` -Array [ - "Visualize • Kibana", - "Map • Kibana", -] -`; - -exports[`SearchBar supports keyboard shortcuts 1`] = ` - -`; diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx index c8bd54540e6a6..dd7b1f2666943 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.test.tsx @@ -6,15 +6,21 @@ */ import React from 'react'; -import { waitFor, act } from '@testing-library/react'; -import { ReactWrapper } from 'enzyme'; +import { act, render, screen, fireEvent } from '@testing-library/react'; import { of, BehaviorSubject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; -import { mountWithIntl } from '@kbn/test/jest'; import { applicationServiceMock } from '../../../../../src/core/public/mocks'; import { globalSearchPluginMock } from '../../../global_search/public/mocks'; import { GlobalSearchBatchedResults, GlobalSearchResult } from '../../../global_search/public'; import { SearchBar } from './search_bar'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n/react'; + +jest.mock( + 'react-virtualized-auto-sizer', + () => + ({ children }: any) => + children({ height: 600, width: 600 }) +); type Result = { id: string; type: string } | string; @@ -36,9 +42,7 @@ const createResult = (result: Result): GlobalSearchResult => { const createBatch = (...results: Result[]): GlobalSearchBatchedResults => ({ results: results.map(createResult), }); - -const getSelectableProps: any = (component: any) => component.find('EuiSelectable').props(); -const getSearchProps: any = (component: any) => component.find('EuiFieldSearch').props(); +jest.useFakeTimers(); describe('SearchBar', () => { let searchService: ReturnType; @@ -46,31 +50,37 @@ describe('SearchBar', () => { const basePathUrl = '/plugins/globalSearchBar/assets/'; const darkMode = false; - let component: ReactWrapper; - beforeEach(() => { applications = applicationServiceMock.createStartContract(); searchService = globalSearchPluginMock.createStartContract(); - jest.useFakeTimers(); }); - const triggerFocus = () => { - component.find('input[data-test-subj="nav-search-input"]').simulate('focus'); - }; - const update = () => { act(() => { jest.runAllTimers(); }); - component.update(); }; - const simulateTypeChar = async (text: string) => { - await waitFor(() => getSearchProps(component).onInput({ currentTarget: { value: text } })); + const focusAndUpdate = async () => { + await act(async () => { + (await screen.findByTestId('nav-search-input')).focus(); + jest.runAllTimers(); + }); }; - const getDisplayedOptionsTitle = () => { - return getSelectableProps(component).options.map((option: any) => option.title); + const simulateTypeChar = (text: string) => { + fireEvent.input(screen.getByTestId('nav-search-input'), { target: { value: text } }); + act(() => { + jest.runAllTimers(); + }); + }; + + const assertSearchResults = async (list: string[]) => { + for (let i = 0; i < list.length; i++) { + expect(await screen.findByTitle(list[i])).toBeInTheDocument(); + } + + expect(await screen.findAllByTestId('nav-search-option')).toHaveLength(list.length); }; it('correctly filters and sorts results', async () => { @@ -83,53 +93,52 @@ describe('SearchBar', () => { ) .mockReturnValueOnce(of(createBatch('Discover', { id: 'My Dashboard', type: 'test' }))); - component = mountWithIntl( - + render( + + + ); expect(searchService.find).toHaveBeenCalledTimes(0); - triggerFocus(); - update(); + await focusAndUpdate(); expect(searchService.find).toHaveBeenCalledTimes(1); expect(searchService.find).toHaveBeenCalledWith({}, {}); - expect(getDisplayedOptionsTitle()).toMatchSnapshot(); + await assertSearchResults(['Canvas • Kibana', 'Discover • Kibana', 'Graph • Kibana']); - await simulateTypeChar('d'); - update(); + simulateTypeChar('d'); - expect(getDisplayedOptionsTitle()).toMatchSnapshot(); + await assertSearchResults(['Discover • Kibana', 'My Dashboard • Test']); expect(searchService.find).toHaveBeenCalledTimes(2); - expect(searchService.find).toHaveBeenCalledWith({ term: 'd' }, {}); + expect(searchService.find).toHaveBeenLastCalledWith({ term: 'd' }, {}); }); - it('supports keyboard shortcuts', () => { - mountWithIntl( - , - { attachTo: document.body } + it('supports keyboard shortcuts', async () => { + render( + + + ); + act(() => { + fireEvent.keyDown(window, { key: '/', ctrlKey: true, metaKey: true }); + }); - const searchEvent = new KeyboardEvent('keydown', { - key: '/', - ctrlKey: true, - metaKey: true, - } as any); - window.dispatchEvent(searchEvent); + const inputElement = await screen.findByTestId('nav-search-input'); - expect(document.activeElement).toMatchSnapshot(); + expect(document.activeElement).toEqual(inputElement); }); it('only display results from the last search', async () => { @@ -144,30 +153,29 @@ describe('SearchBar', () => { searchService.find.mockReturnValueOnce(firstSearch).mockReturnValueOnce(secondSearch); - component = mountWithIntl( - + render( + + + ); - triggerFocus(); - update(); + await focusAndUpdate(); expect(searchService.find).toHaveBeenCalledTimes(1); - - await simulateTypeChar('d'); - update(); - - expect(getDisplayedOptionsTitle()).toMatchSnapshot(); + // + simulateTypeChar('d'); + await assertSearchResults(['Visualize • Kibana', 'Map • Kibana']); firstSearchTrigger.next(true); update(); - expect(getDisplayedOptionsTitle()).toMatchSnapshot(); + await assertSearchResults(['Visualize • Kibana', 'Map • Kibana']); }); }); diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index c459b2c045681..97e19bab3d2d6 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -180,6 +180,7 @@ export function SearchBar({ darkMode, }: Props) { const isMounted = useMountedState(); + const [initialLoad, setInitialLoad] = useState(false); const [searchValue, setSearchValue] = useState(''); const [searchTerm, setSearchTerm] = useState(''); const [searchRef, setSearchRef] = useState(null); @@ -190,12 +191,14 @@ export function SearchBar({ const UNKNOWN_TAG_ID = '__unknown__'; useEffect(() => { - const fetch = async () => { - const types = await globalSearch.getSearchableTypes(); - setSearchableTypes(types); - }; - fetch(); - }, [globalSearch]); + if (initialLoad) { + const fetch = async () => { + const types = await globalSearch.getSearchableTypes(); + setSearchableTypes(types); + }; + fetch(); + } + }, [globalSearch, initialLoad]); const loadSuggestions = useCallback( (term: string) => { @@ -234,75 +237,80 @@ export function SearchBar({ useDebounce( () => { - // cancel pending search if not completed yet - if (searchSubscription.current) { - searchSubscription.current.unsubscribe(); - searchSubscription.current = null; - } + if (initialLoad) { + // cancel pending search if not completed yet + if (searchSubscription.current) { + searchSubscription.current.unsubscribe(); + searchSubscription.current = null; + } + + const suggestions = loadSuggestions(searchValue); + + let aggregatedResults: GlobalSearchResult[] = []; + if (searchValue.length !== 0) { + trackUiMetric(METRIC_TYPE.COUNT, 'search_request'); + } + + const rawParams = parseSearchParams(searchValue); + const tagIds = + taggingApi && rawParams.filters.tags + ? rawParams.filters.tags.map( + (tagName) => taggingApi.ui.getTagIdFromName(tagName) ?? UNKNOWN_TAG_ID + ) + : undefined; + const searchParams: GlobalSearchFindParams = { + term: rawParams.term, + types: rawParams.filters.types, + tags: tagIds, + }; + // TODO technically a subtle bug here + // this term won't be set until the next time the debounce is fired + // so the SearchOption won't highlight anything if only one call is fired + // in practice, this is hard to spot, unlikely to happen, and is a negligible issue + setSearchTerm(rawParams.term ?? ''); + + searchSubscription.current = globalSearch.find(searchParams, {}).subscribe({ + next: ({ results }) => { + if (searchValue.length > 0) { + aggregatedResults = [...results, ...aggregatedResults].sort(sortByScore); + setOptions(aggregatedResults, suggestions, searchParams.tags); + return; + } + + // if searchbar is empty, filter to only applications and sort alphabetically + results = results.filter(({ type }: GlobalSearchResult) => type === 'application'); + + aggregatedResults = [...results, ...aggregatedResults].sort(sortByTitle); - const suggestions = loadSuggestions(searchValue); - - let aggregatedResults: GlobalSearchResult[] = []; - if (searchValue.length !== 0) { - trackUiMetric(METRIC_TYPE.COUNT, 'search_request'); - } - - const rawParams = parseSearchParams(searchValue); - const tagIds = - taggingApi && rawParams.filters.tags - ? rawParams.filters.tags.map( - (tagName) => taggingApi.ui.getTagIdFromName(tagName) ?? UNKNOWN_TAG_ID - ) - : undefined; - const searchParams: GlobalSearchFindParams = { - term: rawParams.term, - types: rawParams.filters.types, - tags: tagIds, - }; - // TODO technically a subtle bug here - // this term won't be set until the next time the debounce is fired - // so the SearchOption won't highlight anything if only one call is fired - // in practice, this is hard to spot, unlikely to happen, and is a negligible issue - setSearchTerm(rawParams.term ?? ''); - - searchSubscription.current = globalSearch.find(searchParams, {}).subscribe({ - next: ({ results }) => { - if (searchValue.length > 0) { - aggregatedResults = [...results, ...aggregatedResults].sort(sortByScore); setOptions(aggregatedResults, suggestions, searchParams.tags); - return; - } - - // if searchbar is empty, filter to only applications and sort alphabetically - results = results.filter(({ type }: GlobalSearchResult) => type === 'application'); - - aggregatedResults = [...results, ...aggregatedResults].sort(sortByTitle); - - setOptions(aggregatedResults, suggestions, searchParams.tags); - }, - error: () => { - // Not doing anything on error right now because it'll either just show the previous - // results or empty results which is basically what we want anyways - trackUiMetric(METRIC_TYPE.COUNT, 'unhandled_error'); - }, - complete: () => {}, - }); + }, + error: () => { + // Not doing anything on error right now because it'll either just show the previous + // results or empty results which is basically what we want anyways + trackUiMetric(METRIC_TYPE.COUNT, 'unhandled_error'); + }, + complete: () => {}, + }); + } }, 350, - [searchValue, loadSuggestions] + [searchValue, loadSuggestions, searchableTypes, initialLoad] ); - const onKeyDown = (event: KeyboardEvent) => { - if (event.key === '/' && (isMac ? event.metaKey : event.ctrlKey)) { - event.preventDefault(); - trackUiMetric(METRIC_TYPE.COUNT, 'shortcut_used'); - if (searchRef) { - searchRef.focus(); - } else if (buttonRef) { - (buttonRef.children[0] as HTMLButtonElement).click(); + const onKeyDown = useCallback( + (event: KeyboardEvent) => { + if (event.key === '/' && (isMac ? event.metaKey : event.ctrlKey)) { + event.preventDefault(); + trackUiMetric(METRIC_TYPE.COUNT, 'shortcut_used'); + if (searchRef) { + searchRef.focus(); + } else if (buttonRef) { + (buttonRef.children[0] as HTMLButtonElement).click(); + } } - } - }; + }, + [buttonRef, searchRef, trackUiMetric] + ); const onChange = (selection: EuiSelectableTemplateSitewideOption[]) => { const selected = selection.find(({ checked }) => checked === 'on'); @@ -411,6 +419,7 @@ export function SearchBar({ }), onFocus: () => { trackUiMetric(METRIC_TYPE.COUNT, 'search_focus'); + setInitialLoad(true); }, }} popoverProps={{ diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_list/components/policy_table.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_list/components/policy_table.tsx index d6d030c3ec733..61ce87860d897 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_list/components/policy_table.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_list/components/policy_table.tsx @@ -191,7 +191,9 @@ export const PolicyTable: React.FunctionComponent = ({ policies }) => { direction: 'asc', }, }} - search={{ box: { incremental: true } }} + search={{ + box: { incremental: true, 'data-test-subj': 'ilmSearchBar' }, + }} tableLayout="auto" items={policies} columns={columns} diff --git a/x-pack/plugins/index_management/__jest__/components/__snapshots__/index_table.test.js.snap b/x-pack/plugins/index_management/__jest__/components/__snapshots__/index_table.test.js.snap index 39f86f7aba2c0..ce7d8561e73e5 100644 --- a/x-pack/plugins/index_management/__jest__/components/__snapshots__/index_table.test.js.snap +++ b/x-pack/plugins/index_management/__jest__/components/__snapshots__/index_table.test.js.snap @@ -20,7 +20,7 @@ exports[`index table force merge button works from context menu 2`] = `"forcing exports[`index table force merge button works from context menu 3`] = `"open"`; -exports[`index table open index button works from context menu 1`] = `"open"`; +exports[`index table open index button works from context menu 1`] = `"opening..."`; exports[`index table open index button works from context menu 2`] = `"open"`; diff --git a/x-pack/plugins/index_management/__jest__/components/index_table.test.js b/x-pack/plugins/index_management/__jest__/components/index_table.test.js index ba07db10d22d8..5e5538fcca4e8 100644 --- a/x-pack/plugins/index_management/__jest__/components/index_table.test.js +++ b/x-pack/plugins/index_management/__jest__/components/index_table.test.js @@ -88,7 +88,15 @@ const snapshot = (rendered) => { expect(rendered).toMatchSnapshot(); }; -const openMenuAndClickButton = (rendered, rowIndex, buttonIndex) => { +const names = (rendered) => { + return findTestSubject(rendered, 'indexTableIndexNameLink'); +}; + +const namesText = (rendered) => { + return names(rendered).map((button) => button.text()); +}; + +const openMenuAndClickButton = (rendered, rowIndex, buttonSelector) => { // Select a row. const checkboxes = findTestSubject(rendered, 'indexTableRowCheckbox'); checkboxes.at(rowIndex).simulate('change', { target: { checked: true } }); @@ -100,18 +108,19 @@ const openMenuAndClickButton = (rendered, rowIndex, buttonIndex) => { rendered.update(); // Click an action in the context menu. - const contextMenuButtons = findTestSubject(rendered, 'indexTableContextMenuButton'); - contextMenuButtons.at(buttonIndex).simulate('click'); + const contextMenuButton = findTestSubject(rendered, buttonSelector); + contextMenuButton.simulate('click'); rendered.update(); }; -const testEditor = (rendered, buttonIndex, rowIndex = 0) => { - openMenuAndClickButton(rendered, rowIndex, buttonIndex); +const testEditor = (rendered, buttonSelector, rowIndex = 0) => { + openMenuAndClickButton(rendered, rowIndex, buttonSelector); rendered.update(); snapshot(findTestSubject(rendered, 'detailPanelTabSelected').text()); }; -const testAction = (rendered, buttonIndex, rowIndex = 0) => { +const testAction = (rendered, buttonSelector, indexName = 'testy0') => { + const rowIndex = namesText(rendered).indexOf(indexName); // This is leaking some implementation details about how Redux works. Not sure exactly what's going on // but it looks like we're aware of how many Redux actions are dispatched in response to user interaction, // so we "time" our assertion based on how many Redux actions we observe. This is brittle because it @@ -127,19 +136,16 @@ const testAction = (rendered, buttonIndex, rowIndex = 0) => { dispatchedActionsCount++; }); - openMenuAndClickButton(rendered, rowIndex, buttonIndex); + openMenuAndClickButton(rendered, rowIndex, buttonSelector); // take snapshot of initial state. snapshot(status(rendered, rowIndex)); }; -const names = (rendered) => { - return findTestSubject(rendered, 'indexTableIndexNameLink'); -}; - -const namesText = (rendered) => { - return names(rendered).map((button) => button.text()); +const getActionMenuButtons = (rendered) => { + return findTestSubject(rendered, 'indexContextMenu') + .find('button') + .map((span) => span.text()); }; - describe('index table', () => { beforeEach(() => { // Mock initialization of services @@ -232,7 +238,7 @@ describe('index table', () => { await runAllPromises(); rendered.update(); - let button = findTestSubject(rendered, 'indexTableContextMenuButton'); + let button = findTestSubject(rendered, 'indexActionsContextMenuButton'); expect(button.length).toEqual(0); const checkboxes = findTestSubject(rendered, 'indexTableRowCheckbox'); @@ -247,7 +253,7 @@ describe('index table', () => { await runAllPromises(); rendered.update(); - let button = findTestSubject(rendered, 'indexTableContextMenuButton'); + let button = findTestSubject(rendered, 'indexActionsContextMenuButton'); expect(button.length).toEqual(0); const checkboxes = findTestSubject(rendered, 'indexTableRowCheckbox'); @@ -353,7 +359,7 @@ describe('index table', () => { const actionButton = findTestSubject(rendered, 'indexActionsContextMenuButton'); actionButton.simulate('click'); rendered.update(); - snapshot(findTestSubject(rendered, 'indexTableContextMenuButton').map((span) => span.text())); + snapshot(getActionMenuButtons(rendered)); }); test('should show the right context menu options when one index is selected and closed', async () => { @@ -367,7 +373,7 @@ describe('index table', () => { const actionButton = findTestSubject(rendered, 'indexActionsContextMenuButton'); actionButton.simulate('click'); rendered.update(); - snapshot(findTestSubject(rendered, 'indexTableContextMenuButton').map((span) => span.text())); + snapshot(getActionMenuButtons(rendered)); }); test('should show the right context menu options when one open and one closed index is selected', async () => { @@ -382,7 +388,7 @@ describe('index table', () => { const actionButton = findTestSubject(rendered, 'indexActionsContextMenuButton'); actionButton.simulate('click'); rendered.update(); - snapshot(findTestSubject(rendered, 'indexTableContextMenuButton').map((span) => span.text())); + snapshot(getActionMenuButtons(rendered)); }); test('should show the right context menu options when more than one open index is selected', async () => { @@ -397,7 +403,7 @@ describe('index table', () => { const actionButton = findTestSubject(rendered, 'indexActionsContextMenuButton'); actionButton.simulate('click'); rendered.update(); - snapshot(findTestSubject(rendered, 'indexTableContextMenuButton').map((span) => span.text())); + snapshot(getActionMenuButtons(rendered)); }); test('should show the right context menu options when more than one closed index is selected', async () => { @@ -412,28 +418,28 @@ describe('index table', () => { const actionButton = findTestSubject(rendered, 'indexActionsContextMenuButton'); actionButton.simulate('click'); rendered.update(); - snapshot(findTestSubject(rendered, 'indexTableContextMenuButton').map((span) => span.text())); + snapshot(getActionMenuButtons(rendered)); }); test('flush button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testAction(rendered, 8); + testAction(rendered, 'flushIndexMenuButton'); }); test('clear cache button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testAction(rendered, 7); + testAction(rendered, 'clearCacheIndexMenuButton'); }); test('refresh button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testAction(rendered, 6); + testAction(rendered, 'refreshIndexMenuButton'); }); test('force merge button works from context menu', async () => { @@ -442,7 +448,7 @@ describe('index table', () => { rendered.update(); const rowIndex = 0; - openMenuAndClickButton(rendered, rowIndex, 5); + openMenuAndClickButton(rendered, rowIndex, 'forcemergeIndexMenuButton'); snapshot(status(rendered, rowIndex)); expect(rendered.find('.euiModal').length).toBe(1); @@ -478,55 +484,54 @@ describe('index table', () => { JSON.stringify(modifiedIndices), ]); - testAction(rendered, 4); + testAction(rendered, 'closeIndexMenuButton'); }); test('open index button works from context menu', async () => { - const rendered = mountWithIntl(component); - await runAllPromises(); - rendered.update(); - const modifiedIndices = indices.map((index) => { return { ...index, - status: index.name === 'testy1' ? 'open' : index.status, + status: index.name === 'testy1' ? 'closed' : index.status, }; }); - server.respondWith(`${API_BASE_PATH}/indices/reload`, [ + server.respondWith(`${API_BASE_PATH}/indices`, [ 200, { 'Content-Type': 'application/json' }, JSON.stringify(modifiedIndices), ]); - testAction(rendered, 3, 1); + const rendered = mountWithIntl(component); + await runAllPromises(); + rendered.update(); + testAction(rendered, 'openIndexMenuButton', 'testy1'); }); test('show settings button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testEditor(rendered, 0); + testEditor(rendered, 'showSettingsIndexMenuButton'); }); test('show mappings button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testEditor(rendered, 1); + testEditor(rendered, 'showMappingsIndexMenuButton'); }); test('show stats button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testEditor(rendered, 2); + testEditor(rendered, 'showStatsIndexMenuButton'); }); test('edit index button works from context menu', async () => { const rendered = mountWithIntl(component); await runAllPromises(); rendered.update(); - testEditor(rendered, 3); + testEditor(rendered, 'editIndexMenuButton'); }); }); diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_actions_context_menu/index_actions_context_menu.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_actions_context_menu/index_actions_context_menu.js index a97d5b11161b1..c5bd62feff826 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_actions_context_menu/index_actions_context_menu.js +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_actions_context_menu/index_actions_context_menu.js @@ -75,6 +75,7 @@ export class IndexActionsContextMenu extends Component { const items = []; if (!detailPanel && selectedIndexCount === 1) { items.push({ + 'data-test-subj': 'showSettingsIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.showIndexSettingsLabel', { defaultMessage: 'Show {selectedIndexCount, plural, one {index} other {indices} } settings', @@ -85,6 +86,7 @@ export class IndexActionsContextMenu extends Component { }, }); items.push({ + 'data-test-subj': 'showMappingsIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.showIndexMappingLabel', { defaultMessage: 'Show {selectedIndexCount, plural, one {index} other {indices} } mapping', values: { selectedIndexCount }, @@ -95,6 +97,7 @@ export class IndexActionsContextMenu extends Component { }); if (allOpen) { items.push({ + 'data-test-subj': 'showStatsIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.showIndexStatsLabel', { defaultMessage: 'Show {selectedIndexCount, plural, one {index} other {indices} } stats', values: { selectedIndexCount }, @@ -105,6 +108,7 @@ export class IndexActionsContextMenu extends Component { }); } items.push({ + 'data-test-subj': 'editIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.editIndexSettingsLabel', { defaultMessage: 'Edit {selectedIndexCount, plural, one {index} other {indices} } settings', @@ -117,6 +121,7 @@ export class IndexActionsContextMenu extends Component { } if (allOpen) { items.push({ + 'data-test-subj': 'closeIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.closeIndexLabel', { defaultMessage: 'Close {selectedIndexCount, plural, one {index} other {indices} }', values: { selectedIndexCount }, @@ -131,6 +136,7 @@ export class IndexActionsContextMenu extends Component { }, }); items.push({ + 'data-test-subj': 'forcemergeIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.forceMergeIndexLabel', { defaultMessage: 'Force merge {selectedIndexCount, plural, one {index} other {indices} }', values: { selectedIndexCount }, @@ -141,6 +147,7 @@ export class IndexActionsContextMenu extends Component { }, }); items.push({ + 'data-test-subj': 'refreshIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.refreshIndexLabel', { defaultMessage: 'Refresh {selectedIndexCount, plural, one {index} other {indices} }', values: { selectedIndexCount }, @@ -150,6 +157,7 @@ export class IndexActionsContextMenu extends Component { }, }); items.push({ + 'data-test-subj': 'clearCacheIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.clearIndexCacheLabel', { defaultMessage: 'Clear {selectedIndexCount, plural, one {index} other {indices} } cache', values: { selectedIndexCount }, @@ -159,6 +167,7 @@ export class IndexActionsContextMenu extends Component { }, }); items.push({ + 'data-test-subj': 'flushIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.flushIndexLabel', { defaultMessage: 'Flush {selectedIndexCount, plural, one {index} other {indices} }', values: { selectedIndexCount }, @@ -191,6 +200,7 @@ export class IndexActionsContextMenu extends Component { } } else { items.push({ + 'data-test-subj': 'openIndexMenuButton', name: i18n.translate('xpack.idxMgmt.indexActionsMenu.openIndexLabel', { defaultMessage: 'Open {selectedIndexCount, plural, one {index} other {indices} }', values: { selectedIndexCount }, @@ -239,9 +249,6 @@ export class IndexActionsContextMenu extends Component { } } }); - items.forEach((item) => { - item['data-test-subj'] = 'indexTableContextMenuButton'; - }); const panelTree = { id: 0, title: i18n.translate('xpack.idxMgmt.indexActionsMenu.panelTitle', { @@ -732,7 +739,11 @@ export class IndexActionsContextMenu extends Component { anchorPosition={anchorPosition} repositionOnScroll > - +
); diff --git a/x-pack/plugins/infra/common/inventory_models/pod/metrics/tsvb/pod_overview.ts b/x-pack/plugins/infra/common/inventory_models/pod/metrics/tsvb/pod_overview.ts index 5746410f03388..0fe94c7f53dab 100644 --- a/x-pack/plugins/infra/common/inventory_models/pod/metrics/tsvb/pod_overview.ts +++ b/x-pack/plugins/infra/common/inventory_models/pod/metrics/tsvb/pod_overview.ts @@ -25,9 +25,23 @@ export const podOverview: TSVBMetricModelCreator = ( metrics: [ { field: 'kubernetes.pod.cpu.usage.node.pct', - id: 'avg-cpu-usage', + id: 'avg-cpu-without', type: 'avg', }, + { + field: 'kubernetes.pod.cpu.usage.limit.pct', + id: 'avg-cpu-with', + type: 'avg', + }, + { + id: 'cpu-usage', + type: 'calculation', + variables: [ + { id: 'cpu_with', name: 'with_limit', field: 'avg-cpu-with' }, + { id: 'cpu_without', name: 'without_limit', field: 'avg-cpu-without' }, + ], + script: 'params.with_limit > 0.0 ? params.with_limit : params.without_limit', + }, ], }, { @@ -36,9 +50,23 @@ export const podOverview: TSVBMetricModelCreator = ( metrics: [ { field: 'kubernetes.pod.memory.usage.node.pct', - id: 'avg-memory-usage', + id: 'avg-memory-without', type: 'avg', }, + { + field: 'kubernetes.pod.memory.usage.limit.pct', + id: 'avg-memory-with', + type: 'avg', + }, + { + id: 'memory-usage', + type: 'calculation', + variables: [ + { id: 'memory_with', name: 'with_limit', field: 'avg-memory-with' }, + { id: 'memory_without', name: 'without_limit', field: 'avg-memory-without' }, + ], + script: 'params.with_limit > 0.0 ? params.with_limit : params.without_limit', + }, ], }, { diff --git a/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx b/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx index b241147c8d675..99580adfed5bb 100644 --- a/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx +++ b/x-pack/plugins/infra/public/components/log_stream/log_stream.stories.mdx @@ -172,7 +172,7 @@ To use the component your plugin needs to follow certain criteria: - Ensure `"infra"` and `"data"` are specified as a `requiredPlugins` in your plugin's `kibana.json`. - Ensure the `` component is mounted inside the hierachy of a [`kibana-react` provider](https://github.com/elastic/kibana/blob/b2d0aa7b7fae1c89c8f9e8854ae73e71be64e765/src/plugins/kibana_react/README.md#L45). At a minimum, the kibana-react provider must pass `http` (from core start services) and `data` (from core plugin start dependencies). -- Ensure the `` component is mounted inside the hierachy of a [`EuiThemeProvider`](https://github.com/elastic/kibana/blob/master/src/plugins/kibana_react/common/eui_styled_components.tsx). +- Ensure the `` component is mounted inside the hierachy of a [`EuiThemeProvider`](https://github.com/elastic/kibana/blob/main/src/plugins/kibana_react/common/eui_styled_components.tsx). ## Usage diff --git a/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx b/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx index 2698e975cebca..eadb9d129c5a2 100644 --- a/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx +++ b/x-pack/plugins/infra/public/components/log_stream/log_stream.tsx @@ -105,7 +105,7 @@ export const LogStreamContent: React.FC = ({ ` cannot access kibana core services. Ensure the component is mounted within kibana-react's hierarchy. -Read more at https://github.com/elastic/kibana/blob/master/src/plugins/kibana_react/README.md" +Read more at https://github.com/elastic/kibana/blob/main/src/plugins/kibana_react/README.md" ` ); } diff --git a/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx index 2d2909f42bae6..d91c70f09cd3d 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/index_names_configuration_panel.tsx @@ -48,13 +48,13 @@ export const IndexNamesConfigurationPanel: React.FC<{ - + - + ( ({ indexName }) => indexName ); -const deprecationCalloutTitle = i18n.translate( - 'xpack.infra.logSourceConfiguration.indexNameReferenceDeprecationTitle', +const indexPatternInformationCalloutTitle = i18n.translate( + 'xpack.infra.logSourceConfiguration.indexPatternInformationCalloutTitle', { - defaultMessage: 'Deprecated configuration option', + defaultMessage: 'New configuration option', } ); diff --git a/x-pack/plugins/infra/server/deprecations.ts b/x-pack/plugins/infra/server/deprecations.ts index 27c2b235f769b..70131cd96d117 100644 --- a/x-pack/plugins/infra/server/deprecations.ts +++ b/x-pack/plugins/infra/server/deprecations.ts @@ -142,7 +142,7 @@ const FIELD_DEPRECATION_FACTORIES: Record Dep }), }; -export const configDeprecations: ConfigDeprecationProvider = () => [ +export const configDeprecations: ConfigDeprecationProvider = ({ deprecate }) => [ ...Object.keys(FIELD_DEPRECATION_FACTORIES).map( (key): ConfigDeprecation => (completeConfig, rootPath, addDeprecation) => { @@ -179,6 +179,8 @@ export const configDeprecations: ConfigDeprecationProvider = () => [ return completeConfig; } ), + deprecate('sources.default.logAlias', '8.0.0'), + deprecate('sources.default.metricAlias', '8.0.0'), ]; export const getInfraDeprecationsFactory = diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/metric_query.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/metric_query.ts index f5ff4448ecb60..59dc398973f8c 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/metric_query.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/metric_query.ts @@ -120,6 +120,7 @@ export const getElasticsearchMetricQuery = ( const parsedFilterQuery = getParsedFilterQuery(filterQuery); return { + track_total_hits: true, query: { bool: { filter: [ diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts index bd9c0afefa3fc..d204782957f34 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts @@ -232,6 +232,50 @@ describe('The metric threshold alert type', () => { ); expect(stateResult3.groups).toEqual(expect.arrayContaining(['a', 'b'])); }); + + const executeWithFilter = ( + comparator: Comparator, + threshold: number[], + filterQuery: string, + metric?: string, + state?: any + ) => + executor({ + ...mockOptions, + services, + params: { + groupBy: ['something'], + criteria: [ + { + ...baseNonCountCriterion, + comparator, + threshold, + metric: metric ?? baseNonCountCriterion.metric, + }, + ], + }, + state: state ?? mockOptions.state.wrapped, + }); + test('persists previous groups that go missing, until the filterQuery param changes', async () => { + const stateResult1 = await executeWithFilter(Comparator.GT, [0.75], 'query', 'test.metric.2'); + expect(stateResult1.groups).toEqual(expect.arrayContaining(['a', 'b', 'c'])); + const stateResult2 = await executeWithFilter( + Comparator.GT, + [0.75], + 'query', + 'test.metric.1', + stateResult1 + ); + expect(stateResult2.groups).toEqual(expect.arrayContaining(['a', 'b', 'c'])); + const stateResult3 = await executeWithFilter( + Comparator.GT, + [0.75], + 'different query', + 'test.metric.1', + stateResult2 + ); + expect(stateResult3.groups).toEqual(expect.arrayContaining(['a', 'b'])); + }); }); describe('querying with multiple criteria', () => { diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index e4887e922bb66..0abf4c41e7cc9 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -33,6 +33,7 @@ export type MetricThresholdAlertTypeParams = Record; export type MetricThresholdAlertTypeState = AlertTypeState & { groups: string[]; groupBy?: string | string[]; + filterQuery?: string; }; export type MetricThresholdAlertInstanceState = AlertInstanceState; // no specific instace state used export type MetricThresholdAlertInstanceContext = AlertInstanceContext; // no specific instace state used @@ -94,8 +95,11 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs) => const config = source.configuration; const previousGroupBy = state.groupBy; + const previousFilterQuery = state.filterQuery; const prevGroups = - alertOnGroupDisappear && isEqual(previousGroupBy, params.groupBy) + alertOnGroupDisappear && + isEqual(previousGroupBy, params.groupBy) && + isEqual(previousFilterQuery, params.filterQuery) ? // Filter out the * key from the previous groups, only include it if it's one of // the current groups. In case of a groupBy alert that starts out with no data and no // groups, we don't want to persist the existence of the * alert instance @@ -220,7 +224,7 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs) => } } - return { groups, groupBy: params.groupBy }; + return { groups, groupBy: params.groupBy, filterQuery: params.filterQuery }; }); export const FIRED_ACTIONS = { diff --git a/x-pack/plugins/ingest_pipelines/README.md b/x-pack/plugins/ingest_pipelines/README.md index dd7c130c7a72d..04cfc23cfbbff 100644 --- a/x-pack/plugins/ingest_pipelines/README.md +++ b/x-pack/plugins/ingest_pipelines/README.md @@ -13,7 +13,7 @@ It requires a Basic license and the following cluster privileges: `manage_pipeli A new app called Ingest Pipelines is registered in the Management section and follows a typical CRUD UI pattern. The client-side portion of this app lives in [public/application](public/application) and uses endpoints registered in [server/routes/api](server/routes/api). For more information on the pipeline processors editor component, check out the [component readme](public/application/components/pipeline_processors_editor/README.md). -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions on setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions on setting up your development environment. ### Test coverage diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx index 7abe80003ea0e..15562a999bdb4 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx @@ -49,6 +49,18 @@ import { regenerateLayerFromAst } from '../parse'; import { filterByVisibleOperation } from '../util'; import { getColumnTimeShiftWarnings, getDateHistogramInterval } from '../../../../time_shift_utils'; +function tableHasData( + activeData: ParamEditorProps['activeData'], + layerId: string, + columnId: string +) { + const table = activeData?.[layerId]; + if (!table || table.rows.length === 0) { + return false; + } + return table.rows.some((row) => row[columnId] != null); +} + export const WrappedFormulaEditor = ({ activeData, ...rest @@ -59,7 +71,13 @@ export const WrappedFormulaEditor = ({ activeData, rest.layerId ); - return ; + return ( + + ); }; const MemoizedFormulaEditor = React.memo(FormulaEditor); @@ -76,8 +94,10 @@ export function FormulaEditor({ isFullscreen, setIsCloseable, dateHistogramInterval, + hasData, }: Omit, 'activeData'> & { dateHistogramInterval: ReturnType; + hasData: boolean; }) { const [text, setText] = useState(currentColumn.params.formula); const [warnings, setWarnings] = useState< @@ -180,7 +200,12 @@ export function FormulaEditor({ } if (errors.length) { - if (currentColumn.params.isFormulaBroken) { + // Replace the previous error with the new one + const previousFormulaWasBroken = currentColumn.params.isFormulaBroken; + // If the user is changing a previous formula and there are currently no result + // show the most up-to-date state with the error message. + const previousFormulaWasOkButNoData = !currentColumn.params.isFormulaBroken && !hasData; + if (previousFormulaWasBroken || previousFormulaWasOkButNoData) { // If the formula is already broken, show the latest error message in the workspace if (currentColumn.params.formula !== text) { updateLayer( diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx index 499170349c3d5..d3dc8e95933a3 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx @@ -33,11 +33,27 @@ const operationDefinitionMap: Record = { scale: 'ratio', timeScale: false, }), + getPossibleOperationForField: () => ({ scale: 'ratio' }), + } as unknown as GenericOperationDefinition, + terms: { + input: 'field', + getPossibleOperationForField: () => ({ scale: 'ordinal' }), + } as unknown as GenericOperationDefinition, + sum: { + input: 'field', + filterable: true, + getPossibleOperationForField: () => ({ scale: 'ratio' }), + } as unknown as GenericOperationDefinition, + last_value: { + input: 'field', + getPossibleOperationForField: ({ type }) => ({ + scale: type === 'string' ? 'ordinal' : 'ratio', + }), + } as GenericOperationDefinition, + max: { + input: 'field', + getPossibleOperationForField: () => ({ scale: 'ratio' }), } as unknown as GenericOperationDefinition, - terms: { input: 'field' } as GenericOperationDefinition, - sum: { input: 'field', filterable: true } as GenericOperationDefinition, - last_value: { input: 'field' } as GenericOperationDefinition, - max: { input: 'field' } as GenericOperationDefinition, count: { input: 'field', filterable: true, @@ -50,8 +66,12 @@ const operationDefinitionMap: Record = { scale: 'ratio', timeScale: false, }), + getPossibleOperationForField: () => ({ scale: 'ratio' }), + } as unknown as GenericOperationDefinition, + derivative: { + input: 'fullReference', + getPossibleOperationForField: () => ({ scale: 'ratio' }), } as unknown as GenericOperationDefinition, - derivative: { input: 'fullReference' } as GenericOperationDefinition, moving_average: { input: 'fullReference', operationParams: [{ name: 'window', type: 'number', required: true }], @@ -66,8 +86,12 @@ const operationDefinitionMap: Record = { references, }), getErrorMessage: () => ['mock error'], + getPossibleOperationForField: () => ({ scale: 'ratio' }), + } as unknown as GenericOperationDefinition, + cumulative_sum: { + input: 'fullReference', + getPossibleOperationForField: () => ({ scale: 'ratio' }), } as unknown as GenericOperationDefinition, - cumulative_sum: { input: 'fullReference' } as GenericOperationDefinition, }; describe('formula', () => { @@ -1230,6 +1254,30 @@ invalid: " } }); + it('returns errors if the returned type of an operation is not supported by Formula', () => { + // check only "valid" operations which are strictly not supported by Formula + // as for last_value with ordinal data + const formulas = [ + { formula: 'last_value(dest)' }, + { formula: 'terms(dest)' }, + { formula: 'moving_average(last_value(dest), window=7)', errorFormula: 'last_value(dest)' }, + ]; + for (const { formula, errorFormula } of formulas) { + expect( + formulaOperation.getErrorMessage!( + getNewLayerWithFormula(formula), + 'col1', + indexPattern, + operationDefinitionMap + ) + ).toEqual([ + `The return value type of the operation ${ + errorFormula ?? formula + } is not supported in Formula.`, + ]); + } + }); + // there are 4 types of errors for math functions: // * no argument passed // * too many arguments passed diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts index 8749ed4b690f4..1a8d8529a9b90 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts @@ -76,6 +76,10 @@ interface ValidationErrors { message: string; type: { operation: string; text: string; type: string }; }; + wrongReturnedType: { + message: string; + type: { text: string }; + }; } type ErrorTypes = keyof ValidationErrors; @@ -308,6 +312,13 @@ function getMessageFromId({ values: { operation: out.operation, text: out.text, type: out.type }, }); break; + case 'wrongReturnedType': + message = i18n.translate('xpack.lens.indexPattern.formulaOperationWrongReturnedType', { + defaultMessage: + 'The return value type of the operation {text} is not supported in Formula.', + values: { text: out.text }, + }); + break; // case 'mathRequiresFunction': // message = i18n.translate('xpack.lens.indexPattern.formulaMathRequiresFunctionLabel', { // defaultMessage; 'The function {name} requires an Elasticsearch function', @@ -602,6 +613,7 @@ function runFullASTValidation( const fieldErrors = validateFieldArguments(node, variables, { isFieldOperation: true, firstArg, + returnedType: getReturnedType(nodeOperation, indexPattern, firstArg), }); if (fieldErrors.length) { errors.push(...fieldErrors); @@ -711,6 +723,7 @@ function runFullASTValidation( const fieldErrors = validateFieldArguments(node, variables, { isFieldOperation: false, firstArg, + returnedType: undefined, }); if (fieldErrors.length) { errors.push(...fieldErrors); @@ -775,6 +788,25 @@ export function getWrongTypeParams( ); } +function getReturnedType( + operation: OperationDefinition, + indexPattern: IndexPattern, + firstArg: TinymathAST +) { + const variables = findVariables(firstArg); + if (variables.length !== 1) { + return; + } + const field = indexPattern.getFieldByName(getValueOrName(variables[0]) as string); + // while usually this is used where it is safe, as generic function it should check anyway + if (!field) { + return; + } + // here we're validating the support of the returned type for Formula, not for the operation itself + // that is already handled indipendently by the operation. So return the scale type + return operation.getPossibleOperationForField(field)?.scale; +} + function getDuplicateParams(params: TinymathNamedArgument[] = []) { const uniqueArgs = Object.create(null); for (const { name } of params) { @@ -898,7 +930,15 @@ export function validateMathNodes(root: TinymathAST, missingVariableSet: Set, - { isFieldOperation, firstArg }: { isFieldOperation: boolean; firstArg: TinymathAST } + { + isFieldOperation, + firstArg, + returnedType, + }: { + isFieldOperation: boolean; + firstArg: TinymathAST; + returnedType: 'ratio' | 'ordinal' | 'interval' | undefined; + } ) { const fields = variables.filter( (arg) => isArgumentValidType(arg, 'variable') && !isMathNode(arg) @@ -920,6 +960,19 @@ function validateFieldArguments( }) ); } + if (isFieldOperation && fields.length === 1 && fields[0] === firstArg) { + if (returnedType === 'ordinal') { + errors.push( + getMessageFromId({ + messageId: 'wrongReturnedType', + values: { + text: node.text ?? `${node.name}(${getValueOrName(firstArg)})`, + }, + locations: node.location ? [node.location] : [], + }) + ); + } + } if (!isFieldOperation && fields.length) { errors.push( getMessageFromId({ diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.test.tsx index 77af42ab41888..7e689574781b7 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.test.tsx @@ -492,7 +492,7 @@ describe('last_value', () => { 'Field notExisting was not found', ]); }); - it('shows error message if the sortField does not exist in index pattern', () => { + it('shows error message if the sortField does not exist in index pattern', () => { errorLayer = { ...errorLayer, columns: { @@ -509,6 +509,20 @@ describe('last_value', () => { 'Field notExisting was not found', ]); }); + it('shows error message if the sourceField is of unsupported type', () => { + errorLayer = { + ...errorLayer, + columns: { + col1: { + ...errorLayer.columns.col1, + sourceField: 'timestamp', + } as LastValueIndexPatternColumn, + }, + }; + expect(lastValueOperation.getErrorMessage!(errorLayer, 'col1', indexPattern)).toEqual([ + 'Field timestamp is of the wrong type', + ]); + }); it('shows error message if the sortField is not date', () => { errorLayer = { ...errorLayer, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx index 88c9d82092e21..96295a0a84d45 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx @@ -206,7 +206,8 @@ export const lastValueOperation: OperationDefinition { const dataPluginMockValue = dataPluginMock.createStartContract(); // need to overwrite the formatter field first -dataPluginMockValue.fieldFormats.deserialize = jest.fn().mockImplementation(({ params }) => { +dataPluginMockValue.fieldFormats.deserialize = jest.fn().mockImplementation(({ id, params }) => { return { convert: ({ gte, lt }: { gte: string; lt: string }) => { if (params?.id === 'custom') { @@ -61,6 +61,9 @@ dataPluginMockValue.fieldFormats.deserialize = jest.fn().mockImplementation(({ p if (params?.id === 'bytes') { return `Bytes format: ${gte} - ${lt}`; } + if (!id) { + return 'Error'; + } return `${gte} - ${lt}`; }, }; @@ -476,6 +479,49 @@ describe('ranges', () => { expect(instance.find(DragDropBuckets).children).toHaveLength(1); }); + it('should use the parentFormat to create the trigger label', () => { + const updateLayerSpy = jest.fn(); + + const instance = mount( + + ); + + expect( + instance.find('[data-test-subj="indexPattern-ranges-popover-trigger"]').first().text() + ).toBe('0 - 1000'); + }); + + it('should not print error if the parentFormat is not provided', () => { + // while in the actual React implementation will print an error, here + // we intercept the formatter without an id assigned an print "Error" + const updateLayerSpy = jest.fn(); + + const instance = mount( + + ); + + expect( + instance.find('[data-test-subj="indexPattern-ranges-popover-trigger"]').first().text() + ).not.toBe('Error'); + }); + it('should add a new range', () => { const updateLayerSpy = jest.fn(); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx index 29e7de18ca4ad..6e397a926c7a0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.tsx @@ -196,7 +196,7 @@ export const rangeOperation: OperationDefinition { - return { - id, - clearLayer: jest.fn((state, _layerId) => state), - removeLayer: jest.fn(), - getLayerIds: jest.fn((_state) => ['layer1']), - getSupportedLayers: jest.fn(() => [{ type: layerTypes.DATA, label: 'Data Layer' }]), - getLayerType: jest.fn((_state, _layerId) => layerTypes.DATA), - visualizationTypes: [ - { - icon: 'empty', - id, - label: 'TEST', - groupLabel: `${id}Group`, - }, - ], - appendLayer: jest.fn(), - getVisualizationTypeId: jest.fn((_state) => 'empty'), - getDescription: jest.fn((_state) => ({ label: '' })), - switchVisualizationType: jest.fn((_, x) => x), - getSuggestions: jest.fn((_options) => []), - initialize: jest.fn((_frame, _state?) => ({ newState: 'newState' })), - getConfiguration: jest.fn((props) => ({ - groups: [ - { - groupId: 'a', - groupLabel: 'a', - layerId: 'layer1', - supportsMoreColumns: true, - accessors: [], - filterOperations: jest.fn(() => true), - dataTestSubj: 'mockVisA', - }, - ], - })), - toExpression: jest.fn((_state, _frame) => null), - toPreviewExpression: jest.fn((_state, _frame) => null), - - setDimension: jest.fn(), - removeDimension: jest.fn(), - getErrorMessages: jest.fn((_state) => undefined), - renderDimensionEditor: jest.fn(), - }; -} - -export const visualizationMap = { - testVis: createMockVisualization(), - testVis2: createMockVisualization(), -}; - -export type DatasourceMock = jest.Mocked & { - publicAPIMock: jest.Mocked; -}; - -export function createMockDatasource(id: string): DatasourceMock { - const publicAPIMock: jest.Mocked = { - datasourceId: id, - getTableSpec: jest.fn(() => []), - getOperationForColumnId: jest.fn(), - }; - - return { - id: 'testDatasource', - clearLayer: jest.fn((state, _layerId) => state), - getDatasourceSuggestionsForField: jest.fn((_state, _item, filterFn) => []), - getDatasourceSuggestionsForVisualizeField: jest.fn((_state, _indexpatternId, _fieldName) => []), - getDatasourceSuggestionsFromCurrentState: jest.fn((_state) => []), - getPersistableState: jest.fn((x) => ({ - state: x, - savedObjectReferences: [{ type: 'index-pattern', id: 'mockip', name: 'mockip' }], - })), - getPublicAPI: jest.fn().mockReturnValue(publicAPIMock), - initialize: jest.fn((_state?) => Promise.resolve()), - renderDataPanel: jest.fn(), - renderLayerPanel: jest.fn(), - toExpression: jest.fn((_frame, _state) => null), - insertLayer: jest.fn((_state, _newLayerId) => ({})), - removeLayer: jest.fn((_state, _layerId) => {}), - removeColumn: jest.fn((props) => {}), - getLayers: jest.fn((_state) => []), - uniqueLabels: jest.fn((_state) => ({})), - renderDimensionTrigger: jest.fn(), - renderDimensionEditor: jest.fn(), - getDropProps: jest.fn(), - onDrop: jest.fn(), - - // this is an additional property which doesn't exist on real datasources - // but can be used to validate whether specific API mock functions are called - publicAPIMock, - getErrorMessages: jest.fn((_state) => undefined), - checkIntegrity: jest.fn((_state) => []), - isTimeBased: jest.fn(), - isValidColumn: jest.fn(), - }; -} - -export const mockDatasource: DatasourceMock = createMockDatasource('testDatasource'); -export const mockDatasource2: DatasourceMock = createMockDatasource('testDatasource2'); - -export const datasourceMap = { - testDatasource2: mockDatasource2, - testDatasource: mockDatasource, -}; - -export function createExpressionRendererMock(): jest.Mock< - React.ReactElement, - [ReactExpressionRendererProps] -> { - return jest.fn((_) => ); -} - -export type FrameMock = jest.Mocked; -export function createMockFramePublicAPI(): FrameMock { - return { - datasourceLayers: {}, - }; -} - -export type FrameDatasourceMock = jest.Mocked; -export function createMockFrameDatasourceAPI(): FrameDatasourceMock { - return { - datasourceLayers: {}, - dateRange: { fromDate: 'now-7d', toDate: 'now' }, - query: { query: '', language: 'lucene' }, - filters: [], - }; -} - -export type Start = jest.Mocked; - -const createStartContract = (): Start => { - const startContract: Start = { - EmbeddableComponent: jest.fn(() => { - return Lens Embeddable Component; - }), - SaveModalComponent: jest.fn(() => { - return Lens Save Modal Component; - }), - canUseEditor: jest.fn(() => true), - navigateToPrefilledEditor: jest.fn(), - getXyVisTypes: jest.fn().mockReturnValue(new Promise((resolve) => resolve(visualizationTypes))), - }; - return startContract; -}; - -export const lensPluginMock = { - createStartContract, -}; - -export const defaultDoc = { - savedObjectId: '1234', - title: 'An extremely cool default document!', - expression: 'definitely a valid expression', - visualizationType: 'testVis', - state: { - query: 'kuery', - filters: [{ query: { match_phrase: { src: 'test' } } }], - datasourceStates: { - testDatasource: 'datasource', - }, - visualization: {}, - }, - references: [{ type: 'index-pattern', id: '1', name: 'index-pattern-0' }], -} as unknown as Document; - -export function createMockTimefilter() { - const unsubscribe = jest.fn(); - - let timeFilter = { from: 'now-7d', to: 'now' }; - let subscriber: () => void; - return { - getTime: jest.fn(() => timeFilter), - setTime: jest.fn((newTimeFilter) => { - timeFilter = newTimeFilter; - if (subscriber) { - subscriber(); - } - }), - getTimeUpdate$: () => ({ - subscribe: ({ next }: { next: () => void }) => { - subscriber = next; - return unsubscribe; - }, - }), - calculateBounds: jest.fn(() => ({ - min: moment('2021-01-10T04:00:00.000Z'), - max: moment('2021-01-10T08:00:00.000Z'), - })), - getBounds: jest.fn(() => timeFilter), - getRefreshInterval: () => {}, - getRefreshIntervalDefaults: () => {}, - getAutoRefreshFetch$: () => new Observable(), - }; -} - -export const exactMatchDoc = { - ...defaultDoc, - sharingSavedObjectProps: { - outcome: 'exactMatch', - }, -}; - -export const mockStoreDeps = (deps?: { - lensServices?: LensAppServices; - datasourceMap?: DatasourceMap; - visualizationMap?: VisualizationMap; -}) => { - return { - datasourceMap: deps?.datasourceMap || datasourceMap, - visualizationMap: deps?.visualizationMap || visualizationMap, - lensServices: deps?.lensServices || makeDefaultServices(), - }; -}; - -export function mockDataPlugin( - sessionIdSubject = new Subject(), - initialSessionId?: string -) { - function createMockSearchService() { - let sessionIdCounter = initialSessionId ? 1 : 0; - let currentSessionId: string | undefined = initialSessionId; - const start = () => { - currentSessionId = `sessionId-${++sessionIdCounter}`; - return currentSessionId; - }; - return { - session: { - start: jest.fn(start), - clear: jest.fn(), - getSessionId: jest.fn(() => currentSessionId), - getSession$: jest.fn(() => sessionIdSubject.asObservable()), - }, - }; - } - - function createMockFilterManager() { - const unsubscribe = jest.fn(); - - let subscriber: () => void; - let filters: unknown = []; - - return { - getUpdates$: () => ({ - subscribe: ({ next }: { next: () => void }) => { - subscriber = next; - return unsubscribe; - }, - }), - setFilters: jest.fn((newFilters: unknown[]) => { - filters = newFilters; - if (subscriber) subscriber(); - }), - setAppFilters: jest.fn((newFilters: unknown[]) => { - filters = newFilters; - if (subscriber) subscriber(); - }), - getFilters: () => filters, - getGlobalFilters: () => { - // @ts-ignore - return filters.filter(esFilters.isFilterPinned); - }, - removeAll: () => { - filters = []; - subscriber(); - }, - }; - } - function createMockQueryString() { - return { - getQuery: jest.fn(() => ({ query: '', language: 'lucene' })), - setQuery: jest.fn(), - getDefaultQuery: jest.fn(() => ({ query: '', language: 'lucene' })), - }; - } - return { - query: { - filterManager: createMockFilterManager(), - timefilter: { - timefilter: createMockTimefilter(), - }, - queryString: createMockQueryString(), - state$: new Observable(), - }, - indexPatterns: { - get: jest.fn().mockImplementation((id) => Promise.resolve({ id, isTimeBased: () => true })), - }, - search: createMockSearchService(), - nowProvider: { - get: jest.fn(), - }, - fieldFormats: { - deserialize: jest.fn(), - }, - } as unknown as DataPublicPluginStart; -} - -export function makeDefaultServices( - sessionIdSubject = new Subject(), - sessionId: string | undefined = undefined, - doc = defaultDoc -): jest.Mocked { - const core = coreMock.createStart({ basePath: '/testbasepath' }); - core.uiSettings.get.mockImplementation( - jest.fn((type) => { - if (type === UI_SETTINGS.TIMEPICKER_TIME_DEFAULTS) { - return { from: 'now-7d', to: 'now' }; - } else if (type === UI_SETTINGS.SEARCH_QUERY_LANGUAGE) { - return 'kuery'; - } else if (type === 'state:storeInSessionStorage') { - return false; - } else { - return []; - } - }) - ); - - const navigationStartMock = navigationPluginMock.createStartContract(); - - jest.spyOn(navigationStartMock.ui.TopNavMenu.prototype, 'constructor').mockImplementation(() => { - return
; - }); - - function makeAttributeService(): LensAttributeService { - const attributeServiceMock = mockAttributeService< - ResolvedLensSavedObjectAttributes, - LensByValueInput, - LensByReferenceInput - >( - DOC_TYPE, - { - saveMethod: jest.fn(), - unwrapMethod: jest.fn(), - checkForDuplicateTitle: jest.fn(), - }, - core - ); - attributeServiceMock.unwrapAttributes = jest.fn().mockResolvedValue(exactMatchDoc); - attributeServiceMock.wrapAttributes = jest.fn().mockResolvedValue({ - savedObjectId: (doc as unknown as LensByReferenceInput).savedObjectId, - }); - - return attributeServiceMock; - } - - return { - http: core.http, - chrome: core.chrome, - overlays: core.overlays, - uiSettings: core.uiSettings, - navigation: navigationStartMock, - notifications: core.notifications, - attributeService: makeAttributeService(), - inspector: { - adapters: getLensInspectorService(inspectorPluginMock.createStartContract()).adapters, - inspect: jest.fn(), - close: jest.fn(), - }, - dashboard: dashboardPluginMock.createStartContract(), - presentationUtil: presentationUtilPluginMock.createStartContract(core), - savedObjectsClient: core.savedObjects.client, - dashboardFeatureFlag: { allowByValueEmbeddables: false }, - stateTransfer: createEmbeddableStateTransferMock() as EmbeddableStateTransfer, - getOriginatingAppName: jest.fn(() => 'defaultOriginatingApp'), - application: { - ...core.application, - capabilities: { - ...core.application.capabilities, - visualize: { save: true, saveQuery: true, show: true }, - }, - getUrlForApp: jest.fn((appId: string) => `/testbasepath/app/${appId}#/`), - }, - data: mockDataPlugin(sessionIdSubject, sessionId), - fieldFormats: fieldFormatsServiceMock.createStartContract(), - storage: { - get: jest.fn(), - set: jest.fn(), - remove: jest.fn(), - clear: jest.fn(), - }, - spaces: spacesPluginMock.createStartContract(), - }; -} - -export const defaultState = { - searchSessionId: 'sessionId-1', - filters: [], - query: { language: 'lucene', query: '' }, - resolvedDateRange: { fromDate: '2021-01-10T04:00:00.000Z', toDate: '2021-01-10T08:00:00.000Z' }, - isFullscreenDatasource: false, - isSaveable: false, - isLoading: false, - isLinkedToOriginatingApp: false, - activeDatasourceId: 'testDatasource', - visualization: { - state: {}, - activeId: 'testVis', - }, - datasourceStates: mockDatasourceStates(), -}; - -export function makeLensStore({ - preloadedState, - dispatch, - storeDeps = mockStoreDeps(), -}: { - storeDeps?: LensStoreDeps; - preloadedState?: Partial; - dispatch?: jest.Mock; -}) { - const data = storeDeps.lensServices.data; - const store = makeConfigureStore(storeDeps, { - lens: { - ...defaultState, - query: data.query.queryString.getQuery(), - filters: data.query.filterManager.getGlobalFilters(), - resolvedDateRange: getResolvedDateRange(data.query.timefilter.timefilter), - ...preloadedState, - }, - } as PreloadedState); - - const origDispatch = store.dispatch; - store.dispatch = jest.fn(dispatch || origDispatch); - return { store, deps: storeDeps }; -} - -export const mountWithProvider = async ( - component: React.ReactElement, - store?: { - storeDeps?: LensStoreDeps; - preloadedState?: Partial; - dispatch?: jest.Mock; - }, - options?: { - wrappingComponent?: React.FC<{ - children: React.ReactNode; - }>; - attachTo?: HTMLElement; - } -) => { - const { store: lensStore, deps } = makeLensStore(store || {}); - - let wrappingComponent: React.FC<{ - children: React.ReactNode; - }> = ({ children }) => {children}; - - let restOptions: { - attachTo?: HTMLElement | undefined; - }; - if (options) { - const { wrappingComponent: _wrappingComponent, ...rest } = options; - restOptions = rest; - - if (_wrappingComponent) { - wrappingComponent = ({ children }) => { - return _wrappingComponent({ - children: {children}, - }); - }; - } - } - - let instance: ReactWrapper = {} as ReactWrapper; - - await act(async () => { - instance = mount(component, { - wrappingComponent, - ...restOptions, - } as unknown as ReactWrapper); - }); - return { instance, lensStore, deps }; -}; diff --git a/x-pack/plugins/lens/public/mocks/data_plugin_mock.ts b/x-pack/plugins/lens/public/mocks/data_plugin_mock.ts new file mode 100644 index 0000000000000..daab2566b28fe --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/data_plugin_mock.ts @@ -0,0 +1,122 @@ +/* + * Copyright 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 { Observable, Subject } from 'rxjs'; +import moment from 'moment'; +import { DataPublicPluginStart, esFilters } from '../../../../../src/plugins/data/public'; + +function createMockTimefilter() { + const unsubscribe = jest.fn(); + + let timeFilter = { from: 'now-7d', to: 'now' }; + let subscriber: () => void; + return { + getTime: jest.fn(() => timeFilter), + setTime: jest.fn((newTimeFilter) => { + timeFilter = newTimeFilter; + if (subscriber) { + subscriber(); + } + }), + getTimeUpdate$: () => ({ + subscribe: ({ next }: { next: () => void }) => { + subscriber = next; + return unsubscribe; + }, + }), + calculateBounds: jest.fn(() => ({ + min: moment('2021-01-10T04:00:00.000Z'), + max: moment('2021-01-10T08:00:00.000Z'), + })), + getBounds: jest.fn(() => timeFilter), + getRefreshInterval: () => {}, + getRefreshIntervalDefaults: () => {}, + getAutoRefreshFetch$: () => new Observable(), + }; +} + +export function mockDataPlugin( + sessionIdSubject = new Subject(), + initialSessionId?: string +) { + function createMockSearchService() { + let sessionIdCounter = initialSessionId ? 1 : 0; + let currentSessionId: string | undefined = initialSessionId; + const start = () => { + currentSessionId = `sessionId-${++sessionIdCounter}`; + return currentSessionId; + }; + return { + session: { + start: jest.fn(start), + clear: jest.fn(), + getSessionId: jest.fn(() => currentSessionId), + getSession$: jest.fn(() => sessionIdSubject.asObservable()), + }, + }; + } + + function createMockFilterManager() { + const unsubscribe = jest.fn(); + + let subscriber: () => void; + let filters: unknown = []; + + return { + getUpdates$: () => ({ + subscribe: ({ next }: { next: () => void }) => { + subscriber = next; + return unsubscribe; + }, + }), + setFilters: jest.fn((newFilters: unknown[]) => { + filters = newFilters; + if (subscriber) subscriber(); + }), + setAppFilters: jest.fn((newFilters: unknown[]) => { + filters = newFilters; + if (subscriber) subscriber(); + }), + getFilters: () => filters, + getGlobalFilters: () => { + // @ts-ignore + return filters.filter(esFilters.isFilterPinned); + }, + removeAll: () => { + filters = []; + subscriber(); + }, + }; + } + function createMockQueryString() { + return { + getQuery: jest.fn(() => ({ query: '', language: 'lucene' })), + setQuery: jest.fn(), + getDefaultQuery: jest.fn(() => ({ query: '', language: 'lucene' })), + }; + } + return { + query: { + filterManager: createMockFilterManager(), + timefilter: { + timefilter: createMockTimefilter(), + }, + queryString: createMockQueryString(), + state$: new Observable(), + }, + indexPatterns: { + get: jest.fn().mockImplementation((id) => Promise.resolve({ id, isTimeBased: () => true })), + }, + search: createMockSearchService(), + nowProvider: { + get: jest.fn(), + }, + fieldFormats: { + deserialize: jest.fn(), + }, + } as unknown as DataPublicPluginStart; +} diff --git a/x-pack/plugins/lens/public/mocks/datasource_mock.ts b/x-pack/plugins/lens/public/mocks/datasource_mock.ts new file mode 100644 index 0000000000000..2614b1d5fdc94 --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/datasource_mock.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DatasourcePublicAPI, Datasource } from '../types'; + +export type DatasourceMock = jest.Mocked & { + publicAPIMock: jest.Mocked; +}; + +export function createMockDatasource(id: string): DatasourceMock { + const publicAPIMock: jest.Mocked = { + datasourceId: id, + getTableSpec: jest.fn(() => []), + getOperationForColumnId: jest.fn(), + }; + + return { + id: 'testDatasource', + clearLayer: jest.fn((state, _layerId) => state), + getDatasourceSuggestionsForField: jest.fn((_state, _item, filterFn) => []), + getDatasourceSuggestionsForVisualizeField: jest.fn((_state, _indexpatternId, _fieldName) => []), + getDatasourceSuggestionsFromCurrentState: jest.fn((_state) => []), + getPersistableState: jest.fn((x) => ({ + state: x, + savedObjectReferences: [{ type: 'index-pattern', id: 'mockip', name: 'mockip' }], + })), + getPublicAPI: jest.fn().mockReturnValue(publicAPIMock), + initialize: jest.fn((_state?) => Promise.resolve()), + renderDataPanel: jest.fn(), + renderLayerPanel: jest.fn(), + toExpression: jest.fn((_frame, _state) => null), + insertLayer: jest.fn((_state, _newLayerId) => ({})), + removeLayer: jest.fn((_state, _layerId) => {}), + removeColumn: jest.fn((props) => {}), + getLayers: jest.fn((_state) => []), + uniqueLabels: jest.fn((_state) => ({})), + renderDimensionTrigger: jest.fn(), + renderDimensionEditor: jest.fn(), + getDropProps: jest.fn(), + onDrop: jest.fn(), + + // this is an additional property which doesn't exist on real datasources + // but can be used to validate whether specific API mock functions are called + publicAPIMock, + getErrorMessages: jest.fn((_state) => undefined), + checkIntegrity: jest.fn((_state) => []), + isTimeBased: jest.fn(), + isValidColumn: jest.fn(), + }; +} + +export function mockDatasourceMap() { + const datasource = createMockDatasource('testDatasource'); + datasource.getDatasourceSuggestionsFromCurrentState.mockReturnValue([ + { + state: {}, + table: { + columns: [], + isMultiRow: true, + layerId: 'a', + changeType: 'unchanged', + }, + keptLayerIds: ['a'], + }, + ]); + + datasource.getLayers.mockReturnValue(['a']); + return { + testDatasource2: createMockDatasource('testDatasource2'), + testDatasource: datasource, + }; +} + +export const datasourceMap = mockDatasourceMap(); diff --git a/x-pack/plugins/lens/public/mocks/expression_renderer_mock.tsx b/x-pack/plugins/lens/public/mocks/expression_renderer_mock.tsx new file mode 100644 index 0000000000000..644021e8a69c2 --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/expression_renderer_mock.tsx @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { ReactExpressionRendererProps } from 'src/plugins/expressions/public'; + +export function createExpressionRendererMock(): jest.Mock< + React.ReactElement, + [ReactExpressionRendererProps] +> { + return jest.fn((_) => ); +} diff --git a/x-pack/plugins/lens/public/mocks/index.ts b/x-pack/plugins/lens/public/mocks/index.ts new file mode 100644 index 0000000000000..2dd32a1679f1b --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/index.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FramePublicAPI, FrameDatasourceAPI } from '../types'; +export { mockDataPlugin } from './data_plugin_mock'; +export { + visualizationMap, + createMockVisualization, + mockVisualizationMap, +} from './visualization_mock'; +export { datasourceMap, mockDatasourceMap, createMockDatasource } from './datasource_mock'; +export type { DatasourceMock } from './datasource_mock'; +export { createExpressionRendererMock } from './expression_renderer_mock'; +export { defaultDoc, exactMatchDoc, makeDefaultServices } from './services_mock'; +export { + mockStoreDeps, + mockDatasourceStates, + defaultState, + makeLensStore, + MountStoreProps, + mountWithProvider, +} from './store_mocks'; +export { lensPluginMock } from './lens_plugin_mock'; + +export type FrameMock = jest.Mocked; + +export const createMockFramePublicAPI = (): FrameMock => ({ + datasourceLayers: {}, +}); + +export type FrameDatasourceMock = jest.Mocked; + +export const createMockFrameDatasourceAPI = (): FrameDatasourceMock => ({ + datasourceLayers: {}, + dateRange: { fromDate: 'now-7d', toDate: 'now' }, + query: { query: '', language: 'lucene' }, + filters: [], +}); diff --git a/x-pack/plugins/lens/public/mocks/lens_plugin_mock.tsx b/x-pack/plugins/lens/public/mocks/lens_plugin_mock.tsx new file mode 100644 index 0000000000000..a92533a89ba67 --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/lens_plugin_mock.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { LensPublicStart } from '..'; +import { visualizationTypes } from '../xy_visualization/types'; + +type Start = jest.Mocked; + +export const lensPluginMock = { + createStartContract: (): Start => { + const startContract: Start = { + EmbeddableComponent: jest.fn(() => { + return Lens Embeddable Component; + }), + SaveModalComponent: jest.fn(() => { + return Lens Save Modal Component; + }), + canUseEditor: jest.fn(() => true), + navigateToPrefilledEditor: jest.fn(), + getXyVisTypes: jest + .fn() + .mockReturnValue(new Promise((resolve) => resolve(visualizationTypes))), + }; + return startContract; + }, +}; diff --git a/x-pack/plugins/lens/public/mocks/services_mock.tsx b/x-pack/plugins/lens/public/mocks/services_mock.tsx new file mode 100644 index 0000000000000..c6db0dfb6aae8 --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/services_mock.tsx @@ -0,0 +1,143 @@ +/* + * Copyright 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 { Subject } from 'rxjs'; +import { coreMock } from 'src/core/public/mocks'; +import { navigationPluginMock } from '../../../../../src/plugins/navigation/public/mocks'; +import { LensAppServices } from '../app_plugin/types'; +import { DOC_TYPE } from '../../common'; +import { UI_SETTINGS } from '../../../../../src/plugins/data/public'; +import { inspectorPluginMock } from '../../../../../src/plugins/inspector/public/mocks'; +import { spacesPluginMock } from '../../../spaces/public/mocks'; +import { dashboardPluginMock } from '../../../../../src/plugins/dashboard/public/mocks'; +import type { + LensByValueInput, + LensByReferenceInput, + ResolvedLensSavedObjectAttributes, +} from '../embeddable/embeddable'; +import { + mockAttributeService, + createEmbeddableStateTransferMock, +} from '../../../../../src/plugins/embeddable/public/mocks'; +import { fieldFormatsServiceMock } from '../../../../../src/plugins/field_formats/public/mocks'; +import type { LensAttributeService } from '../lens_attribute_service'; +import type { EmbeddableStateTransfer } from '../../../../../src/plugins/embeddable/public'; + +import { presentationUtilPluginMock } from '../../../../../src/plugins/presentation_util/public/mocks'; +import { mockDataPlugin } from './data_plugin_mock'; +import { getLensInspectorService } from '../lens_inspector_service'; + +export const defaultDoc = { + savedObjectId: '1234', + title: 'An extremely cool default document!', + expression: 'definitely a valid expression', + visualizationType: 'testVis', + state: { + query: 'kuery', + filters: [{ query: { match_phrase: { src: 'test' } } }], + datasourceStates: { + testDatasource: 'datasource', + }, + visualization: {}, + }, + references: [{ type: 'index-pattern', id: '1', name: 'index-pattern-0' }], +} as unknown as Document; + +export const exactMatchDoc = { + ...defaultDoc, + sharingSavedObjectProps: { + outcome: 'exactMatch', + }, +}; + +export function makeDefaultServices( + sessionIdSubject = new Subject(), + sessionId: string | undefined = undefined, + doc = defaultDoc +): jest.Mocked { + const core = coreMock.createStart({ basePath: '/testbasepath' }); + core.uiSettings.get.mockImplementation( + jest.fn((type) => { + if (type === UI_SETTINGS.TIMEPICKER_TIME_DEFAULTS) { + return { from: 'now-7d', to: 'now' }; + } else if (type === UI_SETTINGS.SEARCH_QUERY_LANGUAGE) { + return 'kuery'; + } else if (type === 'state:storeInSessionStorage') { + return false; + } else { + return []; + } + }) + ); + + const navigationStartMock = navigationPluginMock.createStartContract(); + + jest.spyOn(navigationStartMock.ui.TopNavMenu.prototype, 'constructor').mockImplementation(() => { + return
; + }); + + function makeAttributeService(): LensAttributeService { + const attributeServiceMock = mockAttributeService< + ResolvedLensSavedObjectAttributes, + LensByValueInput, + LensByReferenceInput + >( + DOC_TYPE, + { + saveMethod: jest.fn(), + unwrapMethod: jest.fn(), + checkForDuplicateTitle: jest.fn(), + }, + core + ); + attributeServiceMock.unwrapAttributes = jest.fn().mockResolvedValue(exactMatchDoc); + attributeServiceMock.wrapAttributes = jest.fn().mockResolvedValue({ + savedObjectId: (doc as unknown as LensByReferenceInput).savedObjectId, + }); + + return attributeServiceMock; + } + + return { + http: core.http, + chrome: core.chrome, + overlays: core.overlays, + uiSettings: core.uiSettings, + navigation: navigationStartMock, + notifications: core.notifications, + attributeService: makeAttributeService(), + inspector: { + adapters: getLensInspectorService(inspectorPluginMock.createStartContract()).adapters, + inspect: jest.fn(), + close: jest.fn(), + }, + dashboard: dashboardPluginMock.createStartContract(), + presentationUtil: presentationUtilPluginMock.createStartContract(core), + savedObjectsClient: core.savedObjects.client, + dashboardFeatureFlag: { allowByValueEmbeddables: false }, + stateTransfer: createEmbeddableStateTransferMock() as EmbeddableStateTransfer, + getOriginatingAppName: jest.fn(() => 'defaultOriginatingApp'), + application: { + ...core.application, + capabilities: { + ...core.application.capabilities, + visualize: { save: true, saveQuery: true, show: true }, + }, + getUrlForApp: jest.fn((appId: string) => `/testbasepath/app/${appId}#/`), + }, + data: mockDataPlugin(sessionIdSubject, sessionId), + fieldFormats: fieldFormatsServiceMock.createStartContract(), + storage: { + get: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + clear: jest.fn(), + }, + spaces: spacesPluginMock.createStartContract(), + }; +} diff --git a/x-pack/plugins/lens/public/mocks/store_mocks.tsx b/x-pack/plugins/lens/public/mocks/store_mocks.tsx new file mode 100644 index 0000000000000..1b1d83ef2892d --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/store_mocks.tsx @@ -0,0 +1,140 @@ +/* + * Copyright 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'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { ReactWrapper } from 'enzyme'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { mountWithIntl as mount } from '@kbn/test/jest'; +import { Provider } from 'react-redux'; +import { act } from 'react-dom/test-utils'; +import { PreloadedState } from '@reduxjs/toolkit'; +import { LensAppServices } from '../app_plugin/types'; + +import { + makeConfigureStore, + LensAppState, + LensState, + LensStoreDeps, +} from '../state_management/index'; +import { getResolvedDateRange } from '../utils'; +import { DatasourceMap, VisualizationMap } from '../types'; +import { mockVisualizationMap } from './visualization_mock'; +import { mockDatasourceMap } from './datasource_mock'; +import { makeDefaultServices } from './services_mock'; + +export const mockStoreDeps = (deps?: { + lensServices?: LensAppServices; + datasourceMap?: DatasourceMap; + visualizationMap?: VisualizationMap; +}) => { + return { + datasourceMap: deps?.datasourceMap || mockDatasourceMap(), + visualizationMap: deps?.visualizationMap || mockVisualizationMap(), + lensServices: deps?.lensServices || makeDefaultServices(), + }; +}; + +export function mockDatasourceStates() { + return { + testDatasource: { + state: {}, + isLoading: false, + }, + }; +} + +export const defaultState = { + searchSessionId: 'sessionId-1', + filters: [], + query: { language: 'lucene', query: '' }, + resolvedDateRange: { fromDate: '2021-01-10T04:00:00.000Z', toDate: '2021-01-10T08:00:00.000Z' }, + isFullscreenDatasource: false, + isSaveable: false, + isLoading: false, + isLinkedToOriginatingApp: false, + activeDatasourceId: 'testDatasource', + visualization: { + state: {}, + activeId: 'testVis', + }, + datasourceStates: mockDatasourceStates(), +}; + +export function makeLensStore({ + preloadedState, + dispatch, + storeDeps = mockStoreDeps(), +}: { + storeDeps?: LensStoreDeps; + preloadedState?: Partial; + dispatch?: jest.Mock; +}) { + const data = storeDeps.lensServices.data; + const store = makeConfigureStore(storeDeps, { + lens: { + ...defaultState, + query: data.query.queryString.getQuery(), + filters: data.query.filterManager.getGlobalFilters(), + resolvedDateRange: getResolvedDateRange(data.query.timefilter.timefilter), + ...preloadedState, + }, + } as PreloadedState); + + const origDispatch = store.dispatch; + store.dispatch = jest.fn(dispatch || origDispatch); + return { store, deps: storeDeps }; +} + +export interface MountStoreProps { + storeDeps?: LensStoreDeps; + preloadedState?: Partial; + dispatch?: jest.Mock; +} + +export const mountWithProvider = async ( + component: React.ReactElement, + store?: MountStoreProps, + options?: { + wrappingComponent?: React.FC<{ + children: React.ReactNode; + }>; + attachTo?: HTMLElement; + } +) => { + const { store: lensStore, deps } = makeLensStore(store || {}); + + let wrappingComponent: React.FC<{ + children: React.ReactNode; + }> = ({ children }) => {children}; + + let restOptions: { + attachTo?: HTMLElement | undefined; + }; + if (options) { + const { wrappingComponent: _wrappingComponent, ...rest } = options; + restOptions = rest; + + if (_wrappingComponent) { + wrappingComponent = ({ children }) => { + return _wrappingComponent({ + children: {children}, + }); + }; + } + } + + let instance: ReactWrapper = {} as ReactWrapper; + + await act(async () => { + instance = mount(component, { + wrappingComponent, + ...restOptions, + } as unknown as ReactWrapper); + }); + return { instance, lensStore, deps }; +}; diff --git a/x-pack/plugins/lens/public/mocks/visualization_mock.ts b/x-pack/plugins/lens/public/mocks/visualization_mock.ts new file mode 100644 index 0000000000000..199bf9a9db77a --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/visualization_mock.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { layerTypes } from '../../common'; +import { Visualization, VisualizationMap } from '../types'; + +export function createMockVisualization(id = 'testVis'): jest.Mocked { + return { + id, + clearLayer: jest.fn((state, _layerId) => state), + removeLayer: jest.fn(), + getLayerIds: jest.fn((_state) => ['layer1']), + getSupportedLayers: jest.fn(() => [{ type: layerTypes.DATA, label: 'Data Layer' }]), + getLayerType: jest.fn((_state, _layerId) => layerTypes.DATA), + visualizationTypes: [ + { + icon: 'empty', + id, + label: 'TEST', + groupLabel: `${id}Group`, + }, + ], + appendLayer: jest.fn(), + getVisualizationTypeId: jest.fn((_state) => 'empty'), + getDescription: jest.fn((_state) => ({ label: '' })), + switchVisualizationType: jest.fn((_, x) => x), + getSuggestions: jest.fn((_options) => []), + initialize: jest.fn((_frame, _state?) => ({ newState: 'newState' })), + getConfiguration: jest.fn((props) => ({ + groups: [ + { + groupId: 'a', + groupLabel: 'a', + layerId: 'layer1', + supportsMoreColumns: true, + accessors: [], + filterOperations: jest.fn(() => true), + dataTestSubj: 'mockVisA', + }, + ], + })), + toExpression: jest.fn((_state, _frame) => null), + toPreviewExpression: jest.fn((_state, _frame) => null), + + setDimension: jest.fn(), + removeDimension: jest.fn(), + getErrorMessages: jest.fn((_state) => undefined), + renderDimensionEditor: jest.fn(), + }; +} + +export const mockVisualizationMap = (): VisualizationMap => { + return { + testVis: createMockVisualization(), + testVis2: createMockVisualization(), + }; +}; + +export const visualizationMap = mockVisualizationMap(); diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx index 33e9154235147..ad4e30cd6e89f 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx @@ -302,12 +302,13 @@ describe('PieVisualization component', () => { `); }); - test('does not set click listener on non-interactive mode', () => { + test('does not set click listener and legend actions on non-interactive mode', () => { const defaultArgs = getDefaultArgs(); const component = shallow( ); expect(component.find(Settings).first().prop('onElementClick')).toBeUndefined(); + expect(component.find(Settings).first().prop('legendAction')).toBeUndefined(); }); test('it renders the empty placeholder when metric contains only falsy data', () => { diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx index 834fecb95fc35..449b152523881 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx @@ -290,7 +290,7 @@ export function PieComponent( legendPosition={legendPosition || Position.Right} legendMaxDepth={nestedLegend ? undefined : 1 /* Color is based only on first layer */} onElementClick={props.interactive ?? true ? onElementClickHandler : undefined} - legendAction={getLegendAction(firstTable, onClickValue)} + legendAction={props.interactive ? getLegendAction(firstTable, onClickValue) : undefined} theme={{ ...chartTheme, background: { diff --git a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/expression.test.tsx.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/expression.test.tsx.snap index 0fad522624975..b058c42d8b4d1 100644 --- a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/expression.test.tsx.snap +++ b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/expression.test.tsx.snap @@ -5,7 +5,7 @@ exports[`xy_expression XYChart component it renders area 1`] = ` renderer="canvas" > { expect(wrapper.find(Settings).first().prop('onBrushEnd')).toBeUndefined(); }); - test('allowBrushingLastHistogramBucket is true for date histogram data', () => { + test('allowBrushingLastHistogramBin is true for date histogram data', () => { const { args } = sampleArgs(); const wrapper = mountWithIntl( @@ -1182,7 +1182,7 @@ describe('xy_expression', () => { }} /> ); - expect(wrapper.find(Settings).at(0).prop('allowBrushingLastHistogramBucket')).toEqual(true); + expect(wrapper.find(Settings).at(0).prop('allowBrushingLastHistogramBin')).toEqual(true); }); test('onElementClick returns correct context data', () => { @@ -1445,7 +1445,7 @@ describe('xy_expression', () => { }); }); - test('allowBrushingLastHistogramBucket should be fakse for ordinal data', () => { + test('allowBrushingLastHistogramBin should be fakse for ordinal data', () => { const { args, data } = sampleArgs(); const wrapper = mountWithIntl( @@ -1472,7 +1472,7 @@ describe('xy_expression', () => { /> ); - expect(wrapper.find(Settings).at(0).prop('allowBrushingLastHistogramBucket')).toEqual(false); + expect(wrapper.find(Settings).at(0).prop('allowBrushingLastHistogramBin')).toEqual(false); }); test('onElementClick is not triggering event on non-interactive mode', () => { @@ -1485,6 +1485,16 @@ describe('xy_expression', () => { expect(wrapper.find(Settings).first().prop('onElementClick')).toBeUndefined(); }); + test('legendAction is not triggering event on non-interactive mode', () => { + const { args, data } = sampleArgs(); + + const wrapper = mountWithIntl( + + ); + + expect(wrapper.find(Settings).first().prop('legendAction')).toBeUndefined(); + }); + test('it renders stacked bar', () => { const { data, args } = sampleArgs(); const component = shallow( diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.tsx index 36f1b92b8a1f4..32ca4c982c10e 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.tsx @@ -594,18 +594,22 @@ export function XYChart({ boundary: document.getElementById('app-fixed-viewport') ?? undefined, headerFormatter: (d) => safeXAccessorLabelRenderer(d.value), }} - allowBrushingLastHistogramBucket={Boolean(isTimeViz)} + allowBrushingLastHistogramBin={Boolean(isTimeViz)} rotation={shouldRotate ? 90 : 0} xDomain={xDomain} onBrushEnd={interactive ? (brushHandler as BrushEndListener) : undefined} onElementClick={interactive ? clickHandler : undefined} - legendAction={getLegendAction( - filteredLayers, - data.tables, - onClickValue, - formatFactory, - layersAlreadyFormatted - )} + legendAction={ + interactive + ? getLegendAction( + filteredLayers, + data.tables, + onClickValue, + formatFactory, + layersAlreadyFormatted + ) + : undefined + } showLegendExtra={isHistogramViz && valuesInLegend} /> diff --git a/x-pack/plugins/lens/public/xy_visualization/visualization.test.ts b/x-pack/plugins/lens/public/xy_visualization/visualization.test.ts index 01fbbd892a118..973501816bc3e 100644 --- a/x-pack/plugins/lens/public/xy_visualization/visualization.test.ts +++ b/x-pack/plugins/lens/public/xy_visualization/visualization.test.ts @@ -538,6 +538,214 @@ describe('xy_visualization', () => { expect(ops.filter(filterOperations).map((x) => x.dataType)).toEqual(['number']); }); + describe('breakdown group: percentage chart checks', () => { + const baseState = exampleState(); + + it('should require break down group with one accessor + one split accessor configuration', () => { + const [, , splitGroup] = xyVisualization.getConfiguration({ + state: { + ...baseState, + layers: [ + { ...baseState.layers[0], accessors: ['a'], seriesType: 'bar_percentage_stacked' }, + ], + }, + frame, + layerId: 'first', + }).groups; + expect(splitGroup.required).toBe(true); + }); + + test.each([ + [ + 'multiple accessors on the same layer', + [ + { + ...baseState.layers[0], + splitAccessor: undefined, + seriesType: 'bar_percentage_stacked', + }, + ], + ], + [ + 'multiple accessors spread on compatible layers', + [ + { + ...baseState.layers[0], + accessors: ['a'], + splitAccessor: undefined, + seriesType: 'bar_percentage_stacked', + }, + { + ...baseState.layers[0], + splitAccessor: undefined, + xAccessor: 'd', + accessors: ['e'], + seriesType: 'bar_percentage_stacked', + }, + ], + ], + ] as Array<[string, State['layers']]>)( + 'should not require break down group for %s', + (_, layers) => { + const [, , splitGroup] = xyVisualization.getConfiguration({ + state: { ...baseState, layers }, + frame, + layerId: 'first', + }).groups; + expect(splitGroup.required).toBe(false); + } + ); + + it.each([ + [ + 'one accessor only', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + splitAccessor: undefined, + xAccessor: undefined, + }, + ], + ], + [ + 'one accessor only with split accessor', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + xAccessor: undefined, + }, + ], + ], + [ + 'one accessor only with xAccessor', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + splitAccessor: undefined, + }, + ], + ], + [ + 'multiple accessors spread on incompatible layers (different xAccessor)', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + splitAccessor: undefined, + }, + { + ...baseState.layers[0], + accessors: ['e'], + seriesType: 'bar_percentage_stacked', + splitAccessor: undefined, + xAccessor: undefined, + }, + ], + ], + [ + 'multiple accessors spread on incompatible layers (different splitAccessor)', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + }, + { + ...baseState.layers[0], + accessors: ['e'], + seriesType: 'bar_percentage_stacked', + splitAccessor: undefined, + xAccessor: undefined, + }, + ], + ], + [ + 'multiple accessors spread on incompatible layers (different seriesType)', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + }, + { + ...baseState.layers[0], + accessors: ['e'], + seriesType: 'bar', + }, + ], + ], + [ + 'one data layer with one accessor + one reference layer', + [ + { + ...baseState.layers[0], + accessors: ['a'], + seriesType: 'bar_percentage_stacked', + }, + { + ...baseState.layers[0], + accessors: ['e'], + seriesType: 'bar_percentage_stacked', + layerType: layerTypes.REFERENCELINE, + }, + ], + ], + + [ + 'multiple accessors on the same layers with different axis assigned', + [ + { + ...baseState.layers[0], + splitAccessor: undefined, + seriesType: 'bar_percentage_stacked', + yConfig: [ + { forAccessor: 'a', axisMode: 'left' }, + { forAccessor: 'b', axisMode: 'right' }, + ], + }, + ], + ], + [ + 'multiple accessors spread on multiple layers with different axis assigned', + [ + { + ...baseState.layers[0], + accessors: ['a'], + xAccessor: undefined, + splitAccessor: undefined, + seriesType: 'bar_percentage_stacked', + yConfig: [{ forAccessor: 'a', axisMode: 'left' }], + }, + { + ...baseState.layers[0], + accessors: ['b'], + xAccessor: undefined, + splitAccessor: undefined, + seriesType: 'bar_percentage_stacked', + yConfig: [{ forAccessor: 'b', axisMode: 'right' }], + }, + ], + ], + ] as Array<[string, State['layers']]>)( + 'should require break down group for %s', + (_, layers) => { + const [, , splitGroup] = xyVisualization.getConfiguration({ + state: { ...baseState, layers }, + frame, + layerId: 'first', + }).groups; + expect(splitGroup.required).toBe(true); + } + ); + }); + describe('reference lines', () => { beforeEach(() => { frame.datasourceLayers = { diff --git a/x-pack/plugins/lens/public/xy_visualization/visualization.tsx b/x-pack/plugins/lens/public/xy_visualization/visualization.tsx index db1a2aeffb670..c23eccb196744 100644 --- a/x-pack/plugins/lens/public/xy_visualization/visualization.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/visualization.tsx @@ -40,6 +40,7 @@ import { checkXAccessorCompatibility, getAxisName, } from './visualization_helpers'; +import { groupAxesByType } from './axes_configuration'; const defaultIcon = LensIconChartBarStacked; const defaultSeriesType = 'bar_stacked'; @@ -378,6 +379,40 @@ export const getXyVisualization = ({ }; } + const { left, right } = groupAxesByType([layer], frame.activeData); + // Check locally if it has one accessor OR one accessor per axis + const layerHasOnlyOneAccessor = Boolean( + layer.accessors.length < 2 || + (left.length && left.length < 2) || + (right.length && right.length < 2) + ); + // Check also for multiple layers that can stack for percentage charts + // Make sure that if multiple dimensions are defined for a single layer, they should belong to the same axis + const hasOnlyOneAccessor = + layerHasOnlyOneAccessor && + getLayersByType(state, layerTypes.DATA).filter( + // check that the other layers are compatible with this one + (dataLayer) => { + if ( + dataLayer.seriesType === layer.seriesType && + Boolean(dataLayer.xAccessor) === Boolean(layer.xAccessor) && + Boolean(dataLayer.splitAccessor) === Boolean(layer.splitAccessor) + ) { + const { left: localLeft, right: localRight } = groupAxesByType( + [dataLayer], + frame.activeData + ); + // return true only if matching axis are found + return ( + dataLayer.accessors.length && + (Boolean(localLeft.length) === Boolean(left.length) || + Boolean(localRight.length) === Boolean(right.length)) + ); + } + return false; + } + ).length < 2; + return { groups: [ { @@ -417,7 +452,7 @@ export const getXyVisualization = ({ filterOperations: isBucketed, supportsMoreColumns: !layer.splitAccessor, dataTestSubj: 'lnsXY_splitDimensionPanel', - required: layer.seriesType.includes('percentage'), + required: layer.seriesType.includes('percentage') && hasOnlyOneAccessor, enableDimensionEditor: true, }, ], diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/exception_items_renderer.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/exception_items_renderer.tsx index 1b25a2cb91e85..280dd8acbc7e5 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/exception_items_renderer.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/exception_items_renderer.tsx @@ -81,6 +81,7 @@ export interface ExceptionBuilderProps { isAndDisabled: boolean; isNestedDisabled: boolean; isOrDisabled: boolean; + isOrHidden?: boolean; listId: string; listNamespaceType: NamespaceType; listType: ExceptionListType; @@ -103,6 +104,7 @@ export const ExceptionBuilderComponent = ({ isAndDisabled, isNestedDisabled, isOrDisabled, + isOrHidden = false, listId, listNamespaceType, listType, @@ -433,6 +435,7 @@ export const ExceptionBuilderComponent = ({ { expect(wrapper.find('[data-test-subj="exceptionsNestedButton"] button')).toHaveLength(0); }); + test('it hides "or" button', () => { + const wrapper = mount( + + ); + + expect(wrapper.find('[data-test-subj="exceptionsOrButton"] button')).toHaveLength(0); + }); + test('it invokes "onOrClicked" when "or" button is clicked', () => { const onOrClicked = jest.fn(); diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/logic_buttons.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/logic_buttons.tsx index 3846b844bb55a..aa308ecdc3452 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/logic_buttons.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/logic_buttons.tsx @@ -20,6 +20,7 @@ interface BuilderLogicButtonsProps { isNested: boolean; isNestedDisabled: boolean; isOrDisabled: boolean; + isOrHidden?: boolean; showNestedButton: boolean; onAddClickWhenNested: () => void; onAndClicked: () => void; @@ -32,6 +33,7 @@ export const BuilderLogicButtons: React.FC = ({ isNested, isNestedDisabled = true, isOrDisabled = false, + isOrHidden = false, showNestedButton = false, onAddClickWhenNested, onAndClicked, @@ -50,18 +52,20 @@ export const BuilderLogicButtons: React.FC = ({ {i18n.AND} - - - {i18n.OR} - - + {!isOrHidden && ( + + + {i18n.OR} + + + )} {showNestedButton && ( void): void; dataFilters: DataFilters; @@ -280,27 +280,30 @@ function endDataLoad( throw new DataRequestAbortError(); } - const features = data && 'features' in data ? (data as FeatureCollection).features : []; + if (dataId === SOURCE_DATA_REQUEST_ID) { + const features = data && 'features' in data ? (data as FeatureCollection).features : []; + + const eventHandlers = getEventHandlers(getState()); + if (eventHandlers && eventHandlers.onDataLoadEnd) { + const layer = getLayerById(layerId, getState()); + const resultMeta: ResultMeta = {}; + if (layer && layer.getType() === LAYER_TYPE.VECTOR) { + const featuresWithoutCentroids = features.filter((feature) => { + return feature.properties ? !feature.properties[KBN_IS_CENTROID_FEATURE] : true; + }); + resultMeta.featuresCount = featuresWithoutCentroids.length; + } - const eventHandlers = getEventHandlers(getState()); - if (eventHandlers && eventHandlers.onDataLoadEnd) { - const layer = getLayerById(layerId, getState()); - const resultMeta: ResultMeta = {}; - if (layer && layer.getType() === LAYER_TYPE.VECTOR) { - const featuresWithoutCentroids = features.filter((feature) => { - return feature.properties ? !feature.properties[KBN_IS_CENTROID_FEATURE] : true; + eventHandlers.onDataLoadEnd({ + layerId, + dataId, + resultMeta, }); - resultMeta.featuresCount = featuresWithoutCentroids.length; } - eventHandlers.onDataLoadEnd({ - layerId, - dataId, - resultMeta, - }); + dispatch(updateTooltipStateForLayer(layerId, features)); } - dispatch(cleanTooltipStateForLayer(layerId, features)); dispatch({ type: LAYER_DATA_LOAD_ENDED, layerId, @@ -331,16 +334,19 @@ function onDataLoadError( ) => { dispatch(unregisterCancelCallback(requestToken)); - const eventHandlers = getEventHandlers(getState()); - if (eventHandlers && eventHandlers.onDataLoadError) { - eventHandlers.onDataLoadError({ - layerId, - dataId, - errorMessage, - }); + if (dataId === SOURCE_DATA_REQUEST_ID) { + const eventHandlers = getEventHandlers(getState()); + if (eventHandlers && eventHandlers.onDataLoadError) { + eventHandlers.onDataLoadError({ + layerId, + dataId, + errorMessage, + }); + } + + dispatch(updateTooltipStateForLayer(layerId)); } - dispatch(cleanTooltipStateForLayer(layerId)); dispatch({ type: LAYER_DATA_LOAD_ERROR, layerId, @@ -361,6 +367,10 @@ export function updateSourceDataRequest(layerId: string, newData: object) { newData, }); + if ('features' in newData) { + dispatch(updateTooltipStateForLayer(layerId, (newData as FeatureCollection).features)); + } + dispatch(updateStyleMeta(layerId)); }; } diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index d67aef645b03a..9e937d86515e2 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -41,7 +41,7 @@ import { UPDATE_SOURCE_PROP, } from './map_action_constants'; import { clearDataRequests, syncDataForLayerId, updateStyleMeta } from './data_request_actions'; -import { cleanTooltipStateForLayer } from './tooltip_actions'; +import { updateTooltipStateForLayer } from './tooltip_actions'; import { Attribution, JoinDescriptor, @@ -217,7 +217,7 @@ export function setLayerVisibility(layerId: string, makeVisible: boolean) { } if (!makeVisible) { - dispatch(cleanTooltipStateForLayer(layerId)); + dispatch(updateTooltipStateForLayer(layerId)); } dispatch({ @@ -504,7 +504,7 @@ function removeLayerFromLayerList(layerId: string) { layerGettingRemoved.getInFlightRequestTokens().forEach((requestToken) => { dispatch(cancelRequest(requestToken)); }); - dispatch(cleanTooltipStateForLayer(layerId)); + dispatch(updateTooltipStateForLayer(layerId)); layerGettingRemoved.destroy(); dispatch({ type: REMOVE_LAYER, diff --git a/x-pack/plugins/maps/public/actions/map_actions.ts b/x-pack/plugins/maps/public/actions/map_actions.ts index ba52203ce486b..cf1e22ab90f88 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.ts @@ -60,7 +60,7 @@ import { addLayer, addLayerWithoutDataSync } from './layer_actions'; import { MapSettings } from '../reducers/map'; import { DrawState, MapCenterAndZoom, MapExtent, Timeslice } from '../../common/descriptor_types'; import { INITIAL_LOCATION } from '../../common/constants'; -import { cleanTooltipStateForLayer } from './tooltip_actions'; +import { updateTooltipStateForLayer } from './tooltip_actions'; import { VectorLayer } from '../classes/layers/vector_layer'; import { SET_DRAW_MODE } from './ui_actions'; import { expandToTileBoundaries } from '../../common/geo_tile_utils'; @@ -171,7 +171,7 @@ export function mapExtentChanged(mapExtentState: MapExtentState) { if (prevZoom !== nextZoom) { getLayerList(getState()).map((layer) => { if (!layer.showAtZoomLevel(nextZoom)) { - dispatch(cleanTooltipStateForLayer(layer.getId())); + dispatch(updateTooltipStateForLayer(layer.getId())); } }); } diff --git a/x-pack/plugins/maps/public/actions/tooltip_actions.ts b/x-pack/plugins/maps/public/actions/tooltip_actions.ts index c1b5f8190a73a..67b6842caeb46 100644 --- a/x-pack/plugins/maps/public/actions/tooltip_actions.ts +++ b/x-pack/plugins/maps/public/actions/tooltip_actions.ts @@ -10,8 +10,8 @@ import { Dispatch } from 'redux'; import { Feature } from 'geojson'; import { getOpenTooltips } from '../selectors/map_selectors'; import { SET_OPEN_TOOLTIPS } from './map_action_constants'; -import { FEATURE_ID_PROPERTY_NAME } from '../../common/constants'; -import { TooltipState } from '../../common/descriptor_types'; +import { FEATURE_ID_PROPERTY_NAME, FEATURE_VISIBLE_PROPERTY_NAME } from '../../common/constants'; +import { TooltipFeature, TooltipState } from '../../common/descriptor_types'; import { MapStoreState } from '../reducers/store'; export function closeOnClickTooltip(tooltipId: string) { @@ -62,26 +62,36 @@ export function openOnHoverTooltip(tooltipState: TooltipState) { }; } -export function cleanTooltipStateForLayer(layerId: string, layerFeatures: Feature[] = []) { +export function updateTooltipStateForLayer(layerId: string, layerFeatures: Feature[] = []) { return (dispatch: Dispatch, getState: () => MapStoreState) => { - let featuresRemoved = false; const openTooltips = getOpenTooltips(getState()) .map((tooltipState) => { - const nextFeatures = tooltipState.features.filter((tooltipFeature) => { + const nextFeatures: TooltipFeature[] = []; + tooltipState.features.forEach((tooltipFeature) => { if (tooltipFeature.layerId !== layerId) { // feature from another layer, keep it - return true; + nextFeatures.push(tooltipFeature); } - // Keep feature if it is still in layer - return layerFeatures.some((layerFeature) => { - return layerFeature.properties![FEATURE_ID_PROPERTY_NAME] === tooltipFeature.id; + const updatedFeature = layerFeatures.find((layerFeature) => { + const isVisible = + layerFeature.properties![FEATURE_VISIBLE_PROPERTY_NAME] !== undefined + ? layerFeature.properties![FEATURE_VISIBLE_PROPERTY_NAME] + : true; + return ( + isVisible && layerFeature.properties![FEATURE_ID_PROPERTY_NAME] === tooltipFeature.id + ); }); - }); - if (tooltipState.features.length !== nextFeatures.length) { - featuresRemoved = true; - } + if (updatedFeature) { + nextFeatures.push({ + ...tooltipFeature, + mbProperties: { + ...updatedFeature.properties, + }, + }); + } + }); return { ...tooltipState, features: nextFeatures }; }) @@ -89,11 +99,9 @@ export function cleanTooltipStateForLayer(layerId: string, layerFeatures: Featur return tooltipState.features.length > 0; }); - if (featuresRemoved) { - dispatch({ - type: SET_OPEN_TOOLTIPS, - openTooltips, - }); - } + dispatch({ + type: SET_OPEN_TOOLTIPS, + openTooltips, + }); }; } diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_properties.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_properties.tsx index 4d9de61ffa819..570c06ff4ae7f 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_properties.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_properties.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import _ from 'lodash'; import React, { Component, CSSProperties, RefObject, ReactNode } from 'react'; import { EuiCallOut, @@ -57,6 +58,7 @@ export class FeatureProperties extends Component { private _isMounted = false; private _prevLayerId: string = ''; private _prevFeatureId?: string | number = ''; + private _prevMbProperties?: GeoJsonProperties; private readonly _tableRef: RefObject = React.createRef(); state: State = { @@ -118,13 +120,18 @@ export class FeatureProperties extends Component { nextFeatureId?: string | number; mbProperties: GeoJsonProperties; }) => { - if (this._prevLayerId === nextLayerId && this._prevFeatureId === nextFeatureId) { + if ( + this._prevLayerId === nextLayerId && + this._prevFeatureId === nextFeatureId && + _.isEqual(this._prevMbProperties, mbProperties) + ) { // do not reload same feature properties return; } this._prevLayerId = nextLayerId; this._prevFeatureId = nextFeatureId; + this._prevMbProperties = mbProperties; this.setState({ properties: null, loadPropertiesErrorMsg: null, diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/features_tooltip.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/features_tooltip.tsx index c0f792f626989..0d2ba07a5c956 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/features_tooltip.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/features_tooltip.tsx @@ -62,8 +62,20 @@ export class FeaturesTooltip extends Component { static getDerivedStateFromProps(nextProps: Props, prevState: State) { if (nextProps.features !== prevState.prevFeatures) { + let nextCurrentFeature = nextProps.features ? nextProps.features[0] : null; + if (prevState.currentFeature) { + const updatedCurrentFeature = nextProps.features.find((tooltipFeature) => { + return ( + tooltipFeature.id === prevState.currentFeature!.id && + tooltipFeature.layerId === prevState.currentFeature!.layerId + ); + }); + if (updatedCurrentFeature) { + nextCurrentFeature = updatedCurrentFeature; + } + } return { - currentFeature: nextProps.features ? nextProps.features[0] : null, + currentFeature: nextCurrentFeature, view: PROPERTIES_VIEW, prevFeatures: nextProps.features, }; diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_popover.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_popover.tsx index 0b7ba3468d30c..181952a142ede 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_popover.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/tooltip_popover.tsx @@ -44,15 +44,12 @@ interface Props { interface State { x?: number; y?: number; - isVisible: boolean; } export class TooltipPopover extends Component { private readonly _popoverRef: RefObject = React.createRef(); - state: State = { - isVisible: true, - }; + state: State = {}; componentDidMount() { this._updatePopoverPosition(); @@ -74,15 +71,19 @@ export class TooltipPopover extends Component { const lat = this.props.location[LAT_INDEX]; const lon = this.props.location[LON_INDEX]; const bounds = this.props.mbMap.getBounds(); - this.setState({ - x: nextPoint.x, - y: nextPoint.y, - isVisible: - lat < bounds.getNorth() && - lat > bounds.getSouth() && - lon > bounds.getWest() && - lon < bounds.getEast(), - }); + const isVisible = + lat < bounds.getNorth() && + lat > bounds.getSouth() && + lon > bounds.getWest() && + lon < bounds.getEast(); + if (!isVisible) { + this.props.closeTooltip(); + } else { + this.setState({ + x: nextPoint.x, + y: nextPoint.y, + }); + } }; _loadFeatureProperties = async ({ @@ -104,8 +105,15 @@ export class TooltipPopover extends Component { targetFeature = tooltipLayer.getFeatureById(featureId); } - const properties = targetFeature ? targetFeature.properties : mbProperties; - return await tooltipLayer.getPropertiesForTooltip(properties ? properties : {}); + let properties: GeoJsonProperties | undefined; + if (mbProperties) { + properties = mbProperties; + } else if (targetFeature?.properties) { + properties = targetFeature?.properties; + } else { + properties = {}; + } + return await tooltipLayer.getPropertiesForTooltip(properties); }; _getLayerName = async (layerId: string) => { @@ -143,7 +151,7 @@ export class TooltipPopover extends Component { }; render() { - if (!this.state.isVisible || this.state.x === undefined || this.state.y === undefined) { + if (this.state.x === undefined || this.state.y === undefined) { return null; } diff --git a/x-pack/plugins/maps/server/tutorials/ems/index.ts b/x-pack/plugins/maps/server/tutorials/ems/index.ts index ba8720a7bc8eb..47cb5476c4b90 100644 --- a/x-pack/plugins/maps/server/tutorials/ems/index.ts +++ b/x-pack/plugins/maps/server/tutorials/ems/index.ts @@ -65,7 +65,7 @@ export function emsBoundariesSpecProvider({ }), category: TutorialsCategory.OTHER, shortDescription: i18n.translate('xpack.maps.tutorials.ems.shortDescription', { - defaultMessage: 'Administrative boundaries from the Elastic Maps Service.', + defaultMessage: 'Add administrative boundaries to your data with Elastic Maps Service.', }), longDescription: i18n.translate('xpack.maps.tutorials.ems.longDescription', { defaultMessage: diff --git a/x-pack/plugins/ml/common/types/annotations.ts b/x-pack/plugins/ml/common/types/annotations.ts index 6234444322a5b..dbc146c1175d8 100644 --- a/x-pack/plugins/ml/common/types/annotations.ts +++ b/x-pack/plugins/ml/common/types/annotations.ts @@ -118,26 +118,8 @@ export function isAnnotations(arg: any): arg is Annotations { return arg.every((d: Annotation) => isAnnotation(d)); } -export interface FieldToBucket { - field: string; - missing?: string | number; -} - -export interface FieldToBucketResult { - key: string; - doc_count: number; -} - -export interface TermAggregationResult { - doc_count_error_upper_bound: number; - sum_other_doc_count: number; - buckets: FieldToBucketResult[]; -} - -export type EsAggregationResult = Record; - export interface GetAnnotationsResponse { - aggregations?: EsAggregationResult; + totalCount: number; annotations: Record; error?: string; success: boolean; @@ -145,6 +127,5 @@ export interface GetAnnotationsResponse { export interface AnnotationsTable { annotationsData: Annotations; - aggregations: EsAggregationResult; error?: string; } 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 26fddcc6394b0..98dc5f4204c32 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 @@ -81,7 +81,6 @@ class AnnotationsTableUI extends Component { super(props); this.state = { annotations: [], - aggregations: null, isLoading: false, queryText: `event:(${ANNOTATION_EVENT_USER} or ${ANNOTATION_EVENT_DELAYED_DATA})`, searchError: undefined, @@ -115,18 +114,11 @@ class AnnotationsTableUI extends Component { earliestMs: null, latestMs: null, maxAnnotations: ANNOTATIONS_TABLE_DEFAULT_QUERY_SIZE, - fields: [ - { - field: 'event', - missing: ANNOTATION_EVENT_USER, - }, - ], }) .toPromise() .then((resp) => { this.setState((prevState, props) => ({ annotations: resp.annotations[props.jobs[0].job_id] || [], - aggregations: resp.aggregations, errorMessage: undefined, isLoading: false, jobId: props.jobs[0].job_id, @@ -570,41 +562,35 @@ class AnnotationsTableUI extends Component { onMouseLeave: () => this.onMouseLeaveRow(), }; }; - let filterOptions = []; - const aggregations = this.props.aggregations ?? this.state.aggregations; - if (aggregations) { - const buckets = aggregations.event.buckets; - let foundUser = false; - let foundDelayedData = false; - - buckets.forEach((bucket) => { - if (bucket.key === ANNOTATION_EVENT_USER) { - foundUser = true; - } - if (bucket.key === ANNOTATION_EVENT_DELAYED_DATA) { - foundDelayedData = true; - } - }); - const adjustedBuckets = []; - if (!foundUser) { - adjustedBuckets.push({ key: ANNOTATION_EVENT_USER, doc_count: 0 }); - } - if (!foundDelayedData) { - adjustedBuckets.push({ key: ANNOTATION_EVENT_DELAYED_DATA, doc_count: 0 }); + + // Build the options to show in the Event type filter. + // Do not try and run a search using a terms agg on the event field + // because in 7.9 this field was incorrectly mapped as a text rather than keyword. + + // Always display options for user and delayed data types. + const countsByEvent = { + [ANNOTATION_EVENT_USER]: 0, + [ANNOTATION_EVENT_DELAYED_DATA]: 0, + }; + annotations.forEach((annotation) => { + // Default to user type for annotations created in early releases which didn't have an event field + const event = annotation.event ?? ANNOTATION_EVENT_USER; + if (countsByEvent[event] === undefined) { + countsByEvent[event] = 0; } + countsByEvent[event]++; + }); - filterOptions = [...adjustedBuckets, ...buckets]; - } const filters = [ { type: 'field_value_selection', field: 'event', name: 'Event', multiSelect: 'or', - options: filterOptions.map((field) => ({ - value: field.key, - name: field.key, - view: `${field.key} (${field.doc_count})`, + options: Object.entries(countsByEvent).map(([key, docCount]) => ({ + value: key, + name: key, + view: `${key} (${docCount})`, })), 'data-test-subj': 'mlAnnotationTableEventFilter', }, diff --git a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix_vega_lite_spec.ts b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix_vega_lite_spec.ts index 7291f7bbfa838..861b3727cea1b 100644 --- a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix_vega_lite_spec.ts +++ b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix_vega_lite_spec.ts @@ -107,6 +107,11 @@ export const getScatterplotMatrixVegaLiteSpec = ( labelColor: euiTheme.euiTextSubduedColor, titleColor: euiTheme.euiTextSubduedColor, }, + legend: { + orient: 'right', + labelColor: euiTheme.euiTextSubduedColor, + titleColor: euiTheme.euiTextSubduedColor, + }, }, repeat: { column: vegaColumns, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index 9dd4c5c42cca7..8b7109d87a866 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -7,6 +7,7 @@ import React, { FC, Fragment, useEffect, useState } from 'react'; import { EuiCallOut, EuiFormRow, EuiPanel, EuiSpacer, EuiText } from '@elastic/eui'; +import { isEqual } from 'lodash'; // @ts-ignore no declaration import { LEFT_ALIGNMENT, CENTER_ALIGNMENT, SortableProperties } from '@elastic/eui/lib/services'; import { i18n } from '@kbn/i18n'; @@ -90,167 +91,182 @@ export const AnalysisFieldsTable: FC<{ tableItems: FieldSelectionItem[]; unsupportedFieldsError?: string; setUnsupportedFieldsError: React.Dispatch>; -}> = ({ - dependentVariable, - includes, - setFormState, - minimumFieldsRequiredMessage, - setMinimumFieldsRequiredMessage, - tableItems, - unsupportedFieldsError, - setUnsupportedFieldsError, -}) => { - const [sortableProperties, setSortableProperties] = useState(); - const [currentPaginationData, setCurrentPaginationData] = useState<{ - pageIndex: number; - itemsPerPage: number; - }>({ pageIndex: 0, itemsPerPage: 5 }); +}> = React.memo( + ({ + dependentVariable, + includes, + setFormState, + minimumFieldsRequiredMessage, + setMinimumFieldsRequiredMessage, + tableItems, + unsupportedFieldsError, + setUnsupportedFieldsError, + }) => { + const [sortableProperties, setSortableProperties] = useState(); + const [currentPaginationData, setCurrentPaginationData] = useState<{ + pageIndex: number; + itemsPerPage: number; + }>({ pageIndex: 0, itemsPerPage: 5 }); - useEffect(() => { - if (includes.length === 0 && tableItems.length > 0) { - const includedFields: string[] = []; - tableItems.forEach((field) => { - if (field.is_included === true) { - includedFields.push(field.name); - } - }); - setFormState({ includes: includedFields }); - } else if (includes.length > 0) { - setFormState({ includes }); - } - setMinimumFieldsRequiredMessage(undefined); - }, [tableItems]); - - useEffect(() => { - let sortablePropertyItems = []; - const defaultSortProperty = 'name'; - - sortablePropertyItems = [ - { - name: 'name', - getValue: (item: any) => item.name.toLowerCase(), - isAscending: true, - }, - { - name: 'is_included', - getValue: (item: any) => item.is_included, - isAscending: true, - }, - { - name: 'is_required', - getValue: (item: any) => item.is_required, - isAscending: true, - }, - ]; - const sortableProps = new SortableProperties(sortablePropertyItems, defaultSortProperty); + useEffect(() => { + if (includes.length === 0 && tableItems.length > 0) { + const includedFields: string[] = []; + tableItems.forEach((field) => { + if (field.is_included === true) { + includedFields.push(field.name); + } + }); + setFormState({ includes: includedFields }); + } else if (includes.length > 0) { + setFormState({ + includes: + dependentVariable && includes.includes(dependentVariable) + ? includes + : [...includes, dependentVariable], + }); + } + setMinimumFieldsRequiredMessage(undefined); + }, [tableItems]); - setSortableProperties(sortableProps); - }, []); + useEffect(() => { + let sortablePropertyItems = []; + const defaultSortProperty = 'name'; - const filters = [ - { - type: 'field_value_toggle_group', - field: 'is_included', - items: [ + sortablePropertyItems = [ { - value: true, - name: i18n.translate('xpack.ml.dataframe.analytics.create.isIncludedOption', { - defaultMessage: 'Is included', - }), + name: 'name', + getValue: (item: any) => item.name.toLowerCase(), + isAscending: true, }, { - value: false, - name: i18n.translate('xpack.ml.dataframe.analytics.create.isNotIncludedOption', { - defaultMessage: 'Is not included', - }), + name: 'is_included', + getValue: (item: any) => item.is_included, + isAscending: true, }, - ], - }, - ]; + { + name: 'is_required', + getValue: (item: any) => item.is_required, + isAscending: true, + }, + ]; + const sortableProps = new SortableProperties(sortablePropertyItems, defaultSortProperty); - return ( - - - - - {tableItems.length > 0 && minimumFieldsRequiredMessage === undefined && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.includedFieldsCount', { - defaultMessage: - '{numFields, plural, one {# field} other {# fields}} included in the analysis', - values: { numFields: includes.length }, - })} - - )} - {tableItems.length === 0 && ( - + - - - )} - {tableItems.length > 0 && ( - - { - // dependent variable must always be in includes - if ( - dependentVariable !== undefined && - dependentVariable !== '' && - selection.length === 0 - ) { - selection = [dependentVariable]; - } - // If includes is empty show minimum fields required message and don't update form yet - if (selection.length === 0) { - setMinimumFieldsRequiredMessage(minimumFieldsMessage); - setUnsupportedFieldsError(undefined); - } else { - setMinimumFieldsRequiredMessage(undefined); - setFormState({ includes: selection }); - } - }} - selectedIds={includes} - setCurrentPaginationData={setCurrentPaginationData} - singleSelection={false} - sortableProperties={sortableProperties} - tableItemId={'name'} - /> - - )} - - - ); -}; + + + {tableItems.length > 0 && minimumFieldsRequiredMessage === undefined && ( + + {i18n.translate('xpack.ml.dataframe.analytics.create.includedFieldsCount', { + defaultMessage: + '{numFields, plural, one {# field} other {# fields}} included in the analysis', + values: { numFields: includes.length }, + })} + + )} + {tableItems.length === 0 && ( + + + + )} + {tableItems.length > 0 && ( + + { + // dependent variable must always be in includes + if ( + dependentVariable !== undefined && + dependentVariable !== '' && + selection.length === 0 + ) { + selection = [dependentVariable]; + } + // If includes is empty show minimum fields required message and don't update form yet + if (selection.length === 0) { + setMinimumFieldsRequiredMessage(minimumFieldsMessage); + setUnsupportedFieldsError(undefined); + } else { + setMinimumFieldsRequiredMessage(undefined); + setFormState({ includes: selection }); + } + }} + selectedIds={includes} + setCurrentPaginationData={setCurrentPaginationData} + singleSelection={false} + sortableProperties={sortableProperties} + tableItemId={'name'} + /> + + )} + + + ); + }, + (prevProps, nextProps) => { + return ( + prevProps.dependentVariable === nextProps.dependentVariable && + isEqual(prevProps.includes, nextProps.includes) && + isEqual(prevProps.tableItems, nextProps.tableItems) && + prevProps.unsupportedFieldsError === nextProps.unsupportedFieldsError + ); + } +); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 47f7c2621802e..7e46a700b807e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -88,7 +88,6 @@ function getRuntimeDepVarOptions(jobType: AnalyticsJobType, runtimeMappings: Run if (isRuntimeField(field) && shouldAddAsDepVarOption(id, field.type, jobType)) { runtimeOptions.push({ label: id, - key: `runtime_mapping_${id}`, }); } }); @@ -127,6 +126,7 @@ export const ConfigurationStepForm: FC = ({ dependentVariable, includes, jobConfigQuery, + jobConfigQueryLanguage, jobConfigQueryString, jobType, modelMemoryLimit, @@ -150,14 +150,18 @@ export const ConfigurationStepForm: FC = ({ const [query, setQuery] = useState({ query: jobConfigQueryString ?? '', - language: SEARCH_QUERY_LANGUAGE.KUERY, + language: jobConfigQueryLanguage ?? SEARCH_QUERY_LANGUAGE.KUERY, }); const toastNotifications = getToastNotifications(); const setJobConfigQuery: ExplorationQueryBarProps['setSearchQuery'] = (update) => { if (update.query) { - setFormState({ jobConfigQuery: update.query, jobConfigQueryString: update.queryString }); + setFormState({ + jobConfigQuery: update.query, + jobConfigQueryLanguage: update.language, + jobConfigQueryString: update.queryString, + }); } setQuery({ query: update.queryString, language: update.language }); }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx index fb103886635a9..00a63bcf2a414 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx @@ -26,6 +26,7 @@ import { useMlKibana } from '../../../../../contexts/kibana'; // Separate imports for lazy loadable VegaChart and related code import { VegaChart } from '../../../../../components/vega_chart'; import { VegaChartLoading } from '../../../../../components/vega_chart/vega_chart_loading'; +import { useCurrentEuiTheme } from '../../../../../components/color_range_legend'; import { ErrorCallout } from '../error_callout'; import { getDependentVar, DataFrameAnalyticsConfig } from '../../../../common'; @@ -33,6 +34,7 @@ import { DataFrameTaskStateType } from '../../../analytics_management/components import { ResultsSearchQuery } from '../../../../common/analytics'; import { ExpandableSection, HEADER_ITEMS_LOADING } from '../expandable_section'; + import { EvaluateStat } from './evaluate_stat'; import { EvaluationQualityMetricsTable } from './evaluation_quality_metrics_table'; @@ -107,6 +109,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, se const { services: { docLinks }, } = useMlKibana(); + const { euiTheme } = useCurrentEuiTheme(); const [columns, setColumns] = useState([]); const [columnsData, setColumnsData] = useState([]); @@ -469,7 +472,8 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, se vegaSpec={getRocCurveChartVegaLiteSpec( classificationClasses, rocCurveData, - getDependentVar(jobConfig.analysis) + getDependentVar(jobConfig.analysis), + euiTheme )} />
diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/get_roc_curve_chart_vega_lite_spec.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/get_roc_curve_chart_vega_lite_spec.tsx index e9a6925476b02..ef5bcb83e871f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/get_roc_curve_chart_vega_lite_spec.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/get_roc_curve_chart_vega_lite_spec.tsx @@ -10,6 +10,7 @@ import type { TopLevelSpec } from 'vega-lite/build/vega-lite'; import { euiPaletteColorBlind, euiPaletteGray } from '@elastic/eui'; +import euiThemeLight from '@elastic/eui/dist/eui_theme_light.json'; import { i18n } from '@kbn/i18n'; @@ -43,7 +44,8 @@ export interface RocCurveDataRow extends RocCurveItem { export const getRocCurveChartVegaLiteSpec = ( classificationClasses: string[], data: RocCurveDataRow[], - legendTitle: string + legendTitle: string, + euiTheme: typeof euiThemeLight ): TopLevelSpec => { // we append two rows which make up the data for the diagonal baseline data.push({ tpr: 0, fpr: 0, threshold: 1, class_name: BASELINE }); @@ -59,6 +61,8 @@ export const getRocCurveChartVegaLiteSpec = ( config: { legend: { orient: 'right', + labelColor: euiTheme.euiTextSubduedColor, + titleColor: euiTheme.euiTextSubduedColor, }, view: { continuousHeight: SIZE, @@ -101,9 +105,9 @@ export const getRocCurveChartVegaLiteSpec = ( type: 'quantitative', axis: { tickColor: GRAY, - labelColor: GRAY, + labelColor: euiTheme.euiTextSubduedColor, domainColor: GRAY, - titleColor: GRAY, + titleColor: euiTheme.euiTextSubduedColor, }, }, y: { @@ -114,9 +118,9 @@ export const getRocCurveChartVegaLiteSpec = ( type: 'quantitative', axis: { tickColor: GRAY, - labelColor: GRAY, + labelColor: euiTheme.euiTextSubduedColor, domainColor: GRAY, - titleColor: GRAY, + titleColor: euiTheme.euiTextSubduedColor, }, }, tooltip: [ diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts index 71da56c9e14e5..5c70b1c2a0487 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts @@ -144,7 +144,7 @@ export const validateNumTopFeatureImportanceValues = ( }; export const validateAdvancedEditor = (state: State): State => { - const { jobIdEmpty, jobIdValid, jobIdExists, jobType, createIndexPattern, includes } = state.form; + const { jobIdEmpty, jobIdValid, jobIdExists, jobType, createIndexPattern } = state.form; const { jobConfig } = state; state.advancedEditorMessages = []; @@ -160,6 +160,8 @@ export const validateAdvancedEditor = (state: State): State => { const destinationIndexPatternTitleExists = state.indexPatternsMap[destinationIndexName] !== undefined; + const analyzedFields = jobConfig?.analyzed_fields?.includes || []; + const resultsFieldEmptyString = typeof jobConfig?.dest?.results_field === 'string' && jobConfig?.dest?.results_field.trim() === ''; @@ -189,12 +191,10 @@ export const validateAdvancedEditor = (state: State): State => { ) { const dependentVariableName = getDependentVar(jobConfig.analysis) || ''; dependentVariableEmpty = dependentVariableName === ''; - if ( !dependentVariableEmpty && - includes !== undefined && - includes.length > 0 && - !includes.includes(dependentVariableName) + analyzedFields.length > 0 && + !analyzedFields.includes(dependentVariableName) ) { includesValid = false; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 3c9e394190733..0788e673f1df3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -79,6 +79,7 @@ export interface State { jobType: AnalyticsJobType; jobConfigQuery: any; jobConfigQueryString: string | undefined; + jobConfigQueryLanguage: string | undefined; lambda: number | undefined; lossFunction: string | undefined; lossFunctionParameter: number | undefined; @@ -162,6 +163,7 @@ export const getInitialState = (): State => ({ jobType: undefined, jobConfigQuery: defaultSearchQuery, jobConfigQueryString: undefined, + jobConfigQueryLanguage: undefined, lambda: undefined, lossFunction: undefined, lossFunctionParameter: undefined, diff --git a/x-pack/plugins/ml/public/application/explorer/explorer.js b/x-pack/plugins/ml/public/application/explorer/explorer.js index daecf7585b3ea..7d08c0fc1756e 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer.js @@ -255,13 +255,9 @@ export class ExplorerUI extends React.Component { tableData, swimLaneSeverity, } = this.props.explorerState; - const { annotationsData, aggregations, error: annotationsError } = annotations; + const { annotationsData, totalCount: allAnnotationsCnt, error: annotationsError } = annotations; const annotationsCnt = Array.isArray(annotationsData) ? annotationsData.length : 0; - const allAnnotationsCnt = Array.isArray(aggregations?.event?.buckets) - ? aggregations.event.buckets.reduce((acc, v) => acc + v.doc_count, 0) - : annotationsCnt; - const badge = allAnnotationsCnt > annotationsCnt ? ( @@ -449,7 +445,6 @@ export class ExplorerUI extends React.Component { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js index ecf347e6b142f..af2b9b07a43fb 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js @@ -35,7 +35,6 @@ import { SWIMLANE_TYPE, VIEW_BY_JOB_LABEL, } from './explorer_constants'; -import { ANNOTATION_EVENT_USER } from '../../../common/constants/annotations'; // create new job objects based on standard job config objects // new job objects just contain job id, bucket span in seconds and a selected flag. @@ -437,10 +436,7 @@ export function loadOverallAnnotations(selectedJobs, interval, bounds) { } export function loadAnnotationsTableData(selectedCells, selectedJobs, interval, bounds) { - const jobIds = - selectedCells !== undefined && selectedCells.viewByFieldName === VIEW_BY_JOB_LABEL - ? selectedCells.lanes - : selectedJobs.map((d) => d.id); + const jobIds = getSelectionJobIds(selectedCells, selectedJobs); const timeRange = getSelectionTimeRange(selectedCells, interval, bounds); return new Promise((resolve) => { @@ -450,12 +446,6 @@ export function loadAnnotationsTableData(selectedCells, selectedJobs, interval, earliestMs: timeRange.earliestMs, latestMs: timeRange.latestMs, maxAnnotations: ANNOTATIONS_TABLE_DEFAULT_QUERY_SIZE, - fields: [ - { - field: 'event', - missing: ANNOTATION_EVENT_USER, - }, - ], }) .toPromise() .then((resp) => { @@ -463,7 +453,7 @@ export function loadAnnotationsTableData(selectedCells, selectedJobs, interval, const errorMessage = extractErrorMessage(resp.error); return resolve({ annotationsData: [], - aggregations: {}, + totalCount: 0, error: errorMessage !== '' ? errorMessage : undefined, }); } @@ -485,14 +475,14 @@ export function loadAnnotationsTableData(selectedCells, selectedJobs, interval, d.key = (i + 1).toString(); return d; }), - aggregations: resp.aggregations, + totalCount: resp.totalCount, }); }) .catch((resp) => { const errorMessage = extractErrorMessage(resp); return resolve({ annotationsData: [], - aggregations: {}, + totalCount: 0, error: errorMessage !== '' ? errorMessage : undefined, }); }); diff --git a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts index 202a4389ef524..cfc9f076fbb3a 100644 --- a/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts +++ b/x-pack/plugins/ml/public/application/explorer/reducers/explorer_reducer/state.ts @@ -71,12 +71,10 @@ export function getExplorerDefaultState(): ExplorerState { overallAnnotations: { error: undefined, annotationsData: [], - aggregations: {}, }, annotations: { error: undefined, annotationsData: [], - aggregations: {}, }, anomalyChartsDataLoading: true, chartsData: getDefaultChartsData(), diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js index d9223e433fb65..3fe7eb2bfb732 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/edit_job_flyout/tabs/detectors.js @@ -7,8 +7,9 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFieldText, EuiForm, EuiFormRow, EuiSpacer } from '@elastic/eui'; +import { EuiFieldText, EuiForm, EuiFormRow, EuiSpacer, EuiTitle } from '@elastic/eui'; import { mlJobService } from '../../../../../services/job_service'; import { detectorToString } from '../../../../../util/string_utils'; @@ -43,7 +44,16 @@ export class Detectors extends Component { render() { const { detectors, detectorDescriptions } = this.state; return ( - + <> + + +

+ +

+
{detectorDescriptions.map((d, i) => ( @@ -52,7 +62,7 @@ export class Detectors extends Component { ))} -
+ ); } } diff --git a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index_based.tsx b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index_based.tsx index b9e866d2e00d0..04543a28ab3e6 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index_based.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index_based.tsx @@ -19,10 +19,7 @@ import { IndexDataVisualizerPage as Page } from '../../../datavisualizer/index_b import { checkBasicLicense } from '../../../license'; import { checkGetJobsCapabilitiesResolver } from '../../../capabilities/check_capabilities'; import { loadIndexPatterns } from '../../../util/index_utils'; -import { checkMlNodesAvailable } from '../../../ml_nodes_check'; import { getBreadcrumbWithUrlForApp } from '../../breadcrumbs'; -import { ML_PAGES } from '../../../../../common/constants/locator'; -import { useCreateAndNavigateToMlLink } from '../../../contexts/kibana/use_create_url'; export const indexBasedRouteFactory = ( navigateToPath: NavigateToPath, @@ -44,16 +41,12 @@ export const indexBasedRouteFactory = ( const PageWrapper: FC = ({ location, deps }) => { const { redirectToMlAccessDeniedPage } = deps; - const redirectToJobsManagementPage = useCreateAndNavigateToMlLink( - ML_PAGES.ANOMALY_DETECTION_JOBS_MANAGE - ); const { index, savedSearchId }: Record = parse(location.search, { sort: false }); const { context } = useResolver(index, savedSearchId, deps.config, { checkBasicLicense, loadIndexPatterns: () => loadIndexPatterns(deps.indexPatterns), checkGetJobsCapabilities: () => checkGetJobsCapabilitiesResolver(redirectToMlAccessDeniedPage), - checkMlNodesAvailable: () => checkMlNodesAvailable(redirectToJobsManagementPage), }); return ( diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx index 8500d85d5580a..53057cb16c132 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx @@ -19,9 +19,6 @@ import { getBreadcrumbWithUrlForApp } from '../../breadcrumbs'; import { checkBasicLicense } from '../../../license'; import { loadIndexPatterns } from '../../../util/index_utils'; import { checkGetJobsCapabilitiesResolver } from '../../../capabilities/check_capabilities'; -import { checkMlNodesAvailable } from '../../../ml_nodes_check'; -import { ML_PAGES } from '../../../../../common/constants/locator'; -import { useCreateAndNavigateToMlLink } from '../../../contexts/kibana/use_create_url'; enum MODE { NEW_JOB, @@ -85,9 +82,6 @@ const PageWrapper: FC = ({ nextStepPath, deps, mode }) = } = useMlKibana(); const { redirectToMlAccessDeniedPage } = deps; - const redirectToJobsManagementPage = useCreateAndNavigateToMlLink( - ML_PAGES.ANOMALY_DETECTION_JOBS_MANAGE - ); const newJobResolvers = { ...basicResolvers(deps), @@ -98,7 +92,6 @@ const PageWrapper: FC = ({ nextStepPath, deps, mode }) = checkBasicLicense, loadIndexPatterns: () => loadIndexPatterns(deps.indexPatterns), checkGetJobsCapabilities: () => checkGetJobsCapabilitiesResolver(redirectToMlAccessDeniedPage), - checkMlNodesAvailable: () => checkMlNodesAvailable(redirectToJobsManagementPage), }; const { context } = useResolver( diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/annotations.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/annotations.ts index f3f9e935a92c7..006b70934c71e 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/annotations.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/annotations.ts @@ -5,11 +5,7 @@ * 2.0. */ -import { - Annotation, - FieldToBucket, - GetAnnotationsResponse, -} from '../../../../common/types/annotations'; +import { Annotation, GetAnnotationsResponse } from '../../../../common/types/annotations'; import { http, http$ } from '../http_service'; import { basePath } from './index'; @@ -19,7 +15,6 @@ export const annotations = { earliestMs: number; latestMs: number; maxAnnotations: number; - fields?: FieldToBucket[]; detectorIndex?: number; entities?: any[]; }) { @@ -36,7 +31,6 @@ export const annotations = { earliestMs: number | null; latestMs: number | null; maxAnnotations: number; - fields?: FieldToBucket[]; detectorIndex?: number; entities?: any[]; }) { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js index 1854982c8db0b..7f9fcc7bc5517 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasts_list.js @@ -78,6 +78,12 @@ function getColumns(viewForecast) { // TODO - add in ml-info-icon to the h3 element, // then remove tooltip and inline style. export function ForecastsList({ forecasts, viewForecast }) { + const getRowProps = (item) => { + return { + 'data-test-subj': `mlForecastsListRow row-${item.rowId}`, + }; + }; + return (

); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 87131583e44eb..cad5bb68fb62b 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -547,9 +547,18 @@ class TimeseriesChartIntl extends Component { // Create the path elements for the forecast value line and bounds area. if (contextForecastData) { - fcsGroup.append('path').attr('class', 'area forecast'); - fcsGroup.append('path').attr('class', 'values-line forecast'); - fcsGroup.append('g').attr('class', 'focus-chart-markers forecast'); + fcsGroup + .append('path') + .attr('class', 'area forecast') + .attr('data-test-subj', 'mlForecastArea'); + fcsGroup + .append('path') + .attr('class', 'values-line forecast') + .attr('data-test-subj', 'mlForecastValuesline'); + fcsGroup + .append('g') + .attr('class', 'focus-chart-markers forecast') + .attr('data-test-subj', 'mlForecastMarkers'); } fcsGroup diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx index 85530de2ea718..174ab8a682b5b 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx @@ -15,7 +15,6 @@ import { extractErrorMessage } from '../../../../../common/util/errors'; import { Annotation } from '../../../../../common/types/annotations'; import { useMlKibana, useNotifications } from '../../../contexts/kibana'; import { getBoundsRoundedToInterval } from '../../../util/time_buckets'; -import { ANNOTATION_EVENT_USER } from '../../../../../common/constants/annotations'; import { getControlsForDetector } from '../../get_controls_for_detector'; import { MlAnnotationUpdatesContext } from '../../../contexts/ml/ml_annotation_updates_context'; @@ -88,12 +87,6 @@ export const TimeSeriesChartWithTooltips: FC = earliestMs: searchBounds.min.valueOf(), latestMs: searchBounds.max.valueOf(), maxAnnotations: ANNOTATIONS_TABLE_DEFAULT_QUERY_SIZE, - fields: [ - { - field: 'event', - missing: ANNOTATION_EVENT_USER, - }, - ], detectorIndex, entities: nonBlankEntities, }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js index 454bb0b489837..e4d7fc457de0b 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer.js @@ -104,7 +104,6 @@ function getTimeseriesexplorerDefaultState() { entitiesLoading: false, entityValues: {}, focusAnnotationData: [], - focusAggregations: {}, focusAggregationInterval: {}, focusChartData: undefined, focusForecastData: undefined, @@ -935,7 +934,6 @@ export class TimeSeriesExplorer extends React.Component { focusAggregationInterval, focusAnnotationError, focusAnnotationData, - focusAggregations, focusChartData, focusForecastData, fullRefresh, @@ -1172,9 +1170,13 @@ export class TimeSeriesExplorer extends React.Component { + {i18n.translate('xpack.ml.timeSeriesExplorer.showForecastLabel', { + defaultMessage: 'show forecast', + })} + + } checked={showForecast} onChange={this.toggleShowForecastHandler} /> @@ -1257,7 +1259,6 @@ export class TimeSeriesExplorer extends React.Component { detectors={detectors} jobIds={[this.props.selectedJobId]} annotations={focusAnnotationData} - aggregations={focusAggregations} isSingleMetricViewerLinkVisible={false} isNumberBadgeVisible={true} /> diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/get_focus_data.ts b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/get_focus_data.ts index cb1974afd5ed8..d4548a43f3f2b 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/get_focus_data.ts +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/get_focus_data.ts @@ -26,7 +26,6 @@ import { import { mlForecastService } from '../../services/forecast_service'; import { mlFunctionToESAggregation } from '../../../../common/util/job_utils'; import { GetAnnotationsResponse } from '../../../../common/types/annotations'; -import { ANNOTATION_EVENT_USER } from '../../../../common/constants/annotations'; import { aggregationTypeTransform } from '../../../../common/util/anomaly_utils'; export interface Interval { @@ -42,7 +41,6 @@ export interface FocusData { focusAnnotationError?: string; focusAnnotationData?: any[]; focusForecastData?: any; - focusAggregations?: any; } export function getFocusData( @@ -98,12 +96,6 @@ export function getFocusData( earliestMs: searchBounds.min.valueOf(), latestMs: searchBounds.max.valueOf(), maxAnnotations: ANNOTATIONS_TABLE_DEFAULT_QUERY_SIZE, - fields: [ - { - field: 'event', - missing: ANNOTATION_EVENT_USER, - }, - ], detectorIndex, entities: nonBlankEntities, }) @@ -111,7 +103,7 @@ export function getFocusData( catchError((resp) => of({ annotations: {}, - aggregations: {}, + totalCount: 0, error: extractErrorMessage(resp), success: false, } as GetAnnotationsResponse) @@ -168,7 +160,6 @@ export function getFocusData( if (annotations.error !== undefined) { refreshFocusData.focusAnnotationError = annotations.error; refreshFocusData.focusAnnotationData = []; - refreshFocusData.focusAggregations = {}; } else { refreshFocusData.focusAnnotationData = (annotations.annotations[selectedJob.job_id] ?? []) .sort((a, b) => { @@ -178,8 +169,6 @@ export function getFocusData( d.key = (i + 1).toString(); return d; }); - - refreshFocusData.focusAggregations = annotations.aggregations; } } diff --git a/x-pack/plugins/ml/readme.md b/x-pack/plugins/ml/readme.md index 8425054d3f648..79ba88e67be8b 100644 --- a/x-pack/plugins/ml/readme.md +++ b/x-pack/plugins/ml/readme.md @@ -146,11 +146,11 @@ and Kibana instance that the tests will be run against. You can find the ML shared functions in the following files in GitHub: ``` -https://github.com/elastic/kibana/blob/master/x-pack/plugins/ml/public/shared.ts +https://github.com/elastic/kibana/blob/main/x-pack/plugins/ml/public/shared.ts ``` ``` -https://github.com/elastic/kibana/blob/master/x-pack/plugins/ml/server/shared.ts +https://github.com/elastic/kibana/blob/main/x-pack/plugins/ml/server/shared.ts ``` These functions are shared from the root of the ML plugin, you can import them with an import statement. For example: diff --git a/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_request.json b/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_request.json index b91eb94c7fd7b..c65185a6172eb 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_request.json +++ b/x-pack/plugins/ml/server/models/annotation_service/__mocks__/get_annotations_request.json @@ -1,6 +1,7 @@ { "index": ".ml-annotations-read", "size": 500, + "track_total_hits": true, "body": { "query": { "bool": { diff --git a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts index 5807d181cc566..227bcee256fb4 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts +++ b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts @@ -24,7 +24,6 @@ import { isAnnotations, getAnnotationFieldName, getAnnotationFieldValue, - EsAggregationResult, } from '../../../common/types/annotations'; import { JobId } from '../../../common/types/anomaly_detection_jobs'; @@ -35,36 +34,27 @@ interface EsResult { _id: string; } -export interface FieldToBucket { - field: string; - missing?: string | number; -} - export interface IndexAnnotationArgs { jobIds: string[]; earliestMs: number | null; latestMs: number | null; maxAnnotations: number; - fields?: FieldToBucket[]; detectorIndex?: number; entities?: any[]; event?: Annotation['event']; } -export interface AggTerm { - terms: FieldToBucket; -} - export interface GetParams { index: string; size: number; body: object; + track_total_hits: boolean; } export interface GetResponse { success: true; annotations: Record; - aggregations: EsAggregationResult; + totalCount: number; } export interface IndexParams { @@ -118,7 +108,6 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { earliestMs, latestMs, maxAnnotations, - fields, detectorIndex, entities, event, @@ -126,7 +115,7 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { const obj: GetResponse = { success: true, annotations: {}, - aggregations: {}, + totalCount: 0, }; const boolCriteria: object[] = []; @@ -215,18 +204,6 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { }); } - // Find unique buckets (e.g. events) from the queried annotations to show in dropdowns - const aggs: Record = {}; - if (fields) { - fields.forEach((fieldToBucket) => { - aggs[fieldToBucket.field] = { - terms: { - ...fieldToBucket, - }, - }; - }); - } - // Build should clause to further query for annotations in SMV // we want to show either the exact match with detector index and by/over/partition fields // OR annotations without any partition fields defined @@ -276,6 +253,7 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { const params: GetParams = { index: ML_ANNOTATIONS_INDEX_ALIAS_READ, size: maxAnnotations, + track_total_hits: true, body: { query: { bool: { @@ -295,7 +273,6 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { ...(shouldClauses ? { should: shouldClauses, minimum_should_match: 1 } : {}), }, }, - ...(fields ? { aggs } : {}), }, }; @@ -308,6 +285,9 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { throw new Error(`Annotations couldn't be retrieved from Elasticsearch.`); } + // @ts-expect-error incorrect search response type + obj.totalCount = body.hits.total.value; + // @ts-expect-error TODO fix search response types const docs: Annotations = get(body, ['hits', 'hits'], []).map((d: EsResult) => { // get the original source document and the document id, we need it @@ -321,10 +301,6 @@ export function annotationProvider({ asInternalUser }: IScopedClusterClient) { } as Annotation; }); - const aggregations = get(body, ['aggregations'], {}) as EsAggregationResult; - if (fields) { - obj.aggregations = aggregations; - } if (isAnnotations(docs) === false) { // No need to translate, this will not be exposed in the UI. throw new Error(`Annotations didn't pass integrity check.`); diff --git a/x-pack/plugins/monitoring/public/alerts/status.tsx b/x-pack/plugins/monitoring/public/alerts/status.tsx index a29d85d43c578..28c2ebcce2513 100644 --- a/x-pack/plugins/monitoring/public/alerts/status.tsx +++ b/x-pack/plugins/monitoring/public/alerts/status.tsx @@ -64,10 +64,12 @@ export const AlertsStatus: React.FC = (props: Props) => { {showOnlyCount ? ( count ) : ( - + + + )} diff --git a/x-pack/plugins/monitoring/public/application/pages/elasticsearch/ccr_shard_page.tsx b/x-pack/plugins/monitoring/public/application/pages/elasticsearch/ccr_shard_page.tsx index ab06179efbb04..8d7b9add409da 100644 --- a/x-pack/plugins/monitoring/public/application/pages/elasticsearch/ccr_shard_page.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/elasticsearch/ccr_shard_page.tsx @@ -13,7 +13,7 @@ import { PageTemplate } from '../page_template'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; import { GlobalStateContext } from '../../contexts/global_state_context'; // @ts-ignore -import { CcrShardReact } from '../../../components/elasticsearch/ccr_shard'; +import { CcrShard } from '../../../components/elasticsearch/ccr_shard'; import { ComponentProps } from '../../route_init'; import { SetupModeRenderer, SetupModeProps } from '../../../components/renderers/setup_mode'; import { SetupModeContext } from '../../../components/setup_mode/setup_mode_context'; @@ -113,7 +113,7 @@ export const ElasticsearchCcrShardPage: React.FC = ({ clusters } render={({ flyoutComponent, bottomBarComponent }: SetupModeProps) => ( {flyoutComponent} - + {bottomBarComponent} )} diff --git a/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_advanced_page.tsx b/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_advanced_page.tsx index 7cbeed4d57c36..db9e4461ba22e 100644 --- a/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_advanced_page.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_advanced_page.tsx @@ -87,7 +87,13 @@ export const ElasticsearchIndexAdvancedPage: React.FC = ({ clust }, [clusterUuid, services.data?.query.timefilter.timefilter, services.http, index]); return ( - + ( diff --git a/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_page.tsx b/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_page.tsx index edc10cda5509c..b0e91ac20fb30 100644 --- a/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_page.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/elasticsearch/index_page.tsx @@ -11,7 +11,7 @@ import { find } from 'lodash'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; import { GlobalStateContext } from '../../contexts/global_state_context'; // @ts-ignore -import { IndexReact } from '../../../components/elasticsearch/index/index_react'; +import { Index } from '../../../components/elasticsearch/index/index'; import { ComponentProps } from '../../route_init'; import { SetupModeRenderer, SetupModeProps } from '../../../components/renderers/setup_mode'; import { SetupModeContext } from '../../../components/setup_mode/setup_mode_context'; @@ -118,7 +118,7 @@ export const ElasticsearchIndexPage: React.FC = ({ clusters }) = render={({ setupMode, flyoutComponent, bottomBarComponent }: SetupModeProps) => ( {flyoutComponent} - = ({ clusters }) => render={({ setupMode, flyoutComponent, bottomBarComponent }: SetupModeProps) => ( {flyoutComponent} - = ({ clusters } const shardActivityData = shardActivity && filterShardActivityData(shardActivity); // no filter on data = null return ( - = ({ clusters }) => { const globalState = useContext(GlobalStateContext); @@ -42,7 +43,9 @@ export const LogStashNodeAdvancedPage: React.FC = ({ clusters }) const ccs = globalState.ccs; const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; + + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); const [data, setData] = useState({} as any); const [alerts, setAlerts] = useState({}); @@ -108,6 +111,16 @@ export const LogStashNodeAdvancedPage: React.FC = ({ clusters }) ]; }, [data.metrics]); + useEffect(() => { + if (cluster && data.nodeSummary) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + instance: data.nodeSummary.host, + name: 'nodes', + }); + } + }, [cluster, data, generateBreadcrumbs]); + return ( = ({ defaultMessage: 'Pipelines', }), route: `/logstash/node/${instance.nodeSummary?.uuid}/pipelines`, + testSubj: 'logstashNodeDetailPipelinesLink', }); tabs.push({ id: 'advanced', @@ -70,6 +71,7 @@ export const LogstashTemplate: React.FC = ({ defaultMessage: 'Advanced', }), route: `/logstash/node/${instance.nodeSummary?.uuid}/advanced`, + testSubj: 'logstashNodeDetailAdvancedLink', }); } } diff --git a/x-pack/plugins/monitoring/public/application/pages/logstash/node.tsx b/x-pack/plugins/monitoring/public/application/pages/logstash/node.tsx index 1163a619dd84b..aa722e5c3e245 100644 --- a/x-pack/plugins/monitoring/public/application/pages/logstash/node.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/logstash/node.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useContext, useState, useCallback, useMemo } from 'react'; +import React, { useContext, useState, useCallback, useMemo, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { find } from 'lodash'; import { useRouteMatch } from 'react-router-dom'; @@ -33,16 +33,18 @@ import { useCharts } from '../../hooks/use_charts'; import { AlertsByName } from '../../../alerts/types'; import { fetchAlerts } from '../../../lib/fetch_alerts'; import { RULE_LOGSTASH_VERSION_MISMATCH } from '../../../../common/constants'; +import { BreadcrumbContainer } from '../../hooks/use_breadcrumbs'; export const LogStashNodePage: React.FC = ({ clusters }) => { const match = useRouteMatch<{ uuid: string | undefined }>(); const globalState = useContext(GlobalStateContext); const { services } = useKibana<{ data: any }>(); + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); const clusterUuid = globalState.cluster_uuid; const ccs = globalState.ccs; const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; const [data, setData] = useState({} as any); const [alerts, setAlerts] = useState({}); const { zoomInfo, onBrush } = useCharts(); @@ -60,6 +62,16 @@ export const LogStashNodePage: React.FC = ({ clusters }) => { }, }); + useEffect(() => { + if (cluster && data.nodeSummary) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + instance: data.nodeSummary.host, + name: 'nodes', + }); + } + }, [cluster, data, generateBreadcrumbs]); + const getPageData = useCallback(async () => { const url = `../api/monitoring/v1/clusters/${clusterUuid}/logstash/node/${match.params.uuid}`; const bounds = services.data?.query.timefilter.timefilter.getBounds(); diff --git a/x-pack/plugins/monitoring/public/application/pages/logstash/node_pipelines.tsx b/x-pack/plugins/monitoring/public/application/pages/logstash/node_pipelines.tsx index 740202da57d24..5ac5fe356db9f 100644 --- a/x-pack/plugins/monitoring/public/application/pages/logstash/node_pipelines.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/logstash/node_pipelines.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useContext, useState, useCallback } from 'react'; +import React, { useContext, useState, useCallback, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { find } from 'lodash'; // @ts-ignore @@ -25,6 +25,7 @@ import { useTable } from '../../hooks/use_table'; // @ts-ignore import { PipelineListing } from '../../../components/logstash/pipeline_listing/pipeline_listing'; import { useCharts } from '../../hooks/use_charts'; +import { BreadcrumbContainer } from '../../hooks/use_breadcrumbs'; export const LogStashNodePipelinesPage: React.FC = ({ clusters }) => { const globalState = useContext(GlobalStateContext); @@ -35,7 +36,9 @@ export const LogStashNodePipelinesPage: React.FC = ({ clusters } const { onBrush, zoomInfo } = useCharts(); const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; + + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); const { getPaginationTableProps, getPaginationRouteOptions, updateTotalItemCount } = useTable('logstash.pipelines'); @@ -83,6 +86,16 @@ export const LogStashNodePipelinesPage: React.FC = ({ clusters } match.params.uuid, ]); + useEffect(() => { + if (cluster && data.nodeSummary) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + instance: data.nodeSummary.host, + name: 'nodes', + }); + } + }, [cluster, data, generateBreadcrumbs]); + return ( = ({ clusters } cluster={cluster} > {data.pipelines && ( - +
+ +
)}
); diff --git a/x-pack/plugins/monitoring/public/application/pages/logstash/nodes.tsx b/x-pack/plugins/monitoring/public/application/pages/logstash/nodes.tsx index 8e41d3818c8f3..8d9dcd59d1a22 100644 --- a/x-pack/plugins/monitoring/public/application/pages/logstash/nodes.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/logstash/nodes.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useContext, useState, useCallback } from 'react'; +import React, { useContext, useState, useCallback, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { find } from 'lodash'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; @@ -19,15 +19,17 @@ import { useTable } from '../../hooks/use_table'; import { RULE_LOGSTASH_VERSION_MISMATCH, LOGSTASH_SYSTEM_ID } from '../../../../common/constants'; import { AlertsByName } from '../../../alerts/types'; import { fetchAlerts } from '../../../lib/fetch_alerts'; +import { BreadcrumbContainer } from '../../hooks/use_breadcrumbs'; export const LogStashNodesPage: React.FC = ({ clusters }) => { const globalState = useContext(GlobalStateContext); const { services } = useKibana<{ data: any }>(); const clusterUuid = globalState.cluster_uuid; const ccs = globalState.ccs; + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; const [data, setData] = useState({} as any); const [alerts, setAlerts] = useState({}); const { getPaginationTableProps } = useTable('logstash.nodes'); @@ -69,6 +71,14 @@ export const LogStashNodesPage: React.FC = ({ clusters }) => { } }, [ccs, clusterUuid, services.data?.query.timefilter.timefilter, services.http]); + useEffect(() => { + if (cluster) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + }); + } + }, [cluster, generateBreadcrumbs]); + return ( = ({ clusters }) => { getPageData={getPageData} cluster={cluster} > -
+
( diff --git a/x-pack/plugins/monitoring/public/application/pages/logstash/overview.tsx b/x-pack/plugins/monitoring/public/application/pages/logstash/overview.tsx index 339b9e9395569..1412f7b9c55fb 100644 --- a/x-pack/plugins/monitoring/public/application/pages/logstash/overview.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/logstash/overview.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useContext, useState, useCallback } from 'react'; +import React, { useContext, useState, useCallback, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { find } from 'lodash'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; @@ -14,6 +14,7 @@ import { useCharts } from '../../hooks/use_charts'; // @ts-ignore import { Overview } from '../../../components/logstash/overview'; import { LogstashTemplate } from './logstash_template'; +import { BreadcrumbContainer } from '../../hooks/use_breadcrumbs'; export const LogStashOverviewPage: React.FC = ({ clusters }) => { const globalState = useContext(GlobalStateContext); @@ -23,7 +24,8 @@ export const LogStashOverviewPage: React.FC = ({ clusters }) => const ccs = globalState.ccs; const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); const [data, setData] = useState(null); // const [showShardActivityHistory, setShowShardActivityHistory] = useState(false); @@ -53,6 +55,14 @@ export const LogStashOverviewPage: React.FC = ({ clusters }) => setData(response); }, [ccs, clusterUuid, services.data?.query.timefilter.timefilter, services.http]); + useEffect(() => { + if (cluster) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + }); + } + }, [cluster, data, generateBreadcrumbs]); + const renderOverview = (overviewData: any) => { if (overviewData === null) { return null; @@ -75,10 +85,9 @@ export const LogStashOverviewPage: React.FC = ({ clusters }) => title={title} pageTitle={pageTitle} getPageData={getPageData} - data-test-subj="elasticsearchOverviewPage" cluster={cluster} > -
{renderOverview(data)}
+
{renderOverview(data)}
); }; diff --git a/x-pack/plugins/monitoring/public/application/pages/logstash/pipeline.tsx b/x-pack/plugins/monitoring/public/application/pages/logstash/pipeline.tsx index 20f1caee2b1d8..cf9b5628222f4 100644 --- a/x-pack/plugins/monitoring/public/application/pages/logstash/pipeline.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/logstash/pipeline.tsx @@ -29,6 +29,7 @@ import { formatTimestampToDuration } from '../../../../common'; import { CALCULATE_DURATION_SINCE } from '../../../../common/constants'; import { getSafeForExternalLink } from '../../../lib/get_safe_for_external_link'; import { PipelineVersions } from './pipeline_versions_dropdown'; +import { BreadcrumbContainer } from '../../hooks/use_breadcrumbs'; export const LogStashPipelinePage: React.FC = ({ clusters }) => { const match = useRouteMatch<{ id: string | undefined; hash: string | undefined }>(); @@ -43,9 +44,9 @@ export const LogStashPipelinePage: React.FC = ({ clusters }) => const ccs = globalState.ccs; const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; const [data, setData] = useState({} as any); - const [detailVertexId, setDetailVertexId] = useState(null); + const [detailVertexId, setDetailVertexId] = useState(undefined); const { updateTotalItemCount } = useTable('logstash.pipelines'); const title = i18n.translate('xpack.monitoring.logstash.pipeline.routeTitle', { @@ -125,19 +126,21 @@ export const LogStashPipelinePage: React.FC = ({ clusters }) => }, [data]); const timeseriesTooltipXValueFormatter = (xValue: any) => moment(xValue).format(dateFormat); + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); - const onVertexChange = useCallback( - (vertex: any) => { - if (!vertex) { - setDetailVertexId(null); - } else { - setDetailVertexId(vertex.id); - } + const onVertexChange = useCallback((vertex: any) => { + if (!vertex) { + setDetailVertexId(null); + } else { + setDetailVertexId(vertex.id); + } + }, []); + useEffect(() => { + if (detailVertexId !== undefined) { getPageData(); - }, - [getPageData] - ); + } + }, [detailVertexId, getPageData]); const onChangePipelineHash = useCallback(() => { window.location.hash = getSafeForExternalLink( @@ -145,6 +148,15 @@ export const LogStashPipelinePage: React.FC = ({ clusters }) => ); }, [pipelineId, pipelineHash]); + useEffect(() => { + if (cluster) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + page: 'pipeline', + }); + } + }, [cluster, data, generateBreadcrumbs]); + return ( = ({ clusters }) => { const globalState = useContext(GlobalStateContext); @@ -29,7 +30,7 @@ export const LogStashPipelinesPage: React.FC = ({ clusters }) => const cluster = find(clusters, { cluster_uuid: clusterUuid, - }); + }) as any; const [data, setData] = useState(null); const { getPaginationTableProps, getPaginationRouteOptions, updateTotalItemCount } = useTable('logstash.pipelines'); @@ -42,6 +43,8 @@ export const LogStashPipelinesPage: React.FC = ({ clusters }) => defaultMessage: 'Logstash pipelines', }); + const { generate: generateBreadcrumbs } = useContext(BreadcrumbContainer.Context); + const getPageData = useCallback(async () => { const bounds = services.data?.query.timefilter.timefilter.getBounds(); const url = `../api/monitoring/v1/clusters/${clusterUuid}/logstash/pipelines`; @@ -69,6 +72,14 @@ export const LogStashPipelinesPage: React.FC = ({ clusters }) => updateTotalItemCount, ]); + useEffect(() => { + if (cluster) { + generateBreadcrumbs(cluster.cluster_name, { + inLogstash: true, + }); + } + }, [cluster, data, generateBreadcrumbs]); + const renderOverview = (pageData: any) => { if (pageData === null) { return null; @@ -94,7 +105,6 @@ export const LogStashPipelinesPage: React.FC = ({ clusters }) => title={title} pageTitle={pageTitle} getPageData={getPageData} - data-test-subj="logstashPipelinesListing" cluster={cluster} >
{renderOverview(data)}
diff --git a/x-pack/plugins/monitoring/public/application/pages/page_template.tsx b/x-pack/plugins/monitoring/public/application/pages/page_template.tsx index c0030cfcfe55c..a508714612c28 100644 --- a/x-pack/plugins/monitoring/public/application/pages/page_template.tsx +++ b/x-pack/plugins/monitoring/public/application/pages/page_template.tsx @@ -49,6 +49,7 @@ export const PageTemplate: React.FC = ({ const { currentTimerange } = useContext(MonitoringTimeContainer.Context); const [loaded, setLoaded] = useState(false); + const [isRequestPending, setIsRequestPending] = useState(false); const history = useHistory(); const [hasError, setHasError] = useState(false); const handleRequestError = useRequestErrorHandler(); @@ -62,6 +63,7 @@ export const PageTemplate: React.FC = ({ ); useEffect(() => { + setIsRequestPending(true); getPageData?.() .then(getPageDataResponseHandler) .catch((err: IHttpFetchError) => { @@ -70,11 +72,20 @@ export const PageTemplate: React.FC = ({ }) .finally(() => { setLoaded(true); + setIsRequestPending(false); }); }, [getPageData, currentTimerange, getPageDataResponseHandler, handleRequestError]); const onRefresh = () => { - getPageData?.().then(getPageDataResponseHandler).catch(handleRequestError); + // don't refresh when a request is pending + if (isRequestPending) return; + setIsRequestPending(true); + getPageData?.() + .then(getPageDataResponseHandler) + .catch(handleRequestError) + .finally(() => { + setIsRequestPending(false); + }); if (isSetupModeFeatureEnabled(SetupModeFeature.MetricbeatMigration)) { updateSetupModeData(); diff --git a/x-pack/plugins/monitoring/public/components/chart/get_chart_options.js b/x-pack/plugins/monitoring/public/components/chart/get_chart_options.js index 641125dd3e943..001589a0cddb1 100644 --- a/x-pack/plugins/monitoring/public/components/chart/get_chart_options.js +++ b/x-pack/plugins/monitoring/public/components/chart/get_chart_options.js @@ -10,17 +10,8 @@ import { merge } from 'lodash'; import { CHART_LINE_COLOR, CHART_TEXT_COLOR } from '../../../common/constants'; export async function getChartOptions(axisOptions) { - let timezone; - try { - const $injector = Legacy.shims.getAngularInjector(); - timezone = $injector.get('config').get('dateFormat:tz'); - } catch (error) { - if (error.message === 'Angular has been removed.') { - timezone = Legacy.shims.uiSettings?.get('dateFormat:tz'); - } else { - throw error; - } - } + const timezone = Legacy.shims.uiSettings?.get('dateFormat:tz'); + const opts = { legend: { show: false, diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js index 1afe75cda4027..217bd1d24ff0e 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/logstash_panel.js @@ -98,6 +98,7 @@ export function LogstashPanel(props) { setupModeEnabled={setupMode.enabled} setupModeData={setupModeData} href={goToLogstash()} + data-test-subj="lsOverview" aria-label={i18n.translate( 'xpack.monitoring.cluster.overview.logstashPanel.overviewLinkAriaLabel', { diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard.test.js.snap b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard.test.js.snap index 72ff704916e28..faaf0762dbc7a 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard.test.js.snap +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard.test.js.snap @@ -146,7 +146,7 @@ exports[`CcrShard that it renders normally 1`] = ` size="s" >

- September 27, 2018 1:32:09 PM + September 27, 2018 9:32:09 AM

diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard_react.test.js.snap b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard_react.test.js.snap deleted file mode 100644 index 9302c86a222b1..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/__snapshots__/ccr_shard_react.test.js.snap +++ /dev/null @@ -1,185 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`CcrShardReact that is renders an exception properly 1`] = ` - - - -`; - -exports[`CcrShardReact that it renders normally 1`] = ` - - - - - - - - - - - - - - - - - - - - - - -

- -

- - } - id="ccrLatestStat" - initialIsOpen={false} - isLoading={false} - isLoadingMessage={false} - paddingSize="l" - > - -

- September 27, 2018 9:32:09 AM -

-
- - - { - "read_exceptions": [], - "follower_global_checkpoint": 3049, - "follower_index": "follower", - "follower_max_seq_no": 3049, - "last_requested_seq_no": 3049, - "leader_global_checkpoint": 3049, - "leader_index": "leader", - "leader_max_seq_no": 3049, - "mapping_version": 2, - "number_of_concurrent_reads": 1, - "number_of_concurrent_writes": 0, - "number_of_failed_bulk_operations": 0, - "failed_read_requests": 0, - "operations_written": 3050, - "number_of_queued_writes": 0, - "number_of_successful_bulk_operations": 3050, - "number_of_successful_fetches": 3050, - "operations_received": 3050, - "shard_id": 0, - "time_since_last_read_millis": 9402, - "total_fetch_time_millis": 44128980, - "total_index_time_millis": 41827, - "total_transferred_bytes": 234156 -} - -
-
-
-`; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.js b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.js index ef16c119d8613..9765d83e31f41 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.js @@ -5,8 +5,8 @@ * 2.0. */ -import React, { Fragment, PureComponent } from 'react'; -import { Legacy } from '../../../legacy_shims'; +import React, { Fragment } from 'react'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; import { EuiPage, EuiPageBody, @@ -28,9 +28,11 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { AlertsCallout } from '../../../alerts/callout'; -export class CcrShard extends PureComponent { - renderCharts() { - const { metrics } = this.props; +export function CcrShard(props) { + const { services } = useKibana(); + const timezone = services.uiSettings?.get('dateFormat:tz'); + const { metrics, stat, timestamp, oldestStat, formattedLeader, alerts } = props; + const renderCharts = () => { const seriesToShow = [metrics.ccr_sync_lag_ops, metrics.ccr_sync_lag_time]; const charts = seriesToShow.map((data, index) => ( @@ -42,10 +44,9 @@ export class CcrShard extends PureComponent { )); return {charts}; - } + }; - renderErrors() { - const { stat } = this.props; + const renderErrors = () => { if (stat.read_exceptions && stat.read_exceptions.length > 0) { return ( @@ -91,13 +92,9 @@ export class CcrShard extends PureComponent { ); } return null; - } - - renderLatestStat() { - const { stat, timestamp } = this.props; - const injector = Legacy.shims.getAngularInjector(); - const timezone = injector.get('config').get('dateFormat:tz'); + }; + const renderLatestStat = () => { return ( ); - } - - render() { - const { stat, oldestStat, formattedLeader, alerts } = this.props; + }; - return ( - - - - - - - - - {this.renderErrors()} - {this.renderCharts()} - - {this.renderLatestStat()} - - - ); - } + return ( + + + + + + + + + {renderErrors()} + {renderCharts()} + + {renderLatestStat()} + + + ); } diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.test.js b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.test.js index 90d9efecce40a..6b7b43016baf9 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.test.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard.test.js @@ -9,14 +9,6 @@ import React from 'react'; import { shallow } from 'enzyme'; import { CcrShard } from './ccr_shard'; -jest.mock('../../../legacy_shims', () => { - return { - Legacy: { - shims: { getAngularInjector: () => ({ get: () => ({ get: () => 'utc' }) }) }, - }, - }; -}); - jest.mock('../../chart', () => ({ MonitoringTimeseriesContainer: () => 'MonitoringTimeseriesContainer', })); diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard_react.js deleted file mode 100644 index 65586d602c85e..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard_react.js +++ /dev/null @@ -1,145 +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, { Fragment } from 'react'; -import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; -import { - EuiPage, - EuiPageBody, - EuiPanel, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiTitle, - EuiBasicTable, - EuiCodeBlock, - EuiTextColor, - EuiHorizontalRule, - EuiAccordion, -} from '@elastic/eui'; -import { MonitoringTimeseriesContainer } from '../../chart'; -import { Status } from './status'; -import { formatDateTimeLocal } from '../../../../common/formatting'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { i18n } from '@kbn/i18n'; -import { AlertsCallout } from '../../../alerts/callout'; - -export function CcrShardReact(props) { - const { services } = useKibana(); - const timezone = services.uiSettings?.get('dateFormat:tz'); - const { metrics, stat, timestamp, oldestStat, formattedLeader, alerts } = props; - const renderCharts = () => { - const seriesToShow = [metrics.ccr_sync_lag_ops, metrics.ccr_sync_lag_time]; - - const charts = seriesToShow.map((data, index) => ( - - - - - - )); - - return {charts}; - }; - - const renderErrors = () => { - if (stat.read_exceptions && stat.read_exceptions.length > 0) { - return ( - - - -

- - - -

-
- - -
- -
- ); - } - return null; - }; - - const renderLatestStat = () => { - return ( - -

- -

- - } - paddingSize="l" - > - - -

{formatDateTimeLocal(timestamp, timezone)}

-
- - {JSON.stringify(stat, null, 2)} -
-
- ); - }; - - return ( - - - - - - - - - {renderErrors()} - {renderCharts()} - - {renderLatestStat()} - - - ); -} diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard_react.test.js b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard_react.test.js deleted file mode 100644 index afd289a33457a..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/ccr_shard_react.test.js +++ /dev/null @@ -1,82 +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 from 'react'; -import { shallow } from 'enzyme'; -import { CcrShardReact } from './ccr_shard_react'; - -jest.mock('../../../legacy_shims', () => { - return { - Legacy: { - shims: { getAngularInjector: () => ({ get: () => ({ get: () => 'utc' }) }) }, - }, - }; -}); - -jest.mock('../../chart', () => ({ - MonitoringTimeseriesContainer: () => 'MonitoringTimeseriesContainer', -})); - -describe('CcrShardReact', () => { - const props = { - formattedLeader: 'leader on remote', - metrics: [], - stat: { - read_exceptions: [], - follower_global_checkpoint: 3049, - follower_index: 'follower', - follower_max_seq_no: 3049, - last_requested_seq_no: 3049, - leader_global_checkpoint: 3049, - leader_index: 'leader', - leader_max_seq_no: 3049, - mapping_version: 2, - number_of_concurrent_reads: 1, - number_of_concurrent_writes: 0, - number_of_failed_bulk_operations: 0, - failed_read_requests: 0, - operations_written: 3050, - number_of_queued_writes: 0, - number_of_successful_bulk_operations: 3050, - number_of_successful_fetches: 3050, - operations_received: 3050, - shard_id: 0, - time_since_last_read_millis: 9402, - total_fetch_time_millis: 44128980, - total_index_time_millis: 41827, - total_transferred_bytes: 234156, - }, - oldestStat: { - failed_read_requests: 0, - operations_written: 2976, - }, - timestamp: '2018-09-27T13:32:09.412Z', - }; - - test('that it renders normally', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - test('that is renders an exception properly', () => { - const localProps = { - ...props, - stat: { - ...props.stat, - read_exceptions: [ - { - type: 'something_is_wrong', - reason: 'not sure but something happened', - }, - ], - }, - }; - - const component = shallow(); - expect(component.find('EuiPanel').get(0)).toMatchSnapshot(); - }); -}); diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/index.js b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/index.js index 036a21e9b8a72..4cfd362b8ab0c 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/index.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/ccr_shard/index.js @@ -6,4 +6,3 @@ */ export { CcrShard } from './ccr_shard'; -export { CcrShardReact } from './ccr_shard_react'; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/index.ts b/x-pack/plugins/monitoring/public/components/elasticsearch/index.ts index 657617c698696..2cb688689438c 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/index.ts +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/index.ts @@ -6,8 +6,7 @@ */ export { ElasticsearchOverview } from './overview'; -export { ElasticsearchOverviewReact } from './overview'; export { ElasticsearchNodes } from './nodes'; -export { NodeReact } from './node'; +export { Node } from './node'; export { ElasticsearchIndices } from './indices'; export { ElasticsearchMLJobs } from './ml_jobs'; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/index/index.js b/x-pack/plugins/monitoring/public/components/elasticsearch/index/index.js index 294fc15ce4c47..9bdaa513998b5 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/index/index.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/index/index.js @@ -22,7 +22,6 @@ import { Logs } from '../../logs'; import { AlertsCallout } from '../../../alerts/callout'; export const Index = ({ - scope, indexSummary, metrics, clusterUuid, @@ -63,7 +62,7 @@ export const Index = ({ - + diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/index/index_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/index/index_react.js deleted file mode 100644 index 70bac52a0926c..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/index/index_react.js +++ /dev/null @@ -1,70 +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 from 'react'; -import { - EuiPage, - EuiPageContent, - EuiPageBody, - EuiPanel, - EuiSpacer, - EuiFlexGrid, - EuiFlexItem, -} from '@elastic/eui'; -import { IndexDetailStatus } from '../index_detail_status'; -import { MonitoringTimeseriesContainer } from '../../chart'; -import { ShardAllocationReact } from '../shard_allocation/shard_allocation_react'; -import { Logs } from '../../logs'; -import { AlertsCallout } from '../../../alerts/callout'; - -export const IndexReact = ({ - indexSummary, - metrics, - clusterUuid, - indexUuid, - logs, - alerts, - ...props -}) => { - const metricsToShow = [ - metrics.index_mem, - metrics.index_size, - metrics.index_search_request_rate, - metrics.index_request_rate, - metrics.index_segment_count, - metrics.index_document_count, - ]; - - return ( - - - - - - - - - - - {metricsToShow.map((metric, index) => ( - - - - - ))} - - - - - - - - - - - ); -}; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/node/index.ts b/x-pack/plugins/monitoring/public/components/elasticsearch/node/index.ts index 3b7153c5940d9..074749ae06e83 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/node/index.ts +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/node/index.ts @@ -7,4 +7,3 @@ export { NodeStatusIcon } from './status_icon'; export { Node } from './node'; -export { NodeReact } from './node_react'; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.d.ts b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.d.ts index 9d7a062e942bb..17f05d98ee042 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.d.ts +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.d.ts @@ -15,6 +15,5 @@ export interface NodeProps { alerts: unknown; nodeId: unknown; clusterUuid: unknown; - scope: unknown; [key: string]: any; } diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js index 3570f75df7334..0b03f1077f9cb 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node.js @@ -14,23 +14,16 @@ import { EuiFlexGrid, EuiFlexItem, EuiPanel, + EuiScreenReaderOnly, } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { NodeDetailStatus } from '../node_detail_status'; -import { Logs } from '../../logs/'; +import { Logs } from '../../logs'; import { MonitoringTimeseriesContainer } from '../../chart'; -import { ShardAllocation } from '../shard_allocation/shard_allocation'; import { AlertsCallout } from '../../../alerts/callout'; +import { ShardAllocation } from '../shard_allocation'; -export const Node = ({ - nodeSummary, - metrics, - logs, - alerts, - nodeId, - clusterUuid, - scope, - ...props -}) => { +export const Node = ({ nodeSummary, metrics, logs, alerts, nodeId, clusterUuid, ...props }) => { /* // This isn't doing anything due to a possible bug. https://github.com/elastic/kibana/issues/106309 if (alerts) { @@ -61,6 +54,14 @@ export const Node = ({ return ( + +

+ +

+
@@ -82,7 +83,7 @@ export const Node = ({ - +
diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node_react.d.ts b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node_react.d.ts deleted file mode 100644 index e0c4f6b301fdb..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node_react.d.ts +++ /dev/null @@ -1,19 +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 { FunctionComponent } from 'react'; - -export const NodeReact: FunctionComponent; -export interface NodeReactProps { - nodeSummary: unknown; - metrics: unknown; - logs: unknown; - alerts: unknown; - nodeId: unknown; - clusterUuid: unknown; - [key: string]: any; -} diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/node/node_react.js deleted file mode 100644 index 38b03d1aa748f..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/node/node_react.js +++ /dev/null @@ -1,99 +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 from 'react'; -import { - EuiPage, - EuiPageContent, - EuiPageBody, - EuiSpacer, - EuiFlexGrid, - EuiFlexItem, - EuiPanel, - EuiScreenReaderOnly, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { NodeDetailStatus } from '../node_detail_status'; -import { Logs } from '../../logs'; -import { MonitoringTimeseriesContainer } from '../../chart'; -import { AlertsCallout } from '../../../alerts/callout'; -import { ShardAllocationReact } from '../shard_allocation'; - -export const NodeReact = ({ - nodeSummary, - metrics, - logs, - alerts, - nodeId, - clusterUuid, - ...props -}) => { - /* - // This isn't doing anything due to a possible bug. https://github.com/elastic/kibana/issues/106309 - if (alerts) { - for (const alertTypeId of Object.keys(alerts)) { - const alertInstance = alerts[alertTypeId]; - for (const { meta } of alertInstance.states) { - const metricList = get(meta, 'metrics', []); - for (const metric of metricList) { - if (metrics[metric]) { - metrics[metric].alerts = metrics[metric].alerts || {}; - metrics[metric].alerts[alertTypeId] = alertInstance; - } - } - } - } - } - */ - const metricsToShow = [ - metrics.node_jvm_mem, - metrics.node_mem, - metrics.node_total_io, - metrics.node_cpu_metric, - metrics.node_load_average, - metrics.node_latency, - metrics.node_segment_count, - ]; - - return ( - - - -

- -

-
- - - - - - - - {metricsToShow.map((metric, index) => ( - - - - - ))} - - - - - - - - - - -
-
- ); -}; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/overview/index.ts b/x-pack/plugins/monitoring/public/components/elasticsearch/overview/index.ts index dd7e63c14fc53..b56c381395ef7 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/overview/index.ts +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/overview/index.ts @@ -5,6 +5,5 @@ * 2.0. */ -export { ElasticsearchOverview } from './overview'; // @ts-ignore -export { ElasticsearchOverviewReact } from './overview_react'; +export { ElasticsearchOverview } from './overview'; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/overview/overview.d.ts b/x-pack/plugins/monitoring/public/components/elasticsearch/overview/overview.d.ts deleted file mode 100644 index d4c893f87cbd2..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/overview/overview.d.ts +++ /dev/null @@ -1,18 +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 { FunctionComponent } from 'react'; - -export const ElasticsearchOverview: FunctionComponent; -export interface ElasticsearchOverviewProps { - clusterStatus: unknown; - metrics: unknown; - logs: unknown; - cluster: unknown; - shardActivity: unknown; - [key: string]: any; -} diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/overview/overview_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/overview/overview_react.js deleted file mode 100644 index ff4e531e31744..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/overview/overview_react.js +++ /dev/null @@ -1,66 +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 from 'react'; -import { ClusterStatus } from '../cluster_status'; -import { ShardActivityReact } from '../shard_activity'; -import { MonitoringTimeseriesContainer } from '../../chart'; -import { - EuiPage, - EuiFlexGrid, - EuiFlexItem, - EuiPanel, - EuiSpacer, - EuiPageBody, - EuiPageContent, -} from '@elastic/eui'; -import { Logs } from '../../logs/logs'; - -export function ElasticsearchOverviewReact({ - clusterStatus, - metrics, - logs, - cluster, - shardActivity, - ...props -}) { - const metricsToShow = [ - metrics.cluster_search_request_rate, - metrics.cluster_query_latency, - metrics.cluster_index_request_rate, - metrics.cluster_index_latency, - ]; - - return ( - - - - - - - - - {metricsToShow.map((metric, index) => ( - - - - - ))} - - - - - - - - - - - - - ); -} diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/index.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/index.js index 8c0b8b4c9c82d..bcdbbe715f86e 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/index.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/index.js @@ -6,4 +6,3 @@ */ export { ShardActivity } from './shard_activity'; -export { ShardActivityReact } from './shard_activity_react'; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/parse_props.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/parse_props.js index 1f0ed47adf387..9a102c52aa1f1 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/parse_props.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/parse_props.js @@ -5,7 +5,6 @@ * 2.0. */ -import { Legacy } from '../../../legacy_shims'; import { capitalize } from 'lodash'; import { formatMetric } from '../../../lib/format_number'; import { formatDateTimeLocal } from '../../../../common/formatting'; @@ -42,21 +41,12 @@ export const parseProps = (props) => { const { files, size } = index; - let thisTimezone; - // react version passes timezone while Angular uses injector - if (!timezone) { - const injector = Legacy.shims.getAngularInjector(); - thisTimezone = injector.get('config').get('dateFormat:tz'); - } else { - thisTimezone = timezone; - } - return { name: indexName || index.name, shard: `${id} / ${isPrimary ? 'Primary' : 'Replica'}`, relocationType: type === 'PRIMARY_RELOCATION' ? 'Primary Relocation' : normalizeString(type), stage: normalizeString(stage), - startTime: formatDateTimeLocal(startTimeInMillis, thisTimezone), + startTime: formatDateTimeLocal(startTimeInMillis, timezone), totalTime: formatMetric(Math.floor(totalTimeInMillis / 1000), '00:00:00'), isCopiedFromPrimary: !isPrimary || type === 'PRIMARY_RELOCATION', sourceName: source.name === undefined ? 'n/a' : source.name, diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity.js index 7b939f0fee8e6..e55cb793574a9 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity.js @@ -15,6 +15,7 @@ import { FilesProgress, BytesProgress, TranslogProgress } from './progress'; import { parseProps } from './parse_props'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; const columns = [ { @@ -67,14 +68,19 @@ const columns = [ }, ]; -export class ShardActivity extends React.Component { - constructor(props) { - super(props); - this.getNoDataMessage = this.getNoDataMessage.bind(this); - } - - getNoDataMessage() { - if (this.props.showShardActivityHistory) { +export const ShardActivity = (props) => { + const { + data: rawData, + sorting, + pagination, + onTableChange, + toggleShardActivityHistory, + showShardActivityHistory, + } = props; + const { services } = useKibana(); + const timezone = services.uiSettings?.get('dateFormat:tz'); + const getNoDataMessage = () => { + if (showShardActivityHistory) { return i18n.translate('xpack.monitoring.elasticsearch.shardActivity.noDataMessage', { defaultMessage: 'There are no historical shard activity records for the selected time range.', @@ -92,7 +98,7 @@ export class ShardActivity extends React.Component { defaultMessage="Try viewing {shardActivityHistoryLink}." values={{ shardActivityHistoryLink: ( - +
); - } - - render() { - // data prop is an array of table row data, or null (which triggers no data message) - const { - data: rawData, - sorting, - pagination, - onTableChange, - toggleShardActivityHistory, - showShardActivityHistory, - } = this.props; - - if (rawData === null) { - return null; - } + }; - const rows = rawData.map(parseProps); + const rows = rawData.map((data) => parseProps({ ...data, timezone })); - return ( - - - -

- -

-
-
- - + + +

- } - onChange={toggleShardActivityHistory} - checked={showShardActivityHistory} - /> - - - - ); - } -} +

+
+
+ + + } + onChange={toggleShardActivityHistory} + checked={showShardActivityHistory} + /> + + +
+ ); +}; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity_react.js deleted file mode 100644 index cc219ff0fff32..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_activity/shard_activity_react.js +++ /dev/null @@ -1,156 +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, { Fragment } from 'react'; -import { EuiText, EuiTitle, EuiLink, EuiSpacer, EuiSwitch } from '@elastic/eui'; -import { EuiMonitoringTable } from '../../table'; -import { RecoveryIndex } from './recovery_index'; -import { TotalTime } from './total_time'; -import { SourceDestination } from './source_destination'; -import { FilesProgress, BytesProgress, TranslogProgress } from './progress'; -import { parseProps } from './parse_props'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; - -const columns = [ - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.indexTitle', { - defaultMessage: 'Index', - }), - field: 'name', - render: (_name, shard) => , - }, - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.stageTitle', { - defaultMessage: 'Stage', - }), - field: 'stage', - }, - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.totalTimeTitle', { - defaultMessage: 'Total Time', - }), - field: null, - render: (shard) => , - }, - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.sourceDestinationTitle', { - defaultMessage: 'Source / Destination', - }), - field: null, - render: (shard) => , - }, - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.filesTitle', { - defaultMessage: 'Files', - }), - field: null, - render: (shard) => , - }, - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.bytesTitle', { - defaultMessage: 'Bytes', - }), - field: null, - render: (shard) => , - }, - { - name: i18n.translate('xpack.monitoring.kibana.shardActivity.translogTitle', { - defaultMessage: 'Translog', - }), - field: null, - render: (shard) => , - }, -]; - -export const ShardActivityReact = (props) => { - const { - data: rawData, - sorting, - pagination, - onTableChange, - toggleShardActivityHistory, - showShardActivityHistory, - } = props; - const { services } = useKibana(); - const timezone = services.uiSettings?.get('dateFormat:tz'); - const getNoDataMessage = () => { - if (showShardActivityHistory) { - return i18n.translate('xpack.monitoring.elasticsearch.shardActivity.noDataMessage', { - defaultMessage: - 'There are no historical shard activity records for the selected time range.', - }); - } - return ( - - -
- - - - ), - }} - /> -
- ); - }; - - const rows = rawData.map((data) => parseProps({ ...data, timezone })); - - return ( - - - -

- -

-
-
- - - } - onChange={toggleShardActivityHistory} - checked={showShardActivityHistory} - /> - - -
- ); -}; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view.js index a637703a98cdc..a004c7fae8e95 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view.js @@ -8,67 +8,22 @@ import React from 'react'; import { TableHead } from './table_head'; import { TableBody } from './table_body'; -import { i18n } from '@kbn/i18n'; -export class ClusterView extends React.Component { - static displayName = i18n.translate( - 'xpack.monitoring.elasticsearch.shardAllocation.clusterViewDisplayName', - { - defaultMessage: 'ClusterView', - } +export const ClusterView = (props) => { + return ( + + + +
); - - constructor(props) { - super(props); - - this.state = { - labels: props.scope.labels || [], - showing: props.scope.showing || [], - shardStats: props.scope.pageData.shardStats, - showSystemIndices: props.showSystemIndices, - toggleShowSystemIndices: props.toggleShowSystemIndices, - }; - } - - setShowing = (data) => { - if (data) { - this.setState({ showing: data }); - } - }; - - setShardStats = (stats) => { - this.setState({ shardStats: stats }); - }; - - UNSAFE_componentWillMount() { - this.props.scope.$watch('showing', this.setShowing); - this.props.scope.$watch(() => this.props.scope.pageData.shardStats, this.setShardStats); - } - - hasUnassigned = () => { - return ( - this.state.showing.length && - this.state.showing[0].unassigned && - this.state.showing[0].unassigned.length - ); - }; - - render() { - return ( - - - -
- ); - } -} +}; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view_react.js deleted file mode 100644 index 2d0c4b59df4b8..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/cluster_view_react.js +++ /dev/null @@ -1,29 +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 from 'react'; -import { TableHeadReact } from './table_head_react'; -import { TableBody } from './table_body'; - -export const ClusterViewReact = (props) => { - return ( - - - -
- ); -}; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head.js index d4d4da050d37a..b5316bb624a80 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head.js @@ -14,18 +14,15 @@ class IndexLabel extends React.Component { constructor(props) { super(props); this.state = { - showSystemIndices: props.scope.showSystemIndices, + showSystemIndices: props.showSystemIndices, }; this.toggleShowSystemIndicesState = this.toggleShowSystemIndicesState.bind(this); } - // See also public/directives/index_listing/index toggleShowSystemIndicesState(e) { const isChecked = e.target.checked; this.setState({ showSystemIndices: isChecked }); - this.props.scope.$evalAsync(() => { - this.props.toggleShowSystemIndices(isChecked); - }); + this.props.toggleShowSystemIndices(isChecked); } render() { @@ -70,7 +67,7 @@ export class TableHead extends React.Component { } render() { - const propLabels = this.props.scope.labels || []; + const propLabels = this.props.labels || []; const labelColumns = propLabels .map((label) => { const column = { @@ -81,8 +78,8 @@ export class TableHead extends React.Component { // override text label content with a JSX component column.content = ( ); } else { diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head_react.js deleted file mode 100644 index 5f914792ec70b..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/components/table_head_react.js +++ /dev/null @@ -1,99 +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 from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiFlexGroup, EuiFlexItem, EuiSwitch } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; - -class IndexLabel extends React.Component { - constructor(props) { - super(props); - this.state = { - showSystemIndices: props.showSystemIndices, - }; - this.toggleShowSystemIndicesState = this.toggleShowSystemIndicesState.bind(this); - } - - toggleShowSystemIndicesState(e) { - const isChecked = e.target.checked; - this.setState({ showSystemIndices: isChecked }); - this.props.toggleShowSystemIndices(isChecked); - } - - render() { - return ( - - - - - - - - - ); - } -} - -// eslint-disable-next-line react/no-multi-comp -export class TableHeadReact extends React.Component { - constructor(props) { - super(props); - } - - createColumn({ key, content }) { - return ( - - {content} - - ); - } - - render() { - const propLabels = this.props.labels || []; - const labelColumns = propLabels - .map((label) => { - const column = { - key: label.content.toLowerCase(), - }; - - if (label.showToggleSystemIndicesComponent) { - // override text label content with a JSX component - column.content = ( - - ); - } else { - column.content = label.content; - } - - return column; - }) - .map(this.createColumn); - - return ( - - {labelColumns} - - ); - } -} diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/index.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/index.js index dd4121b69574c..247bad7527846 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/index.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/index.js @@ -6,4 +6,3 @@ */ export { ShardAllocation } from './shard_allocation'; -export { ShardAllocationReact } from './shard_allocation_react'; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.js index f02b93eba8f90..7ca24853a9ccb 100644 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.js +++ b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation.js @@ -9,10 +9,10 @@ import React from 'react'; import { EuiTitle, EuiBadge, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { ClusterView } from './components/cluster_view'; import './shard_allocation.scss'; +import { ClusterView } from './components/cluster_view'; -export const ShardAllocation = ({ scope, type, shardStats }) => { +export const ShardAllocation = (props) => { const types = [ { label: i18n.translate('xpack.monitoring.elasticsearch.shardAllocation.primaryLabel', { @@ -77,13 +77,7 @@ export const ShardAllocation = ({ scope, type, shardStats }) => { ))} - +
); }; diff --git a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation_react.js b/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation_react.js deleted file mode 100644 index 502d93d5411d2..0000000000000 --- a/x-pack/plugins/monitoring/public/components/elasticsearch/shard_allocation/shard_allocation_react.js +++ /dev/null @@ -1,83 +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 from 'react'; -import { EuiTitle, EuiBadge, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { i18n } from '@kbn/i18n'; -import './shard_allocation.scss'; -import { ClusterViewReact } from './components/cluster_view_react'; - -export const ShardAllocationReact = (props) => { - const types = [ - { - label: i18n.translate('xpack.monitoring.elasticsearch.shardAllocation.primaryLabel', { - defaultMessage: 'Primary', - }), - color: 'primary', - }, - { - label: i18n.translate('xpack.monitoring.elasticsearch.shardAllocation.replicaLabel', { - defaultMessage: 'Replica', - }), - color: 'secondary', - }, - { - label: i18n.translate('xpack.monitoring.elasticsearch.shardAllocation.relocatingLabel', { - defaultMessage: 'Relocating', - }), - color: 'accent', - }, - { - label: i18n.translate('xpack.monitoring.elasticsearch.shardAllocation.initializingLabel', { - defaultMessage: 'Initializing', - }), - color: 'default', - }, - { - label: i18n.translate( - 'xpack.monitoring.elasticsearch.shardAllocation.unassignedPrimaryLabel', - { - defaultMessage: 'Unassigned Primary', - } - ), - color: 'danger', - }, - { - label: i18n.translate( - 'xpack.monitoring.elasticsearch.shardAllocation.unassignedReplicaLabel', - { - defaultMessage: 'Unassigned Replica', - } - ), - color: 'warning', - }, - ]; - - return ( -
- -

- -

-
- - - {types.map((type) => ( - - {type.label} - - ))} - - - -
- ); -}; diff --git a/x-pack/plugins/monitoring/public/components/index.ts b/x-pack/plugins/monitoring/public/components/index.ts index 6f0b9bb88667f..b8e9adbf27fa3 100644 --- a/x-pack/plugins/monitoring/public/components/index.ts +++ b/x-pack/plugins/monitoring/public/components/index.ts @@ -12,4 +12,4 @@ export { NoData } from './no_data'; export { License } from './license'; export { PageLoading } from './page_loading'; -export { ElasticsearchOverview, ElasticsearchNodes, ElasticsearchIndices } from './elasticsearch'; +export { ElasticsearchNodes, ElasticsearchIndices } from './elasticsearch'; diff --git a/x-pack/plugins/monitoring/public/components/logs/logs.js b/x-pack/plugins/monitoring/public/components/logs/logs.js index 3021240a157d3..52c1c1373caf5 100644 --- a/x-pack/plugins/monitoring/public/components/logs/logs.js +++ b/x-pack/plugins/monitoring/public/components/logs/logs.js @@ -16,18 +16,8 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { Reason } from './reason'; const getFormattedDateTimeLocal = (timestamp) => { - try { - const injector = Legacy.shims.getAngularInjector(); - const timezone = injector.get('config').get('dateFormat:tz'); - return formatDateTimeLocal(timestamp, timezone); - } catch (error) { - if (error.message === 'Angular has been removed.') { - const timezone = Legacy.shims.uiSettings?.get('dateFormat:tz'); - return formatDateTimeLocal(timestamp, timezone); - } else { - throw error; - } - } + const timezone = Legacy.shims.uiSettings?.get('dateFormat:tz'); + return formatDateTimeLocal(timestamp, timezone); }; const columnTimestampTitle = i18n.translate('xpack.monitoring.logs.listing.timestampTitle', { diff --git a/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js b/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js index 33ae7569ce5ad..a2ed4127e4c4a 100644 --- a/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js +++ b/x-pack/plugins/monitoring/public/components/logstash/listing/listing.js @@ -58,12 +58,15 @@ export class Listing extends PureComponent { return (
-
- +
+ {name}
-
{node.logstash.http_address}
+
{node.logstash.http_address}
{setupModeStatus}
); @@ -84,7 +87,9 @@ export class Listing extends PureComponent { }), field: 'cpu_usage', sortable: true, - render: (value) => formatPercentageUsage(value, 100), + render: (value) => ( + {formatPercentageUsage(value, 100)} + ), }, { name: i18n.translate('xpack.monitoring.logstash.nodes.loadAverageTitle', { @@ -92,7 +97,7 @@ export class Listing extends PureComponent { }), field: 'load_average', sortable: true, - render: (value) => formatNumber(value, '0.00'), + render: (value) => {formatNumber(value, '0.00')}, }, { name: i18n.translate('xpack.monitoring.logstash.nodes.jvmHeapUsedTitle', { @@ -101,7 +106,9 @@ export class Listing extends PureComponent { }), field: 'jvm_heap_used', sortable: true, - render: (value) => formatPercentageUsage(value, 100), + render: (value) => ( + {formatPercentageUsage(value, 100)} + ), }, { name: i18n.translate('xpack.monitoring.logstash.nodes.eventsIngestedTitle', { @@ -109,7 +116,7 @@ export class Listing extends PureComponent { }), field: 'events_out', sortable: true, - render: (value) => formatNumber(value, '0.[0]a'), + render: (value) => {formatNumber(value, '0.[0]a')}, }, { name: i18n.translate('xpack.monitoring.logstash.nodes.configReloadsTitle', { @@ -118,14 +125,14 @@ export class Listing extends PureComponent { sortable: true, render: (node) => (
-
+
-
+
formatNumber(value), + render: (value) => {formatNumber(value)}, }, ]; } diff --git a/x-pack/plugins/monitoring/public/legacy_shims.ts b/x-pack/plugins/monitoring/public/legacy_shims.ts index 48484421839bd..7c7e7642cac81 100644 --- a/x-pack/plugins/monitoring/public/legacy_shims.ts +++ b/x-pack/plugins/monitoring/public/legacy_shims.ts @@ -37,14 +37,9 @@ export interface KFetchKibanaOptions { prependBasePath?: boolean; } -const angularNoop = () => { - throw new Error('Angular has been removed.'); -}; - export interface IShims { toastNotifications: CoreStart['notifications']['toasts']; capabilities: CoreStart['application']['capabilities']; - getAngularInjector: typeof angularNoop; getBasePath: () => string; getInjected: (name: string, defaultValue?: unknown) => unknown; breadcrumbs: { @@ -84,7 +79,6 @@ export class Legacy { this._shims = { toastNotifications: core.notifications.toasts, capabilities: core.application.capabilities, - getAngularInjector: angularNoop, getBasePath: (): string => core.http.basePath.get(), getInjected: (name: string, defaultValue?: unknown): string | unknown => core.injectedMetadata.getInjectedVar(name, defaultValue), diff --git a/x-pack/plugins/monitoring/server/deprecations.ts b/x-pack/plugins/monitoring/server/deprecations.ts index 13f8c28c5a621..3cb67566e6df3 100644 --- a/x-pack/plugins/monitoring/server/deprecations.ts +++ b/x-pack/plugins/monitoring/server/deprecations.ts @@ -5,9 +5,7 @@ * 2.0. */ -import { get } from 'lodash'; -import { ConfigDeprecationFactory, ConfigDeprecation } from 'kibana/server'; -import { CLUSTER_ALERTS_ADDRESS_CONFIG_KEY } from '../common/constants'; +import { ConfigDeprecation, ConfigDeprecationFactory } from 'kibana/server'; /** * Re-writes deprecated user-defined config settings and logs warnings as a @@ -46,26 +44,6 @@ export const deprecations = ({ 'monitoring.ui.elasticsearch.logFetchCount' ), renameFromRoot('xpack.monitoring', 'monitoring'), - (config, fromPath, addDeprecation) => { - const clusterAlertsEnabled = get(config, 'monitoring.cluster_alerts.enabled', true); - const emailNotificationsEnabled = - clusterAlertsEnabled && - get(config, 'monitoring.cluster_alerts.email_notifications.enabled', true); - const updatedKey = get(config, `monitoring.${CLUSTER_ALERTS_ADDRESS_CONFIG_KEY}`); - const legacyKey = get(config, `xpack.monitoring.${CLUSTER_ALERTS_ADDRESS_CONFIG_KEY}`); - if (emailNotificationsEnabled && !updatedKey && !legacyKey) { - addDeprecation({ - configPath: `cluster_alerts.email_notifications.enabled`, - message: `Config key [${fromPath}.${CLUSTER_ALERTS_ADDRESS_CONFIG_KEY}] will be required for email notifications to work in 8.0."`, - correctiveActions: { - manualSteps: [ - `Add [${fromPath}.${CLUSTER_ALERTS_ADDRESS_CONFIG_KEY}] to your kibana configs."`, - ], - }, - }); - } - return config; - }, rename('xpack_api_polling_frequency_millis', 'licensing.api_polling_frequency'), // TODO: Add deprecations for "monitoring.ui.elasticsearch.username: elastic" and "monitoring.ui.elasticsearch.username: kibana". diff --git a/x-pack/plugins/observability/public/components/app/cases/create/index.tsx b/x-pack/plugins/observability/public/components/app/cases/create/index.tsx index f4749fed5116d..153797df7cd83 100644 --- a/x-pack/plugins/observability/public/components/app/cases/create/index.tsx +++ b/x-pack/plugins/observability/public/components/app/cases/create/index.tsx @@ -6,7 +6,6 @@ */ import React, { useCallback } from 'react'; -import { EuiPanel } from '@elastic/eui'; import { useKibana } from '../../../../utils/kibana_react'; import { getCaseDetailsUrl } from '../../../../pages/cases/links'; @@ -29,16 +28,12 @@ export const Create = React.memo(() => { [casesUrl, navigateToUrl] ); - return ( - - {cases.getCreateCase({ - disableAlerts: true, - onCancel: handleSetIsCancel, - onSuccess, - owner: [CASES_OWNER], - })} - - ); + return cases.getCreateCase({ + disableAlerts: true, + onCancel: handleSetIsCancel, + onSuccess, + owner: [CASES_OWNER], + }); }); Create.displayName = 'Create'; diff --git a/x-pack/plugins/observability/public/components/app/header/header_menu.tsx b/x-pack/plugins/observability/public/components/app/header/header_menu.tsx index 0ed01b7d3673e..550cfe46afb3f 100644 --- a/x-pack/plugins/observability/public/components/app/header/header_menu.tsx +++ b/x-pack/plugins/observability/public/components/app/header/header_menu.tsx @@ -37,5 +37,5 @@ export function ObservabilityHeaderMenu(): React.ReactElement | null { } const addDataLinkText = i18n.translate('xpack.observability.home.addData', { - defaultMessage: 'Add data', + defaultMessage: 'Add integrations', }); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/components/filter_label.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/components/filter_label.test.tsx index 03fd23631f755..097ea89826c38 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/components/filter_label.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/components/filter_label.test.tsx @@ -12,7 +12,8 @@ import { FilterLabel } from './filter_label'; import * as useSeriesHook from '../hooks/use_series_filters'; import { buildFilterLabel } from '../../filter_value_label/filter_value_label'; -describe('FilterLabel', function () { +// FLAKY: https://github.com/elastic/kibana/issues/115324 +describe.skip('FilterLabel', function () { mockAppIndexPattern(); const invertFilter = jest.fn(); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts index dbf36777b536f..ae3d57b3c9652 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts @@ -91,12 +91,12 @@ export const useLensAttributes = (): TypedLensByValueInput['attributes'] | null const theme = useTheme(); return useMemo(() => { - if (isEmpty(indexPatterns) || isEmpty(allSeries) || !reportType) { - return null; - } - // we only use the data from url to apply, since that get's updated to apply changes + // we only use the data from url to apply, since that gets updated to apply changes const allSeriesT: AllSeries = convertAllShortSeries(storage.get(allSeriesKey) ?? []); + if (isEmpty(indexPatterns) || isEmpty(allSeriesT) || !reportType) { + return null; + } const layerConfigs = getLayerConfigs(allSeriesT, reportType, theme, indexPatterns); if (layerConfigs.length < 1) { @@ -106,5 +106,7 @@ export const useLensAttributes = (): TypedLensByValueInput['attributes'] | null const lensAttributes = new LensAttributes(layerConfigs); return lensAttributes.getJSON(lastRefresh); - }, [indexPatterns, allSeries, reportType, storage, theme, lastRefresh]); + // we also want to check the state on allSeries changes + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [indexPatterns, reportType, storage, theme, lastRefresh, allSeries]); }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/lens_embeddable.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/lens_embeddable.tsx index b3ec7ee184f00..b9dced8036eae 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/lens_embeddable.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/lens_embeddable.tsx @@ -65,7 +65,7 @@ export function LensEmbeddable(props: Props) { [reportType, setSeries, firstSeries, notifications?.toasts] ); - if (!timeRange || !firstSeries) { + if (!timeRange || !lensAttributes) { return null; } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.test.tsx index ced4d3af057ff..f33eb3d515c15 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.test.tsx @@ -54,13 +54,6 @@ describe('OperationTypeSelect', function () { fireEvent.click(screen.getByTestId('operationTypeSelect')); - expect(setSeries).toHaveBeenCalledWith(0, { - operationType: 'median', - dataType: 'ux', - time: { from: 'now-15m', to: 'now' }, - name: 'performance-distribution', - }); - fireEvent.click(screen.getByText('95th Percentile')); expect(setSeries).toHaveBeenCalledWith(0, { operationType: '95th', diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.tsx index a223a74d74aea..5d949b91278fd 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/operation_type_select.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiSuperSelect } from '@elastic/eui'; @@ -30,12 +30,6 @@ export function OperationTypeSelect({ setSeries(seriesId, { ...series, operationType: value }); }; - useEffect(() => { - setSeries(seriesId, { ...series, operationType: operationType || defaultOperationType }); - // We only want to call this when defaultOperationType changes - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [defaultOperationType]); - return ( { setSeries(seriesId, { @@ -78,6 +80,10 @@ export function ReportMetricOptions({ seriesId, series, seriesConfig }: Props) { }; }); + if (!indexPattern && !loading) { + return {NO_DATA_AVAILABLE}; + } + return ( <> {!series.selectedMetricField && ( @@ -88,6 +94,7 @@ export function ReportMetricOptions({ seriesId, series, seriesConfig }: Props) { onClick={() => setShowOptions((prevState) => !prevState)} fill size="s" + isLoading={!indexPattern && loading} > {SELECT_REPORT_METRIC_LABEL} @@ -107,19 +114,23 @@ export function ReportMetricOptions({ seriesId, series, seriesConfig }: Props) { )} - {series.selectedMetricField && ( - onChange(undefined)} - iconOnClickAriaLabel={REMOVE_REPORT_METRIC_LABEL} - > - { - seriesConfig?.metricOptions?.find((option) => option.id === series.selectedMetricField) - ?.label - } - - )} + {series.selectedMetricField && + (indexPattern && !loading ? ( + onChange(undefined)} + iconOnClickAriaLabel={REMOVE_REPORT_METRIC_LABEL} + > + { + seriesConfig?.metricOptions?.find( + (option) => option.id === series.selectedMetricField + )?.label + } + + ) : ( + + ))} ); } @@ -137,3 +148,7 @@ const REMOVE_REPORT_METRIC_LABEL = i18n.translate( defaultMessage: 'Remove report metric', } ); + +const NO_DATA_AVAILABLE = i18n.translate('xpack.observability.expView.seriesEditor.noData', { + defaultMessage: 'No data available', +}); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.test.tsx new file mode 100644 index 0000000000000..934d8f7fdbfe7 --- /dev/null +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { screen, waitFor, fireEvent } from '@testing-library/dom'; +import { render } from '../rtl_helpers'; +import * as hooks from '../hooks/use_series_storage'; +import { ViewActions } from './view_actions'; +import { AllSeries } from '../hooks/use_series_storage'; + +describe('ViewActions', () => { + const applyChanges = jest.fn(); + + const mockSeriesStorage = (allSeries: AllSeries, urlAllSeries: AllSeries) => { + jest.clearAllMocks(); + jest.spyOn(hooks, 'useSeriesStorage').mockReturnValue({ + ...jest.requireActual('../hooks/use_series_storage'), + allSeries, + applyChanges, + storage: { get: jest.fn().mockReturnValue(urlAllSeries) } as any, + }); + }; + + const assertApplyIsEnabled = async () => { + render(); + + const applyBtn = screen.getByText(/Apply changes/i); + + const btnComponent = screen.getByTestId('seriesChangesApplyButton'); + + expect(btnComponent.classList).not.toContain('euiButton-isDisabled'); + + fireEvent.click(applyBtn); + + await waitFor(() => { + expect(applyChanges).toBeCalledTimes(1); + }); + }; + + it('renders ViewActions', async () => { + mockSeriesStorage([], []); + render(); + + expect(screen.getByText(/Apply changes/i)).toBeInTheDocument(); + }); + + it('apply button is disabled when no changes', async () => { + mockSeriesStorage([], []); + + render(); + const applyBtn = screen.getByText(/Apply changes/i); + + const btnComponent = screen.getByTestId('seriesChangesApplyButton'); + + expect(btnComponent.classList).toContain('euiButton-isDisabled'); + + fireEvent.click(applyBtn); + + await waitFor(() => { + expect(applyChanges).toBeCalledTimes(0); + }); + }); + + it('should call apply changes when series length is different', async function () { + mockSeriesStorage([], [{ name: 'testSeries' } as any]); + + await assertApplyIsEnabled(); + }); + + it('should call apply changes when series content is different', async function () { + mockSeriesStorage([{ name: 'testSeriesChange' } as any], [{ name: 'testSeries' } as any]); + + await assertApplyIsEnabled(); + }); + + it('should call apply changes when series content is different as in undefined', async function () { + mockSeriesStorage( + [{ name: undefined } as any], + [{ name: 'testSeries', operationType: undefined } as any] + ); + + await assertApplyIsEnabled(); + }); +}); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.tsx index ee2668aa0c39a..e85ce8ff40c69 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/views/view_actions.tsx @@ -8,22 +8,41 @@ import React from 'react'; import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { isEqual } from 'lodash'; +import { isEqual, pickBy } from 'lodash'; import { allSeriesKey, convertAllShortSeries, useSeriesStorage } from '../hooks/use_series_storage'; interface Props { onApply?: () => void; } +export function removeUndefinedProps(obj: T): Partial { + return pickBy(obj, (value) => value !== undefined); +} + export function ViewActions({ onApply }: Props) { const { allSeries, storage, applyChanges } = useSeriesStorage(); - const noChanges = isEqual(allSeries, convertAllShortSeries(storage.get(allSeriesKey) ?? [])); + const urlAllSeries = convertAllShortSeries(storage.get(allSeriesKey) ?? []); + + let noChanges = allSeries.length === urlAllSeries.length; + + if (noChanges) { + noChanges = !allSeries.some( + (series, index) => + !isEqual(removeUndefinedProps(series), removeUndefinedProps(urlAllSeries[index])) + ); + } return ( - applyChanges(onApply)} isDisabled={noChanges} fill size="s"> + applyChanges(onApply)} + isDisabled={noChanges} + fill + size="s" + data-test-subj={'seriesChangesApplyButton'} + > {i18n.translate('xpack.observability.expView.seriesBuilder.apply', { defaultMessage: 'Apply changes', })} diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_disclaimer.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_disclaimer.tsx new file mode 100644 index 0000000000000..6a57b08bf8d38 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/alerts/alerts_disclaimer.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiLink, EuiCallOut } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +export function AlertsDisclaimer() { + return ( + + + {i18n.translate('xpack.observability.alertsDisclaimerLinkText', { + defaultMessage: 'feedback', + })} + + ), + }} + /> + + ); +} diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx index 7171daa4a56e3..034b7522b9136 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts_flyout/index.tsx @@ -46,6 +46,7 @@ import { asDuration } from '../../../../common/utils/formatters'; import type { ObservabilityRuleTypeRegistry } from '../../../rules/create_observability_rule_type_registry'; import { parseAlert } from '../parse_alert'; import { AlertStatusIndicator } from '../../../components/shared/alert_status_indicator'; +import { ExperimentalBadge } from '../../../components/shared/experimental_badge'; type AlertsFlyoutProps = { alert?: TopAlert; @@ -137,6 +138,8 @@ export function AlertsFlyout({ return ( + +

{alertData.fields[ALERT_RULE_NAME]}

diff --git a/x-pack/plugins/observability/public/pages/alerts/index.tsx b/x-pack/plugins/observability/public/pages/alerts/index.tsx index bba3b426598df..016e53a3cef92 100644 --- a/x-pack/plugins/observability/public/pages/alerts/index.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/index.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import { EuiButtonEmpty, EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + import { IndexPatternBase } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; import React, { useCallback, useRef } from 'react'; @@ -16,13 +17,17 @@ import type { AlertWorkflowStatus } from '../../../common/typings'; import { ExperimentalBadge } from '../../components/shared/experimental_badge'; import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useFetcher } from '../../hooks/use_fetcher'; +import { useHasData } from '../../hooks/use_has_data'; import { usePluginContext } from '../../hooks/use_plugin_context'; import { RouteParams } from '../../routes'; import { callObservabilityApi } from '../../services/call_observability_api'; +import { getNoDataConfig } from '../../utils/no_data_config'; +import { LoadingObservability } from '../overview/loading_observability'; import { AlertsSearchBar } from './alerts_search_bar'; import { AlertsTableTGrid } from './alerts_table_t_grid'; import './styles.scss'; import { WorkflowStatusFilter } from './workflow_status_filter'; +import { AlertsDisclaimer } from './alerts_disclaimer'; export interface TopAlert { fields: ParsedTechnicalFields; @@ -141,8 +146,25 @@ export function AlertsPage({ routeParams }: AlertsPageProps) { refetch.current = ref; }, []); + const { hasAnyData, isAllRequestsComplete } = useHasData(); + + // If there is any data, set hasData to true otherwise we need to wait till all the data is loaded before setting hasData to true or false; undefined indicates the data is still loading. + const hasData = hasAnyData === true || (isAllRequestsComplete === false ? undefined : false); + + if (!hasAnyData && !isAllRequestsComplete) { + return ; + } + + const noDataConfig = getNoDataConfig({ + hasData, + basePath: core.http.basePath, + docsLink: core.docLinks.links.observability.guide, + }); + return ( @@ -161,25 +183,7 @@ export function AlertsPage({ routeParams }: AlertsPageProps) { > - -

- {i18n.translate('xpack.observability.alertsDisclaimerText', { - defaultMessage: - 'This page shows an experimental list of alerts. The data might not be accurate. All alerts are available in the ', - })} - - {i18n.translate('xpack.observability.alertsDisclaimerLinkText', { - defaultMessage: 'Rules and Connectors settings.', - })} - -

-
+
{ const userPermissions = useGetUserCasesPermissions(); - const { ObservabilityPageTemplate } = usePluginContext(); + const { core, ObservabilityPageTemplate } = usePluginContext(); useReadonlyHeader(); - useBreadcrumbs([casesBreadcrumbs.cases]); + const { hasAnyData, isAllRequestsComplete } = useHasData(); + + if (!hasAnyData && !isAllRequestsComplete) { + return ; + } + + // If there is any data, set hasData to true otherwise we need to wait till all the data is loaded before setting hasData to true or false; undefined indicates the data is still loading. + const hasData = hasAnyData === true || (isAllRequestsComplete === false ? undefined : false); + + const noDataConfig = getNoDataConfig({ + hasData, + basePath: core.http.basePath, + docsLink: core.docLinks.links.observability.guide, + }); + return userPermissions == null || userPermissions?.read ? ( {i18n.PAGE_TITLE}, }} diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts index 57cfbebc3ccff..e5c2bba5c98ac 100644 --- a/x-pack/plugins/observability/server/index.ts +++ b/x-pack/plugins/observability/server/index.ts @@ -33,8 +33,8 @@ export const config: PluginConfigDescriptor = { index: schema.string({ defaultValue: 'observability-annotations' }), }), unsafe: schema.object({ - alertingExperience: schema.object({ enabled: schema.boolean({ defaultValue: false }) }), - cases: schema.object({ enabled: schema.boolean({ defaultValue: false }) }), + alertingExperience: schema.object({ enabled: schema.boolean({ defaultValue: true }) }), + cases: schema.object({ enabled: schema.boolean({ defaultValue: true }) }), }), }), deprecations: ({ deprecate }) => [deprecate('enabled', '8.0.0')], diff --git a/x-pack/plugins/osquery/README.md b/x-pack/plugins/osquery/README.md index e0861fab2040b..fde90bb689673 100755 --- a/x-pack/plugins/osquery/README.md +++ b/x-pack/plugins/osquery/README.md @@ -6,4 +6,4 @@ This plugin adds extended support to Security Solution Fleet Osquery integration ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx b/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx index 0207963852a5e..fe84b856e4977 100644 --- a/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx +++ b/x-pack/plugins/osquery/public/agent_policies/agents_policy_link.tsx @@ -28,13 +28,12 @@ const AgentsPolicyLinkComponent: React.FC = ({ policyId } const { application: { getUrlForApp, navigateToApp }, } = useKibana().services; - const { data } = useAgentPolicy({ policyId }); const href = useMemo( () => getUrlForApp(PLUGIN_ID, { - path: `#` + pagePathGetters.policy_details({ policyId })[1], + path: pagePathGetters.policy_details({ policyId })[1], }), [getUrlForApp, policyId] ); @@ -45,7 +44,7 @@ const AgentsPolicyLinkComponent: React.FC = ({ policyId } event.preventDefault(); return navigateToApp(PLUGIN_ID, { - path: `#` + pagePathGetters.policy_details({ policyId })[1], + path: pagePathGetters.policy_details({ policyId })[1], }); } }, diff --git a/x-pack/plugins/osquery/public/agents/agent_id_to_name.tsx b/x-pack/plugins/osquery/public/agents/agent_id_to_name.tsx index e46d233244059..9c6d2c4947ea6 100644 --- a/x-pack/plugins/osquery/public/agents/agent_id_to_name.tsx +++ b/x-pack/plugins/osquery/public/agents/agent_id_to_name.tsx @@ -25,7 +25,7 @@ const AgentIdToNameComponent: React.FC = ({ agentId }) => { diff --git a/x-pack/plugins/osquery/public/agents/agents_table.tsx b/x-pack/plugins/osquery/public/agents/agents_table.tsx index c99d5a0454f82..a4fee25dfcd9a 100644 --- a/x-pack/plugins/osquery/public/agents/agents_table.tsx +++ b/x-pack/plugins/osquery/public/agents/agents_table.tsx @@ -43,7 +43,7 @@ interface AgentsTableProps { } const perPage = 10; -const DEBOUNCE_DELAY = 100; // ms +const DEBOUNCE_DELAY = 300; // ms const AgentsTableComponent: React.FC = ({ agentSelection, onChange }) => { // search related diff --git a/x-pack/plugins/osquery/public/agents/use_agent_policies.ts b/x-pack/plugins/osquery/public/agents/use_agent_policies.ts index e8d6fe7eb97ac..cdccd3aa21af8 100644 --- a/x-pack/plugins/osquery/public/agents/use_agent_policies.ts +++ b/x-pack/plugins/osquery/public/agents/use_agent_policies.ts @@ -22,8 +22,8 @@ export const useAgentPolicies = (policyIds: string[] = []) => { queryFn: () => http.get(`/internal/osquery/fleet_wrapper/agent_policies/${policyId}`), enabled: policyIds.length > 0, onSuccess: () => setErrorToast(), - onError: (error) => - setErrorToast(error as Error, { + onError: (error: Error) => + setErrorToast(error, { title: i18n.translate('xpack.osquery.action_policy_details.fetchError', { defaultMessage: 'Error while fetching policy details', }), diff --git a/x-pack/plugins/osquery/public/agents/use_all_agents.ts b/x-pack/plugins/osquery/public/agents/use_all_agents.ts index 42e4954989c66..03660a970aeef 100644 --- a/x-pack/plugins/osquery/public/agents/use_all_agents.ts +++ b/x-pack/plugins/osquery/public/agents/use_all_agents.ts @@ -35,7 +35,7 @@ export const useAllAgents = ( return useQuery( ['agents', osqueryPolicies, searchValue, perPage], () => { - let kuery = `${osqueryPolicies.map((p) => `policy_id:${p}`).join(' or ')}`; + let kuery = `(${osqueryPolicies.map((p) => `policy_id:${p}`).join(' or ')})`; if (searchValue) { kuery += ` and (local_metadata.host.hostname:*${searchValue}* or local_metadata.elastic.agent.id:*${searchValue}*)`; @@ -54,10 +54,13 @@ export const useAllAgents = ( enabled: !osqueryPoliciesLoading && osqueryPolicies.length > 0, onSuccess: () => setErrorToast(), onError: (error) => - setErrorToast(error as Error, { + // @ts-expect-error update types + setErrorToast(error?.body, { title: i18n.translate('xpack.osquery.agents.fetchError', { defaultMessage: 'Error while fetching agents', }), + // @ts-expect-error update types + toastMessage: error?.body?.error, }), } ); diff --git a/x-pack/plugins/osquery/public/common/schemas/osquery/v5.0.1.json b/x-pack/plugins/osquery/public/common/schemas/osquery/v5.0.1.json index e995062462022..ef44a10db9dff 100644 --- a/x-pack/plugins/osquery/public/common/schemas/osquery/v5.0.1.json +++ b/x-pack/plugins/osquery/public/common/schemas/osquery/v5.0.1.json @@ -1 +1 @@ -[{"name":"account_policy_data","description":"Additional OS X user account data from the AccountPolicy section of OpenDirectory.","platforms":["darwin"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the account was first created","type":"double","hidden":false,"required":false,"index":false},{"name":"failed_login_count","description":"The number of failed login attempts using an incorrect password. Count resets after a correct password is entered.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"failed_login_timestamp","description":"The time of the last failed login attempt. Resets after a correct password is entered","type":"double","hidden":false,"required":false,"index":false},{"name":"password_last_set_time","description":"The time the password was last changed","type":"double","hidden":false,"required":false,"index":false}]},{"name":"acpi_tables","description":"Firmware ACPI functional table common metadata and content.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"ACPI table name","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of compiled table data","type":"integer","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table content","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ad_config","description":"OS X Active Directory configuration.","platforms":["darwin"],"columns":[{"name":"name","description":"The OS X-specific configuration name","type":"text","hidden":false,"required":false,"index":false},{"name":"domain","description":"Active Directory trust domain","type":"text","hidden":false,"required":false,"index":false},{"name":"option","description":"Canonical name of option","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Variable typed option value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"alf","description":"OS X application layer firewall (ALF) service details.","platforms":["darwin"],"columns":[{"name":"allow_signed_enabled","description":"1 If allow signed mode is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"firewall_unload","description":"1 If firewall unloading enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"global_state","description":"1 If the firewall is enabled with exceptions, 2 if the firewall is configured to block all incoming connections, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"logging_enabled","description":"1 If logging mode is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"logging_option","description":"Firewall logging option","type":"integer","hidden":false,"required":false,"index":false},{"name":"stealth_enabled","description":"1 If stealth mode is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"version","description":"Application Layer Firewall version","type":"text","hidden":false,"required":false,"index":false}]},{"name":"alf_exceptions","description":"OS X application layer firewall (ALF) service exceptions.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to the executable that is excepted","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Firewall exception state","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"alf_explicit_auths","description":"ALF services explicitly allowed to perform networking.","platforms":["darwin"],"columns":[{"name":"process","description":"Process name explicitly allowed","type":"text","hidden":false,"required":false,"index":false}]},{"name":"app_schemes","description":"OS X application schemes and handlers (e.g., http, file, mailto).","platforms":["darwin"],"columns":[{"name":"scheme","description":"Name of the scheme/protocol","type":"text","hidden":false,"required":false,"index":false},{"name":"handler","description":"Application label for the handler","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this handler is the OS default, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"external","description":"1 if this handler does NOT exist on OS X by default, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"protected","description":"1 if this handler is protected (reserved) by OS X, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"apparmor_events","description":"Track AppArmor events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"Raw audit message","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false},{"name":"apparmor","description":"Apparmor Status like ALLOWED, DENIED etc.","type":"text","hidden":false,"required":false,"index":false},{"name":"operation","description":"Permission requested by the process","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process PID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"profile","description":"Apparmor profile name","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","hidden":false,"required":false,"index":false},{"name":"denied_mask","description":"Denied permissions for the process","type":"text","hidden":false,"required":false,"index":false},{"name":"capname","description":"Capability requested by the process","type":"text","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"ouid","description":"Object owner's user ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"capability","description":"Capability number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"requested_mask","description":"Requested access mask","type":"text","hidden":false,"required":false,"index":false},{"name":"info","description":"Additional information","type":"text","hidden":false,"required":false,"index":false},{"name":"error","description":"Error information","type":"text","hidden":false,"required":false,"index":false},{"name":"namespace","description":"AppArmor namespace","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"AppArmor label","type":"text","hidden":false,"required":false,"index":false}]},{"name":"apparmor_profiles","description":"Track active AppArmor profiles.","platforms":["linux"],"columns":[{"name":"path","description":"Unique, aa-status compatible, policy identifier.","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Policy name.","type":"text","hidden":false,"required":false,"index":false},{"name":"attach","description":"Which executable(s) a profile will attach to.","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"How the policy is applied.","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"A unique hash that identifies this policy.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"appcompat_shims","description":"Application Compatibility shims are a way to persist malware. This table presents the AppCompat Shim information from the registry in a nice format. See http://files.brucon.org/2015/Tomczak_and_Ballenthin_Shims_for_the_Win.pdf for more details.","platforms":["windows"],"columns":[{"name":"executable","description":"Name of the executable that is being shimmed. This is pulled from the registry.","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the SDB database.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the SDB.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Install time of the SDB","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the SDB database.","type":"text","hidden":false,"required":false,"index":false},{"name":"sdb_id","description":"Unique GUID of the SDB.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"apps","description":"OS X applications installed in known search paths (e.g., /Applications).","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the Name.app folder","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute and full Name.app path","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_executable","description":"Info properties CFBundleExecutable label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_identifier","description":"Info properties CFBundleIdentifier label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_name","description":"Info properties CFBundleName label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_short_version","description":"Info properties CFBundleShortVersionString label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_version","description":"Info properties CFBundleVersion label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_package_type","description":"Info properties CFBundlePackageType label","type":"text","hidden":false,"required":false,"index":false},{"name":"environment","description":"Application-set environment variables","type":"text","hidden":false,"required":false,"index":false},{"name":"element","description":"Does the app identify as a background agent","type":"text","hidden":false,"required":false,"index":false},{"name":"compiler","description":"Info properties DTCompiler label","type":"text","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Info properties CFBundleDevelopmentRegion label","type":"text","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Info properties CFBundleDisplayName label","type":"text","hidden":false,"required":false,"index":false},{"name":"info_string","description":"Info properties CFBundleGetInfoString label","type":"text","hidden":false,"required":false,"index":false},{"name":"minimum_system_version","description":"Minimum version of OS X required for the app to run","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The UTI that categorizes the app for the App Store","type":"text","hidden":false,"required":false,"index":false},{"name":"applescript_enabled","description":"Info properties NSAppleScriptEnabled label","type":"text","hidden":false,"required":false,"index":false},{"name":"copyright","description":"Info properties NSHumanReadableCopyright label","type":"text","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"The time that the app was last used","type":"double","hidden":false,"required":false,"index":false}]},{"name":"apt_sources","description":"Current list of APT repositories or software channels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Repository name","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source file","type":"text","hidden":false,"required":false,"index":false},{"name":"base_uri","description":"Repository base URI","type":"text","hidden":false,"required":false,"index":false},{"name":"release","description":"Release name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Repository source version","type":"text","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Repository maintainer","type":"text","hidden":false,"required":false,"index":false},{"name":"components","description":"Repository components","type":"text","hidden":false,"required":false,"index":false},{"name":"architectures","description":"Repository architectures","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"arp_cache","description":"Address resolution cache, both static and dynamic (from ARP, NDP).","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"address","description":"IPv4 address target","type":"text","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address of broadcasted address","type":"text","hidden":false,"required":false,"index":false},{"name":"interface","description":"Interface of the network for the MAC","type":"text","hidden":false,"required":false,"index":false},{"name":"permanent","description":"1 for true, 0 for false","type":"text","hidden":false,"required":false,"index":false}]},{"name":"asl","description":"Queries the Apple System Log data structure for system events.","platforms":["darwin"],"columns":[{"name":"time","description":"Unix timestamp. Set automatically","type":"integer","hidden":false,"required":false,"index":false},{"name":"time_nano_sec","description":"Nanosecond time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"host","description":"Sender's address (set by the server).","type":"text","hidden":false,"required":false,"index":false},{"name":"sender","description":"Sender's identification string. Default is process name.","type":"text","hidden":false,"required":false,"index":false},{"name":"facility","description":"Sender's facility. Default is 'user'.","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Sending process ID encoded as a string. Set automatically.","type":"integer","hidden":false,"required":false,"index":false},{"name":"gid","description":"GID that sent the log message (set by the server).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"UID that sent the log message (set by the server).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"level","description":"Log level number. See levels in asl.h.","type":"integer","hidden":false,"required":false,"index":false},{"name":"message","description":"Message text.","type":"text","hidden":false,"required":false,"index":false},{"name":"ref_pid","description":"Reference PID for messages proxied by launchd","type":"integer","hidden":false,"required":false,"index":false},{"name":"ref_proc","description":"Reference process for messages proxied by launchd","type":"text","hidden":false,"required":false,"index":false},{"name":"extra","description":"Extra columns, in JSON format. Queries against this column are performed entirely in SQLite, so do not benefit from efficient querying via asl.h.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"atom_packages","description":"Lists all atom packages in a directory or globally installed in a system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Package supplied description","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Package's package.json path","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License for package","type":"text","hidden":false,"required":false,"index":false},{"name":"homepage","description":"Package supplied homepage","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the plugin","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"augeas","description":"Configuration files parsed by augeas.","platforms":["darwin","linux"],"columns":[{"name":"node","description":"The node path of the configuration item","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"The value of the configuration item","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"The label of the configuration item","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"The path to the configuration file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authenticode","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["windows"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"original_program_name","description":"The original program name that the publisher has signed","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The certificate serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_name","description":"The certificate issuer name","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_name","description":"The certificate subject name","type":"text","hidden":false,"required":false,"index":false},{"name":"result","description":"The signature check result","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authorization_mechanisms","description":"OS X Authorization mechanisms database.","platforms":["darwin"],"columns":[{"name":"label","description":"Label of the authorization right","type":"text","hidden":false,"required":false,"index":false},{"name":"plugin","description":"Authorization plugin name","type":"text","hidden":false,"required":false,"index":false},{"name":"mechanism","description":"Name of the mechanism that will be called","type":"text","hidden":false,"required":false,"index":false},{"name":"privileged","description":"If privileged it will run as root, else as an anonymous user","type":"text","hidden":false,"required":false,"index":false},{"name":"entry","description":"The whole string entry","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authorizations","description":"OS X Authorization rights database.","platforms":["darwin"],"columns":[{"name":"label","description":"Item name, usually in reverse domain format","type":"text","hidden":false,"required":false,"index":false},{"name":"modified","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"allow_root","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"timeout","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"tries","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"authenticate_user","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"shared","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"session_owner","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authorized_keys","description":"A line-delimited authorized_keys table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local owner of authorized_keys file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"algorithm","description":"algorithm of key","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"parsed authorized keys line","type":"text","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to the authorized_keys file","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"autoexec","description":"Aggregate of executables that will automatically execute on the target machine. This is an amalgamation of other tables like services, scheduled_tasks, startup_items and more.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the executable","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the program","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source table of the autoexec item","type":"text","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_metadata","description":"Azure instance metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"location","description":"Azure Region the VM is running in","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"offer","description":"Offer information for the VM image (Azure image gallery VMs only)","type":"text","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Publisher of the VM image","type":"text","hidden":false,"required":false,"index":false},{"name":"sku","description":"SKU for the VM image","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the VM image","type":"text","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Linux or Windows","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_update_domain","description":"Update domain the VM is running in","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_fault_domain","description":"Fault domain the VM is running in","type":"text","hidden":false,"required":false,"index":false},{"name":"vm_id","description":"Unique identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"vm_size","description":"VM size","type":"text","hidden":false,"required":false,"index":false},{"name":"subscription_id","description":"Azure subscription for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"resource_group_name","description":"Resource group for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"placement_group_id","description":"Placement group for the VM scale set","type":"text","hidden":false,"required":false,"index":false},{"name":"vm_scale_set_name","description":"VM scale set name","type":"text","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_tags","description":"Azure instance tags.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"vm_id","description":"Unique identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"The tag key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"The tag value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"background_activities_moderator","description":"Background Activities Moderator (BAM) tracks application execution.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"battery","description":"Provides information about the internal battery of a Macbook.","platforms":["darwin"],"columns":[{"name":"manufacturer","description":"The battery manufacturer's name","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacture_date","description":"The date the battery was manufactured UNIX Epoch","type":"integer","hidden":false,"required":false,"index":false},{"name":"model","description":"The battery's model number","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The battery's unique serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"cycle_count","description":"The number of charge/discharge cycles","type":"integer","hidden":false,"required":false,"index":false},{"name":"health","description":"One of the following: \"Good\" describes a well-performing battery, \"Fair\" describes a functional battery with limited capacity, or \"Poor\" describes a battery that's not capable of providing power","type":"text","hidden":false,"required":false,"index":false},{"name":"condition","description":"One of the following: \"Normal\" indicates the condition of the battery is within normal tolerances, \"Service Needed\" indicates that the battery should be checked out by a licensed Mac repair service, \"Permanent Failure\" indicates the battery needs replacement","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"One of the following: \"AC Power\" indicates the battery is connected to an external power source, \"Battery Power\" indicates that the battery is drawing internal power, \"Off Line\" indicates the battery is off-line or no longer connected","type":"text","hidden":false,"required":false,"index":false},{"name":"charging","description":"1 if the battery is currently being charged by a power source. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"charged","description":"1 if the battery is currently completely charged. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"designed_capacity","description":"The battery's designed capacity in mAh","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"The battery's actual capacity when it is fully charged in mAh","type":"integer","hidden":false,"required":false,"index":false},{"name":"current_capacity","description":"The battery's current charged capacity in mAh","type":"integer","hidden":false,"required":false,"index":false},{"name":"percent_remaining","description":"The percentage of battery remaining before it is drained","type":"integer","hidden":false,"required":false,"index":false},{"name":"amperage","description":"The battery's current amperage in mA","type":"integer","hidden":false,"required":false,"index":false},{"name":"voltage","description":"The battery's current voltage in mV","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes_until_empty","description":"The number of minutes until the battery is fully depleted. This value is -1 if this time is still being calculated","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes_to_full_charge","description":"The number of minutes until the battery is fully charged. This value is -1 if this time is still being calculated","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"bitlocker_info","description":"Retrieve bitlocker status of the machine.","platforms":["windows"],"columns":[{"name":"device_id","description":"ID of the encrypted drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"Drive letter of the encrypted drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"persistent_volume_id","description":"Persistent ID of the drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"conversion_status","description":"The bitlocker conversion status of the drive.","type":"integer","hidden":false,"required":false,"index":false},{"name":"protection_status","description":"The bitlocker protection status of the drive.","type":"integer","hidden":false,"required":false,"index":false},{"name":"encryption_method","description":"The encryption type of the device.","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The FVE metadata version of the drive.","type":"integer","hidden":false,"required":false,"index":false},{"name":"percentage_encrypted","description":"The percentage of the drive that is encrypted.","type":"integer","hidden":false,"required":false,"index":false},{"name":"lock_status","description":"The accessibility status of the drive from Windows.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"block_devices","description":"Block (buffered access) device file nodes: disks, ramdisks, and DMG containers.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Block device name","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Block device parent name","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Block device vendor string","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"Block device model string identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Block device size in blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Block device Universally Unique Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Block device type string","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"Block device label string","type":"text","hidden":false,"required":false,"index":false}]},{"name":"bpf_process_events","description":"Track time/action process executions.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Binary path","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments","type":"text","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","hidden":false,"required":false,"index":false},{"name":"json_cmdline","description":"Command line arguments, in JSON format","type":"text","hidden":true,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"bpf_socket_events","description":"Track network socket opens and closes.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"The socket type","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","hidden":false,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"browser_plugins","description":"All C/NPAPI browser plugin details for all users.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the plugin","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Plugin display name","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Plugin identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Plugin short version","type":"text","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Build SDK used to compile plugin","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Plugin description text","type":"text","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Plugin language-localization","type":"text","hidden":false,"required":false,"index":false},{"name":"native","description":"Plugin requires native execution","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","hidden":false,"required":false,"index":false},{"name":"disabled","description":"Is the plugin disabled. 1 = Disabled","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"carbon_black_info","description":"Returns info about a Carbon Black sensor install.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"sensor_id","description":"Sensor ID of the Carbon Black sensor","type":"integer","hidden":false,"required":false,"index":false},{"name":"config_name","description":"Sensor group","type":"text","hidden":false,"required":false,"index":false},{"name":"collect_store_files","description":"If the sensor is configured to send back binaries to the Carbon Black server","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_module_loads","description":"If the sensor is configured to capture module loads","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_module_info","description":"If the sensor is configured to collect metadata of binaries","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_file_mods","description":"If the sensor is configured to collect file modification events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_reg_mods","description":"If the sensor is configured to collect registry modification events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_net_conns","description":"If the sensor is configured to collect network connections","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_processes","description":"If the sensor is configured to process events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_cross_processes","description":"If the sensor is configured to cross process events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_emet_events","description":"If the sensor is configured to EMET events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_data_file_writes","description":"If the sensor is configured to collect non binary file writes","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_process_user_context","description":"If the sensor is configured to collect the user running a process","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_sensor_operations","description":"Unknown","type":"integer","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_mb","description":"Event file disk quota in MB","type":"integer","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_percentage","description":"Event file disk quota in a percentage","type":"integer","hidden":false,"required":false,"index":false},{"name":"protection_disabled","description":"If the sensor is configured to report tamper events","type":"integer","hidden":false,"required":false,"index":false},{"name":"sensor_ip_addr","description":"IP address of the sensor","type":"text","hidden":false,"required":false,"index":false},{"name":"sensor_backend_server","description":"Carbon Black server","type":"text","hidden":false,"required":false,"index":false},{"name":"event_queue","description":"Size in bytes of Carbon Black event files on disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"binary_queue","description":"Size in bytes of binaries waiting to be sent to Carbon Black server","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"carves","description":"List the set of completed and in-progress carves. If carve=1 then the query is treated as a new carve request.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"time","description":"Time at which the carve was kicked off","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sha256","description":"A SHA256 sum of the carved archive","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the carved archive","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the requested carve","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the carve, can be STARTING, PENDING, SUCCESS, or FAILED","type":"text","hidden":false,"required":false,"index":false},{"name":"carve_guid","description":"Identifying value of the carve session","type":"text","hidden":false,"required":false,"index":false},{"name":"request_id","description":"Identifying value of the carve request (e.g., scheduled query name, distributed request, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"carve","description":"Set this value to '1' to start a file carve","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"certificates","description":"Certificate Authorities installed in Keychains/ca-bundles.","platforms":["darwin","windows"],"columns":[{"name":"common_name","description":"Certificate CommonName","type":"text","hidden":false,"required":false,"index":false},{"name":"subject","description":"Certificate distinguished name","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer","description":"Certificate issuer distinguished name","type":"text","hidden":false,"required":false,"index":false},{"name":"ca","description":"1 if CA: true (certificate is an authority) else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"self_signed","description":"1 if self-signed, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"not_valid_before","description":"Lower bound of valid date","type":"text","hidden":false,"required":false,"index":false},{"name":"not_valid_after","description":"Certificate expiration data","type":"text","hidden":false,"required":false,"index":false},{"name":"signing_algorithm","description":"Signing algorithm used","type":"text","hidden":false,"required":false,"index":false},{"name":"key_algorithm","description":"Key algorithm used","type":"text","hidden":false,"required":false,"index":false},{"name":"key_strength","description":"Key size used for RSA/DSA, or curve name","type":"text","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Certificate key usage and extended key usage","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_key_id","description":"SKID an optionally included SHA1","type":"text","hidden":false,"required":false,"index":false},{"name":"authority_key_id","description":"AKID an optionally included SHA1","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the raw certificate contents","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Keychain or PEM bundle","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"Certificate serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"sid","description":"SID","type":"text","hidden":true,"required":false,"index":false},{"name":"store_location","description":"Certificate system store location","type":"text","hidden":true,"required":false,"index":false},{"name":"store","description":"Certificate system store","type":"text","hidden":true,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":true,"required":false,"index":false},{"name":"store_id","description":"Exists for service/user stores. Contains raw store id provided by WinAPI.","type":"text","hidden":true,"required":false,"index":false}]},{"name":"chassis_info","description":"Display information pertaining to the chassis and its security status.","platforms":["windows"],"columns":[{"name":"audible_alarm","description":"If TRUE, the frame is equipped with an audible alarm.","type":"text","hidden":false,"required":false,"index":false},{"name":"breach_description","description":"If provided, gives a more detailed description of a detected security breach.","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_types","description":"A comma-separated list of chassis types, such as Desktop or Laptop.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"An extended description of the chassis if available.","type":"text","hidden":false,"required":false,"index":false},{"name":"lock","description":"If TRUE, the frame is equipped with a lock.","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"security_breach","description":"The physical status of the chassis such as Breach Successful, Breach Attempted, etc.","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"smbios_tag","description":"The assigned asset tag number of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"sku","description":"The Stock Keeping Unit number if available.","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"If available, gives various operational or nonoperational statuses such as OK, Degraded, and Pred Fail.","type":"text","hidden":false,"required":false,"index":false},{"name":"visible_alarm","description":"If TRUE, the frame is equipped with a visual alarm.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"chocolatey_packages","description":"Chocolatey packages installed in a system.","platforms":["windows"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this package resides","type":"text","hidden":false,"required":false,"index":false}]},{"name":"chrome_extension_content_scripts","description":"Chrome browser extension content scripts.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave)","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"script","description":"The content script used by the extension","type":"text","hidden":false,"required":false,"index":false},{"name":"match","description":"The pattern that the script is matched against","type":"text","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"chrome_extensions","description":"Chrome-based browser extensions.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave, edge, edge_beta)","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension display name","type":"text","hidden":false,"required":false,"index":false},{"name":"profile","description":"The name of the Chrome profile that contains this extension","type":"text","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","hidden":false,"required":false,"index":false},{"name":"referenced_identifier","description":"Extension identifier, as specified by the preferences file. Empty if the extension is not in the profile.","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier, computed from its manifest. Empty in case of error.","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Extension-optional description","type":"text","hidden":false,"required":false,"index":false},{"name":"default_locale","description":"Default locale supported by extension","type":"text","hidden":false,"required":false,"index":false},{"name":"current_locale","description":"Current locale supported by extension","type":"text","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","hidden":false,"required":false,"index":false},{"name":"persistent","description":"1 If extension is persistent across all tabs else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions","description":"The permissions required by the extension","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions_json","description":"The JSON-encoded permissions required by the extension","type":"text","hidden":true,"required":false,"index":false},{"name":"optional_permissions","description":"The permissions optionally required by the extensions","type":"text","hidden":false,"required":false,"index":false},{"name":"optional_permissions_json","description":"The JSON-encoded permissions optionally required by the extensions","type":"text","hidden":true,"required":false,"index":false},{"name":"manifest_hash","description":"The SHA256 hash of the manifest.json file","type":"text","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","hidden":false,"required":false,"index":false},{"name":"from_webstore","description":"True if this extension was installed from the web store","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"1 if this extension is enabled","type":"text","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Extension install time, in its original Webkit format","type":"text","hidden":false,"required":false,"index":false},{"name":"install_timestamp","description":"Extension install time, converted to unix time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"manifest_json","description":"The manifest file of the extension","type":"text","hidden":true,"required":false,"index":false},{"name":"key","description":"The extension key, from the manifest file","type":"text","hidden":true,"required":false,"index":false}]},{"name":"connectivity","description":"Provides the overall system's network state.","platforms":["windows"],"columns":[{"name":"disconnected","description":"True if the all interfaces are not connected to any network","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_no_traffic","description":"True if any interface is connected via IPv4, but has seen no traffic","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_no_traffic","description":"True if any interface is connected via IPv6, but has seen no traffic","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_subnet","description":"True if any interface is connected to the local subnet via IPv4","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_local_network","description":"True if any interface is connected to a routed network via IPv4","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_internet","description":"True if any interface is connected to the Internet via IPv4","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_subnet","description":"True if any interface is connected to the local subnet via IPv6","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_local_network","description":"True if any interface is connected to a routed network via IPv6","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_internet","description":"True if any interface is connected to the Internet via IPv6","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"cpu_info","description":"Retrieve cpu hardware info of the machine.","platforms":["windows"],"columns":[{"name":"device_id","description":"The DeviceID of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"processor_type","description":"The processor type, such as Central, Math, or Video.","type":"text","hidden":false,"required":false,"index":false},{"name":"availability","description":"The availability and status of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_status","description":"The current operating status of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"number_of_cores","description":"The number of cores of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"logical_processors","description":"The number of logical processors of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"address_width","description":"The width of the CPU address bus.","type":"text","hidden":false,"required":false,"index":false},{"name":"current_clock_speed","description":"The current frequency of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_clock_speed","description":"The maximum possible frequency of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"socket_designation","description":"The assigned socket on the board for the given CPU.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"cpu_time","description":"Displays information from /proc/stat file about the time the cpu cores spent in different parts of the system.","platforms":["darwin","linux"],"columns":[{"name":"core","description":"Name of the cpu (core)","type":"integer","hidden":false,"required":false,"index":false},{"name":"user","description":"Time spent in user mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"nice","description":"Time spent in user mode with low priority (nice)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system","description":"Time spent in system mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"idle","description":"Time spent in the idle task","type":"bigint","hidden":false,"required":false,"index":false},{"name":"iowait","description":"Time spent waiting for I/O to complete","type":"bigint","hidden":false,"required":false,"index":false},{"name":"irq","description":"Time spent servicing interrupts","type":"bigint","hidden":false,"required":false,"index":false},{"name":"softirq","description":"Time spent servicing softirqs","type":"bigint","hidden":false,"required":false,"index":false},{"name":"steal","description":"Time spent in other operating systems when running in a virtualized environment","type":"bigint","hidden":false,"required":false,"index":false},{"name":"guest","description":"Time spent running a virtual CPU for a guest OS under the control of the Linux kernel","type":"bigint","hidden":false,"required":false,"index":false},{"name":"guest_nice","description":"Time spent running a niced guest ","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"cpuid","description":"Useful CPU features from the cpuid ASM call.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"feature","description":"Present feature flags","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Bit value or string","type":"text","hidden":false,"required":false,"index":false},{"name":"output_register","description":"Register used to for feature value","type":"text","hidden":false,"required":false,"index":false},{"name":"output_bit","description":"Bit in register value for feature value","type":"integer","hidden":false,"required":false,"index":false},{"name":"input_eax","description":"Value of EAX used","type":"text","hidden":false,"required":false,"index":false}]},{"name":"crashes","description":"Application, System, and Mobile App crash logs.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of crash log","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID of the crashed process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Location of log file","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Identifier of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version info of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent PID of the crashed process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"responsible","description":"Process responsible for the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the crashed process","type":"integer","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Date/Time at which the crash occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"crashed_thread","description":"Thread ID which crashed","type":"bigint","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Most recent frame from the stack trace","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_type","description":"Exception type of the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_codes","description":"Exception codes from the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_notes","description":"Exception notes from the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"registers","description":"The value of the system registers","type":"text","hidden":false,"required":false,"index":false}]},{"name":"crontab","description":"Line parsed values from system and user cron/tab.","platforms":["darwin","linux"],"columns":[{"name":"event","description":"The job @event name (rare)","type":"text","hidden":false,"required":false,"index":false},{"name":"minute","description":"The exact minute for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"hour","description":"The hour of the day for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"day_of_month","description":"The day of the month for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"month","description":"The month of the year for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"day_of_week","description":"The day of the week for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"command","description":"Raw command string","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"File parsed","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"cups_destinations","description":"Returns all configured printers.","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the printer","type":"text","hidden":false,"required":false,"index":false},{"name":"option_name","description":"Option name","type":"text","hidden":false,"required":false,"index":false},{"name":"option_value","description":"Option value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"cups_jobs","description":"Returns all completed print jobs from cups.","platforms":["darwin"],"columns":[{"name":"title","description":"Title of the printed job","type":"text","hidden":false,"required":false,"index":false},{"name":"destination","description":"The printer the job was sent to","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"The user who printed the job","type":"text","hidden":false,"required":false,"index":false},{"name":"format","description":"The format of the print job","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the print job","type":"integer","hidden":false,"required":false,"index":false},{"name":"completed_time","description":"When the job completed printing","type":"integer","hidden":false,"required":false,"index":false},{"name":"processing_time","description":"How long the job took to process","type":"integer","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the print request was initiated","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"curl","description":"Perform an http request and return stats about it.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"url","description":"The url for the request","type":"text","hidden":false,"required":true,"index":false},{"name":"method","description":"The HTTP method for the request","type":"text","hidden":false,"required":false,"index":false},{"name":"user_agent","description":"The user-agent string to use for the request","type":"text","hidden":false,"required":false,"index":false},{"name":"response_code","description":"The HTTP status code for the response","type":"integer","hidden":false,"required":false,"index":false},{"name":"round_trip_time","description":"Time taken to complete the request","type":"bigint","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of bytes in the response","type":"bigint","hidden":false,"required":false,"index":false},{"name":"result","description":"The HTTP response body","type":"text","hidden":false,"required":false,"index":false}]},{"name":"curl_certificate","description":"Inspect TLS certificates by connecting to input hostnames.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"hostname","description":"Hostname (domain[:port]) to CURL","type":"text","hidden":false,"required":true,"index":false},{"name":"common_name","description":"Common name of company issued to","type":"text","hidden":false,"required":false,"index":false},{"name":"organization","description":"Organization issued to","type":"text","hidden":false,"required":false,"index":false},{"name":"organization_unit","description":"Organization unit issued to","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Certificate serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_common_name","description":"Issuer common name","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_organization","description":"Issuer organization","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_organization_unit","description":"Issuer organization unit","type":"text","hidden":false,"required":false,"index":false},{"name":"valid_from","description":"Period of validity start date","type":"text","hidden":false,"required":false,"index":false},{"name":"valid_to","description":"Period of validity end date","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256_fingerprint","description":"SHA-256 fingerprint","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1_fingerprint","description":"SHA1 fingerprint","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version Number","type":"integer","hidden":false,"required":false,"index":false},{"name":"signature_algorithm","description":"Signature Algorithm","type":"text","hidden":false,"required":false,"index":false},{"name":"signature","description":"Signature","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_key_identifier","description":"Subject Key Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"authority_key_identifier","description":"Authority Key Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Usage of key in certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"extended_key_usage","description":"Extended usage of key in certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"policies","description":"Certificate Policies","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_alternative_names","description":"Subject Alternative Name","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_alternative_names","description":"Issuer Alternative Name","type":"text","hidden":false,"required":false,"index":false},{"name":"info_access","description":"Authority Information Access","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_info_access","description":"Subject Information Access","type":"text","hidden":false,"required":false,"index":false},{"name":"policy_mappings","description":"Policy Mappings","type":"text","hidden":false,"required":false,"index":false},{"name":"has_expired","description":"1 if the certificate has expired, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"basic_constraint","description":"Basic Constraints","type":"text","hidden":false,"required":false,"index":false},{"name":"name_constraints","description":"Name Constraints","type":"text","hidden":false,"required":false,"index":false},{"name":"policy_constraints","description":"Policy Constraints","type":"text","hidden":false,"required":false,"index":false},{"name":"dump_certificate","description":"Set this value to '1' to dump certificate","type":"integer","hidden":true,"required":false,"index":false},{"name":"timeout","description":"Set this value to the timeout in seconds to complete the TLS handshake (default 4s, use 0 for no timeout)","type":"integer","hidden":true,"required":false,"index":false},{"name":"pem","description":"Certificate PEM format","type":"text","hidden":false,"required":false,"index":false}]},{"name":"deb_packages","description":"The installed DEB package database.","platforms":["linux"],"columns":[{"name":"name","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Package source","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"arch","description":"Package architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"revision","description":"Package revision","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Package status","type":"text","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Package maintainer","type":"text","hidden":false,"required":false,"index":false},{"name":"section","description":"Package section","type":"text","hidden":false,"required":false,"index":false},{"name":"priority","description":"Package priority","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"default_environment","description":"Default environment variables and values.","platforms":["windows"],"columns":[{"name":"variable","description":"Name of the environment variable","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the environment variable","type":"text","hidden":false,"required":false,"index":false},{"name":"expand","description":"1 if the variable needs expanding, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"device_file","description":"Similar to the file table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number","type":"text","hidden":false,"required":true,"index":false},{"name":"path","description":"A logical path within the device node","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Creation time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","hidden":false,"required":false,"index":false}]},{"name":"device_firmware","description":"A best-effort list of discovered firmware versions.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of device","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"The device name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Firmware version","type":"text","hidden":false,"required":false,"index":false}]},{"name":"device_hash","description":"Similar to the hash table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number","type":"text","hidden":false,"required":true,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided inode data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided inode data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided inode data","type":"text","hidden":false,"required":false,"index":false}]},{"name":"device_partitions","description":"Use TSK to enumerate details about partitions on a disk device.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number or description","type":"integer","hidden":false,"required":false,"index":false},{"name":"label","description":"","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Byte size of each block","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Number of blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Number of meta nodes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flags","description":"","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"disk_encryption","description":"Disk encryption status and information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Disk name","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Disk Universally Unique Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"encrypted","description":"1 If encrypted: true (disk is encrypted), else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Description of cipher type and mode if available","type":"text","hidden":false,"required":false,"index":false},{"name":"encryption_status","description":"Disk encryption status with one of following values: encrypted | not encrypted | undefined","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Currently authenticated user if available","type":"text","hidden":false,"required":false,"index":false},{"name":"user_uuid","description":"UUID of authenticated user if available","type":"text","hidden":false,"required":false,"index":false},{"name":"filevault_status","description":"FileVault status with one of following values: on | off | unknown","type":"text","hidden":false,"required":false,"index":false}]},{"name":"disk_events","description":"Track DMG disk image events (appearance/disappearance) when opened.","platforms":["darwin"],"columns":[{"name":"action","description":"Appear or disappear","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the DMG file accessed","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Disk event name","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"Disk event BSD name","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"UUID of the volume inside DMG if available","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of partition in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ejectable","description":"1 if ejectable, 0 if not","type":"integer","hidden":false,"required":false,"index":false},{"name":"mountable","description":"1 if mountable, 0 if not","type":"integer","hidden":false,"required":false,"index":false},{"name":"writable","description":"1 if writable, 0 if not","type":"integer","hidden":false,"required":false,"index":false},{"name":"content","description":"Disk event content","type":"text","hidden":false,"required":false,"index":false},{"name":"media_name","description":"Disk event media name string","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Disk event vendor string","type":"text","hidden":false,"required":false,"index":false},{"name":"filesystem","description":"Filesystem if available","type":"text","hidden":false,"required":false,"index":false},{"name":"checksum","description":"UDIF Master checksum if available (CRC32)","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of appearance/disappearance in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"disk_info","description":"Retrieve basic information about the physical disks of a system.","platforms":["windows"],"columns":[{"name":"partitions","description":"Number of detected partitions on disk.","type":"integer","hidden":false,"required":false,"index":false},{"name":"disk_index","description":"Physical drive number of the disk.","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"The interface type of the disk.","type":"text","hidden":false,"required":false,"index":false},{"name":"id","description":"The unique identifier of the drive on the system.","type":"text","hidden":false,"required":false,"index":false},{"name":"pnp_device_id","description":"The unique identifier of the drive on the system.","type":"text","hidden":false,"required":false,"index":false},{"name":"disk_size","description":"Size of the disk.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the disk.","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hard drive model.","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"The label of the disk object.","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the disk.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"The OS's description of the disk.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"dns_cache","description":"Enumerate the DNS cache using the undocumented DnsGetCacheDataTable function in dnsapi.dll.","platforms":["windows"],"columns":[{"name":"name","description":"DNS record name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"DNS record type","type":"text","hidden":false,"required":false,"index":false},{"name":"flags","description":"DNS record flags","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"dns_resolvers","description":"Resolvers used by this host.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Address type index or order","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Address type: sortlist, nameserver, search","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Resolver IP/IPv6 address","type":"text","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Address (sortlist) netmask length","type":"text","hidden":false,"required":false,"index":false},{"name":"options","description":"Resolver options","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"docker_container_fs_changes","description":"Changes to files or directories on container's filesystem.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":true,"index":false},{"name":"path","description":"FIle or directory path relative to rootfs","type":"text","hidden":false,"required":false,"index":false},{"name":"change_type","description":"Type of change: C:Modified, A:Added, D:Deleted","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_labels","description":"Docker container labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_mounts","description":"Docker container mounts.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of mount (bind, volume)","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Optional mount name","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source path on host","type":"text","hidden":false,"required":false,"index":false},{"name":"destination","description":"Destination path inside container","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver providing the mount","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"Mount options (rw, ro)","type":"text","hidden":false,"required":false,"index":false},{"name":"rw","description":"1 if read/write. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"propagation","description":"Mount propagation","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_networks","description":"Docker container networks.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Network name","type":"text","hidden":false,"required":false,"index":false},{"name":"network_id","description":"Network ID","type":"text","hidden":false,"required":false,"index":false},{"name":"endpoint_id","description":"Endpoint ID","type":"text","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Gateway","type":"text","hidden":false,"required":false,"index":false},{"name":"ip_address","description":"IP address","type":"text","hidden":false,"required":false,"index":false},{"name":"ip_prefix_len","description":"IP subnet prefix length","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_gateway","description":"IPv6 gateway","type":"text","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","hidden":false,"required":false,"index":false},{"name":"ipv6_prefix_len","description":"IPv6 subnet prefix length","type":"integer","hidden":false,"required":false,"index":false},{"name":"mac_address","description":"MAC address","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_ports","description":"Docker container ports.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Protocol (tcp, udp)","type":"text","hidden":false,"required":false,"index":false},{"name":"port","description":"Port inside the container","type":"integer","hidden":false,"required":false,"index":false},{"name":"host_ip","description":"Host IP address on which public port is listening","type":"text","hidden":false,"required":false,"index":false},{"name":"host_port","description":"Host port","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"docker_container_processes","description":"Docker container processes.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":true,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start in seconds since boot (non-sleeping)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"user","description":"User name","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Cumulative CPU time. [DD-]HH:MM:SS format","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu","description":"CPU utilization as percentage","type":"double","hidden":false,"required":false,"index":false},{"name":"mem","description":"Memory utilization as percentage","type":"double","hidden":false,"required":false,"index":false}]},{"name":"docker_container_stats","description":"Docker container statistics. Queries on this table take at least one second.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":true,"index":false},{"name":"name","description":"Container name","type":"text","hidden":false,"required":false,"index":false},{"name":"pids","description":"Number of processes","type":"integer","hidden":false,"required":false,"index":false},{"name":"read","description":"UNIX time when stats were read","type":"bigint","hidden":false,"required":false,"index":false},{"name":"preread","description":"UNIX time when stats were last read","type":"bigint","hidden":false,"required":false,"index":false},{"name":"interval","description":"Difference between read and preread in nano-seconds","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_read","description":"Total disk read bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_write","description":"Total disk write bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"num_procs","description":"Number of processors","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_total_usage","description":"Total CPU usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_kernelmode_usage","description":"CPU kernel mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_usermode_usage","description":"CPU user mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_cpu_usage","description":"CPU system usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"online_cpus","description":"Online CPUs","type":"integer","hidden":false,"required":false,"index":false},{"name":"pre_cpu_total_usage","description":"Last read total CPU usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_cpu_kernelmode_usage","description":"Last read CPU kernel mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_cpu_usermode_usage","description":"Last read CPU user mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_system_cpu_usage","description":"Last read CPU system usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_online_cpus","description":"Last read online CPUs","type":"integer","hidden":false,"required":false,"index":false},{"name":"memory_usage","description":"Memory usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"memory_max_usage","description":"Memory maximum usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"Memory limit","type":"bigint","hidden":false,"required":false,"index":false},{"name":"network_rx_bytes","description":"Total network bytes read","type":"bigint","hidden":false,"required":false,"index":false},{"name":"network_tx_bytes","description":"Total network bytes transmitted","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"docker_containers","description":"Docker containers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Container name","type":"text","hidden":false,"required":false,"index":false},{"name":"image","description":"Docker image (name) used to launch this container","type":"text","hidden":false,"required":false,"index":false},{"name":"image_id","description":"Docker image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"command","description":"Command with arguments","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"state","description":"Container state (created, restarting, running, removing, paused, exited, dead)","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Container status information","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Identifier of the initial process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Container path","type":"text","hidden":false,"required":false,"index":false},{"name":"config_entrypoint","description":"Container entrypoint(s)","type":"text","hidden":false,"required":false,"index":false},{"name":"started_at","description":"Container start time as string","type":"text","hidden":false,"required":false,"index":false},{"name":"finished_at","description":"Container finish time as string","type":"text","hidden":false,"required":false,"index":false},{"name":"privileged","description":"Is the container privileged","type":"integer","hidden":false,"required":false,"index":false},{"name":"security_options","description":"List of container security options","type":"text","hidden":false,"required":false,"index":false},{"name":"env_variables","description":"Container environmental variables","type":"text","hidden":false,"required":false,"index":false},{"name":"readonly_rootfs","description":"Is the root filesystem mounted as read only","type":"integer","hidden":false,"required":false,"index":false},{"name":"cgroup_namespace","description":"cgroup namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"ipc_namespace","description":"IPC namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"mnt_namespace","description":"Mount namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"net_namespace","description":"Network namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"pid_namespace","description":"PID namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"user_namespace","description":"User namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"uts_namespace","description":"UTS namespace","type":"text","hidden":true,"required":false,"index":false}]},{"name":"docker_image_history","description":"Docker image history information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of instruction in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"created_by","description":"Created by instruction","type":"text","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of tags","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Instruction comment","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_image_labels","description":"Docker image labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_image_layers","description":"Docker image layers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"layer_id","description":"Layer ID","type":"text","hidden":false,"required":false,"index":false},{"name":"layer_order","description":"Layer Order (1 = base layer)","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"docker_images","description":"Docker images information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size_bytes","description":"Size of image in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of repository tags","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_info","description":"Docker system information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Docker system ID","type":"text","hidden":false,"required":false,"index":false},{"name":"containers","description":"Total number of containers","type":"integer","hidden":false,"required":false,"index":false},{"name":"containers_running","description":"Number of containers currently running","type":"integer","hidden":false,"required":false,"index":false},{"name":"containers_paused","description":"Number of containers in paused state","type":"integer","hidden":false,"required":false,"index":false},{"name":"containers_stopped","description":"Number of containers in stopped state","type":"integer","hidden":false,"required":false,"index":false},{"name":"images","description":"Number of images","type":"integer","hidden":false,"required":false,"index":false},{"name":"storage_driver","description":"Storage driver","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"1 if memory limit support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"swap_limit","description":"1 if swap limit support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"kernel_memory","description":"1 if kernel memory limit support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_period","description":"1 if CPU Completely Fair Scheduler (CFS) period support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_quota","description":"1 if CPU Completely Fair Scheduler (CFS) quota support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_shares","description":"1 if CPU share weighting support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_set","description":"1 if CPU set selection support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_forwarding","description":"1 if IPv4 forwarding is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"bridge_nf_iptables","description":"1 if bridge netfilter iptables is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"bridge_nf_ip6tables","description":"1 if bridge netfilter ip6tables is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"oom_kill_disable","description":"1 if Out-of-memory kill is disabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"logging_driver","description":"Logging driver","type":"text","hidden":false,"required":false,"index":false},{"name":"cgroup_driver","description":"Control groups driver","type":"text","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Operating system type","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"cpus","description":"Number of CPUs","type":"integer","hidden":false,"required":false,"index":false},{"name":"memory","description":"Total memory","type":"bigint","hidden":false,"required":false,"index":false},{"name":"http_proxy","description":"HTTP proxy","type":"text","hidden":false,"required":false,"index":false},{"name":"https_proxy","description":"HTTPS proxy","type":"text","hidden":false,"required":false,"index":false},{"name":"no_proxy","description":"Comma-separated list of domain extensions proxy should not be used for","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the docker host","type":"text","hidden":false,"required":false,"index":false},{"name":"server_version","description":"Server version","type":"text","hidden":false,"required":false,"index":false},{"name":"root_dir","description":"Docker root directory","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_network_labels","description":"Docker network labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_networks","description":"Docker networks information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Network name","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Network driver","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"enable_ipv6","description":"1 if IPv6 is enabled on this network. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"subnet","description":"Network subnet","type":"text","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Network gateway","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_version","description":"Docker version information.","platforms":["darwin","linux"],"columns":[{"name":"version","description":"Docker version","type":"text","hidden":false,"required":false,"index":false},{"name":"api_version","description":"API version","type":"text","hidden":false,"required":false,"index":false},{"name":"min_api_version","description":"Minimum API version supported","type":"text","hidden":false,"required":false,"index":false},{"name":"git_commit","description":"Docker build git commit","type":"text","hidden":false,"required":false,"index":false},{"name":"go_version","description":"Go version","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","hidden":false,"required":false,"index":false},{"name":"arch","description":"Hardware architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Build time","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_volume_labels","description":"Docker volume labels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_volumes","description":"Docker volumes information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Volume driver","type":"text","hidden":false,"required":false,"index":false},{"name":"mount_point","description":"Mount point","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Volume type","type":"text","hidden":false,"required":false,"index":false}]},{"name":"drivers","description":"Details for in-use Windows device drivers. This does not display installed but unused drivers.","platforms":["windows"],"columns":[{"name":"device_id","description":"Device ID","type":"text","hidden":false,"required":false,"index":false},{"name":"device_name","description":"Device name","type":"text","hidden":false,"required":false,"index":false},{"name":"image","description":"Path to driver image file","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Driver description","type":"text","hidden":false,"required":false,"index":false},{"name":"service","description":"Driver service name, if one exists","type":"text","hidden":false,"required":false,"index":false},{"name":"service_key","description":"Driver service registry key","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Driver version","type":"text","hidden":false,"required":false,"index":false},{"name":"inf","description":"Associated inf file","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Device/driver class name","type":"text","hidden":false,"required":false,"index":false},{"name":"provider","description":"Driver provider","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Device manufacturer","type":"text","hidden":false,"required":false,"index":false},{"name":"driver_key","description":"Driver key","type":"text","hidden":false,"required":false,"index":false},{"name":"date","description":"Driver date","type":"bigint","hidden":false,"required":false,"index":false},{"name":"signed","description":"Whether the driver is signed or not","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_metadata","description":"EC2 instance metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","hidden":false,"required":false,"index":false},{"name":"instance_type","description":"EC2 instance type","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture of this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"region","description":"AWS region in which this instance launched","type":"text","hidden":false,"required":false,"index":false},{"name":"availability_zone","description":"Availability zone in which this instance launched","type":"text","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Private IPv4 DNS hostname of the first interface of this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"local_ipv4","description":"Private IPv4 address of the first interface of this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address for the first network interface of this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"security_groups","description":"Comma separated list of security group names","type":"text","hidden":false,"required":false,"index":false},{"name":"iam_arn","description":"If there is an IAM role associated with the instance, contains instance profile ARN","type":"text","hidden":false,"required":false,"index":false},{"name":"ami_id","description":"AMI ID used to launch this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"reservation_id","description":"ID of the reservation","type":"text","hidden":false,"required":false,"index":false},{"name":"account_id","description":"AWS account ID which owns this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_tags","description":"EC2 instance tag key value pairs.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Tag key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Tag value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"elf_dynamic","description":"ELF dynamic section information.","platforms":["linux"],"columns":[{"name":"tag","description":"Tag ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"value","description":"Tag value","type":"integer","hidden":false,"required":false,"index":false},{"name":"class","description":"Class (32 or 64)","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_info","description":"ELF file information.","platforms":["linux"],"columns":[{"name":"class","description":"Class type, 32 or 64bit","type":"text","hidden":false,"required":false,"index":false},{"name":"abi","description":"Section type","type":"text","hidden":false,"required":false,"index":false},{"name":"abi_version","description":"Section virtual address in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Offset of section in file","type":"text","hidden":false,"required":false,"index":false},{"name":"machine","description":"Machine type","type":"integer","hidden":false,"required":false,"index":false},{"name":"version","description":"Object file version","type":"integer","hidden":false,"required":false,"index":false},{"name":"entry","description":"Entry point address","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flags","description":"ELF header flags","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_sections","description":"ELF section information.","platforms":["linux"],"columns":[{"name":"name","description":"Section name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Section type","type":"integer","hidden":false,"required":false,"index":false},{"name":"vaddr","description":"Section virtual address in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"offset","description":"Offset of section in file","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of section","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"Section attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"link","description":"Link to other section","type":"text","hidden":false,"required":false,"index":false},{"name":"align","description":"Segment alignment","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_segments","description":"ELF segment information.","platforms":["linux"],"columns":[{"name":"name","description":"Segment type/name","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"Segment offset in file","type":"integer","hidden":false,"required":false,"index":false},{"name":"vaddr","description":"Segment virtual address in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"psize","description":"Size of segment in file","type":"integer","hidden":false,"required":false,"index":false},{"name":"msize","description":"Segment offset in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"Segment attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"align","description":"Segment alignment","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_symbols","description":"ELF symbol list.","platforms":["linux"],"columns":[{"name":"name","description":"Symbol name","type":"text","hidden":false,"required":false,"index":false},{"name":"addr","description":"Symbol address (value)","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of object","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Symbol type","type":"text","hidden":false,"required":false,"index":false},{"name":"binding","description":"Binding type","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"Section table index","type":"integer","hidden":false,"required":false,"index":false},{"name":"table","description":"Table name containing symbol","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"es_process_events","description":"Process execution events from EndpointSecurity.","platforms":["darwin"],"columns":[{"name":"version","description":"Version of EndpointSecurity event","type":"integer","hidden":false,"required":false,"index":false},{"name":"seq_num","description":"Per event sequence number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"global_seq_num","description":"Global sequence number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"original_parent","description":"Original parent process ID in case of reparenting","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline_count","description":"Number of command line arguments","type":"bigint","hidden":false,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","hidden":false,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective User ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective Group ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false},{"name":"signing_id","description":"Signature identifier of the process","type":"text","hidden":false,"required":false,"index":false},{"name":"team_id","description":"Team identifier of thd process","type":"text","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Codesigning hash of the process","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_binary","description":"Indicates if the binary is Apple signed binary (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of a process in case of an exit event","type":"integer","hidden":false,"required":false,"index":false},{"name":"child_pid","description":"Process ID of a child process in case of a fork event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"event_type","description":"Type of EndpointSecurity event","type":"text","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"etc_hosts","description":"Line-parsed /etc/hosts.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"address","description":"IP address mapping","type":"text","hidden":false,"required":false,"index":false},{"name":"hostnames","description":"Raw hosts mapping","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"etc_protocols","description":"Line-parsed /etc/protocols.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Protocol name","type":"text","hidden":false,"required":false,"index":false},{"name":"number","description":"Protocol number","type":"integer","hidden":false,"required":false,"index":false},{"name":"alias","description":"Protocol alias","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Comment with protocol description","type":"text","hidden":false,"required":false,"index":false}]},{"name":"etc_services","description":"Line-parsed /etc/services.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Service name","type":"text","hidden":false,"required":false,"index":false},{"name":"port","description":"Service port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"text","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Optional space separated list of other names for a service","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional comment for a service.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"event_taps","description":"Returns information about installed event taps.","platforms":["darwin"],"columns":[{"name":"enabled","description":"Is the Event Tap enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"event_tap_id","description":"Unique ID for the Tap","type":"integer","hidden":false,"required":false,"index":false},{"name":"event_tapped","description":"The mask that identifies the set of events to be observed.","type":"text","hidden":false,"required":false,"index":false},{"name":"process_being_tapped","description":"The process ID of the target application","type":"integer","hidden":false,"required":false,"index":false},{"name":"tapping_process","description":"The process ID of the application that created the event tap.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"example","description":"This is an example table spec.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Description for name column","type":"text","hidden":false,"required":false,"index":false},{"name":"points","description":"This is a signed SQLite int column","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"This is a signed SQLite bigint column","type":"bigint","hidden":false,"required":false,"index":false},{"name":"action","description":"Action performed in generation","type":"text","hidden":false,"required":true,"index":false},{"name":"id","description":"An index of some sort","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of example","type":"text","hidden":false,"required":false,"index":false}]},{"name":"extended_attributes","description":"Returns the extended attributes for files (similar to Windows ADS).","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute file path","type":"text","hidden":false,"required":true,"index":false},{"name":"directory","description":"Directory of file(s)","type":"text","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the value generated from the extended attribute","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"The parsed information from the attribute","type":"text","hidden":false,"required":false,"index":false},{"name":"base64","description":"1 if the value is base64 encoded else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"fan_speed_sensors","description":"Fan speeds.","platforms":["darwin"],"columns":[{"name":"fan","description":"Fan number","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Fan name","type":"text","hidden":false,"required":false,"index":false},{"name":"actual","description":"Actual speed","type":"integer","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimum speed","type":"integer","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum speed","type":"integer","hidden":false,"required":false,"index":false},{"name":"target","description":"Target speed","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"fbsd_kmods","description":"Loaded FreeBSD kernel modules.","platforms":["freebsd"],"columns":[{"name":"name","description":"Module name","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of module content","type":"integer","hidden":false,"required":false,"index":false},{"name":"refs","description":"Module reverse dependencies","type":"integer","hidden":false,"required":false,"index":false},{"name":"address","description":"Kernel module address","type":"text","hidden":false,"required":false,"index":false}]},{"name":"file","description":"Interactive filesystem attributes and metadata.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"path","description":"Absolute file path","type":"text","hidden":false,"required":true,"index":false},{"name":"directory","description":"Directory of file(s)","type":"text","hidden":false,"required":true,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"Device ID (optional)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"btime","description":"(B)irth or (cr)eate time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","hidden":false,"required":false,"index":false},{"name":"symlink","description":"1 if the path is a symlink, otherwise 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","hidden":false,"required":false,"index":false},{"name":"attributes","description":"File attrib string. See: https://ss64.com/nt/attrib.html","type":"text","hidden":true,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number","type":"text","hidden":true,"required":false,"index":false},{"name":"file_id","description":"file ID","type":"text","hidden":true,"required":false,"index":false},{"name":"file_version","description":"File version","type":"text","hidden":true,"required":false,"index":false},{"name":"product_version","description":"File product version","type":"text","hidden":true,"required":false,"index":false},{"name":"bsd_flags","description":"The BSD file flags (chflags). Possible values: NODUMP, UF_IMMUTABLE, UF_APPEND, OPAQUE, HIDDEN, ARCHIVED, SF_IMMUTABLE, SF_APPEND","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"file_events","description":"Track time/action changes to files specified in configuration data.","platforms":["darwin","linux"],"columns":[{"name":"target_path","description":"The path associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file defined in the config","type":"text","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"md5","description":"The MD5 of the file after change","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"The SHA1 of the file after change","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256","description":"The SHA256 of the file after change","type":"text","hidden":false,"required":false,"index":false},{"name":"hashed","description":"1 if the file was hashed, 0 if not, -1 if hashing failed","type":"integer","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"firefox_addons","description":"Firefox browser extensions, webapps, and addons.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"The local user that owns the addon","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Addon display name","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Addon identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"creator","description":"Addon-supported creator string","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Extension, addon, webapp","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Addon-supplied version string","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Addon-supplied description string","type":"text","hidden":false,"required":false,"index":false},{"name":"source_url","description":"URL that installed the addon","type":"text","hidden":false,"required":false,"index":false},{"name":"visible","description":"1 If the addon is shown in browser else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If the addon is active else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 If the addon is application-disabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"1 If the addon applies background updates else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"native","description":"1 If the addon includes binary components else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"location","description":"Global, profile location","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper","description":"OS X Gatekeeper Details.","platforms":["darwin"],"columns":[{"name":"assessments_enabled","description":"1 If a Gatekeeper is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"dev_id_enabled","description":"1 If a Gatekeeper allows execution from identified developers else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of Gatekeeper's gke.bundle","type":"text","hidden":false,"required":false,"index":false},{"name":"opaque_version","description":"Version of Gatekeeper's gkopaque.bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper_approved_apps","description":"Gatekeeper apps a user has allowed to run.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of executable allowed to run","type":"text","hidden":false,"required":false,"index":false},{"name":"requirement","description":"Code signing requirement language","type":"text","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last change time","type":"double","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"double","hidden":false,"required":false,"index":false}]},{"name":"groups","description":"Local system groups.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","hidden":true,"required":false,"index":false},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","hidden":true,"required":false,"index":false},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"hardware_events","description":"Hardware (PCI/USB/HID) events from UDEV or IOKit.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"Remove, insert, change properties, etc","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Local device path assigned (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of hardware and hardware event","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver claiming the device","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Hardware device vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded Hardware vendor identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"Hardware device model","type":"text","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded Hardware model identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"Device serial (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"revision","description":"Device revision (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of hardware event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"hash","description":"Filesystem hash data.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"directory","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"ssdeep","description":"ssdeep hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"homebrew_packages","description":"The installed homebrew package database.","platforms":["darwin"],"columns":[{"name":"name","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Package install path","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Current 'linked' version","type":"text","hidden":false,"required":false,"index":false},{"name":"prefix","description":"Homebrew install prefix","type":"text","hidden":true,"required":false,"index":false}]},{"name":"hvci_status","description":"Retrieve HVCI info of the machine.","platforms":["windows"],"columns":[{"name":"version","description":"The version number of the Device Guard build.","type":"text","hidden":false,"required":false,"index":false},{"name":"instance_identifier","description":"The instance ID of Device Guard.","type":"text","hidden":false,"required":false,"index":false},{"name":"vbs_status","description":"The status of the virtualization based security settings. Returns UNKNOWN if an error is encountered.","type":"text","hidden":false,"required":false,"index":false},{"name":"code_integrity_policy_enforcement_status","description":"The status of the code integrity policy enforcement settings. Returns UNKNOWN if an error is encountered.","type":"text","hidden":false,"required":false,"index":false},{"name":"umci_policy_status","description":"The status of the User Mode Code Integrity security settings. Returns UNKNOWN if an error is encountered.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ibridge_info","description":"Information about the Apple iBridge hardware controller.","platforms":["darwin"],"columns":[{"name":"boot_uuid","description":"Boot UUID of the iBridge controller","type":"text","hidden":false,"required":false,"index":false},{"name":"coprocessor_version","description":"The manufacturer and chip version","type":"text","hidden":false,"required":false,"index":false},{"name":"firmware_version","description":"The build version of the firmware","type":"text","hidden":false,"required":false,"index":false},{"name":"unique_chip_id","description":"Unique id of the iBridge controller","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ie_extensions","description":"Internet Explorer browser extensions.","platforms":["windows"],"columns":[{"name":"name","description":"Extension display name","type":"text","hidden":false,"required":false,"index":false},{"name":"registry_path","description":"Extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the executable","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executable","type":"text","hidden":false,"required":false,"index":false}]},{"name":"intel_me_info","description":"Intel ME/CSE Info.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"version","description":"Intel ME version","type":"text","hidden":false,"required":false,"index":false}]},{"name":"interface_addresses","description":"Network interfaces and relevant metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for interface","type":"text","hidden":false,"required":false,"index":false},{"name":"mask","description":"Interface netmask","type":"text","hidden":false,"required":false,"index":false},{"name":"broadcast","description":"Broadcast address for the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"point_to_point","description":"PtP address for the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of address. One of dhcp, manual, auto, other, unknown","type":"text","hidden":false,"required":false,"index":false},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","hidden":true,"required":false,"index":false}]},{"name":"interface_details","description":"Detailed information and stats of network interfaces.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC of interface (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Interface type (includes virtual)","type":"integer","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Network MTU","type":"integer","hidden":false,"required":false,"index":false},{"name":"metric","description":"Metric based on the speed of the interface","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags (netdevice) for the device","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipackets","description":"Input packets","type":"bigint","hidden":false,"required":false,"index":false},{"name":"opackets","description":"Output packets","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ibytes","description":"Input bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"obytes","description":"Output bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ierrors","description":"Input errors","type":"bigint","hidden":false,"required":false,"index":false},{"name":"oerrors","description":"Output errors","type":"bigint","hidden":false,"required":false,"index":false},{"name":"idrops","description":"Input drops","type":"bigint","hidden":false,"required":false,"index":false},{"name":"odrops","description":"Output drops","type":"bigint","hidden":false,"required":false,"index":false},{"name":"collisions","description":"Packet Collisions detected","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Time of last device modification (optional)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"link_speed","description":"Interface speed in Mb/s","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pci_slot","description":"PCI slot number","type":"text","hidden":true,"required":false,"index":false},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","hidden":true,"required":false,"index":false},{"name":"description","description":"Short description of the object a one-line string.","type":"text","hidden":true,"required":false,"index":false},{"name":"manufacturer","description":"Name of the network adapter's manufacturer.","type":"text","hidden":true,"required":false,"index":false},{"name":"connection_id","description":"Name of the network connection as it appears in the Network Connections Control Panel program.","type":"text","hidden":true,"required":false,"index":false},{"name":"connection_status","description":"State of the network adapter connection to the network.","type":"text","hidden":true,"required":false,"index":false},{"name":"enabled","description":"Indicates whether the adapter is enabled or not.","type":"integer","hidden":true,"required":false,"index":false},{"name":"physical_adapter","description":"Indicates whether the adapter is a physical or a logical adapter.","type":"integer","hidden":true,"required":false,"index":false},{"name":"speed","description":"Estimate of the current bandwidth in bits per second.","type":"integer","hidden":true,"required":false,"index":false},{"name":"service","description":"The name of the service the network adapter uses.","type":"text","hidden":true,"required":false,"index":false},{"name":"dhcp_enabled","description":"If TRUE, the dynamic host configuration protocol (DHCP) server automatically assigns an IP address to the computer system when establishing a network connection.","type":"integer","hidden":true,"required":false,"index":false},{"name":"dhcp_lease_expires","description":"Expiration date and time for a leased IP address that was assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","hidden":true,"required":false,"index":false},{"name":"dhcp_lease_obtained","description":"Date and time the lease was obtained for the IP address assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","hidden":true,"required":false,"index":false},{"name":"dhcp_server","description":"IP address of the dynamic host configuration protocol (DHCP) server.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_domain","description":"Organization name followed by a period and an extension that indicates the type of organization, such as 'microsoft.com'.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_domain_suffix_search_order","description":"Array of DNS domain suffixes to be appended to the end of host names during name resolution.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_host_name","description":"Host name used to identify the local computer for authentication by some utilities.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_server_search_order","description":"Array of server IP addresses to be used in querying for DNS servers.","type":"text","hidden":true,"required":false,"index":false}]},{"name":"interface_ipv6","description":"IPv6 configuration and stats of network interfaces.","platforms":["darwin","linux"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"hop_limit","description":"Current Hop Limit","type":"integer","hidden":false,"required":false,"index":false},{"name":"forwarding_enabled","description":"Enable IP forwarding","type":"integer","hidden":false,"required":false,"index":false},{"name":"redirect_accept","description":"Accept ICMP redirect messages","type":"integer","hidden":false,"required":false,"index":false},{"name":"rtadv_accept","description":"Accept ICMP Router Advertisement","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"iokit_devicetree","description":"The IOKit registry matching the DeviceTree plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Device node name","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent device registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"device_path","description":"Device tree path","type":"text","hidden":false,"required":false,"index":false},{"name":"service","description":"1 if the device conforms to IOService else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the device is in a busy state else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The device reference count","type":"integer","hidden":false,"required":false,"index":false},{"name":"depth","description":"Device nested depth","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"iokit_registry","description":"The full IOKit registry without selecting a plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Default name of the node","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the node is in a busy state else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The node reference count","type":"integer","hidden":false,"required":false,"index":false},{"name":"depth","description":"Node nested depth","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"iptables","description":"Linux IP packet filtering and NAT tool.","platforms":["linux"],"columns":[{"name":"filter_name","description":"Packet matching filter table name.","type":"text","hidden":false,"required":false,"index":false},{"name":"chain","description":"Size of module content.","type":"text","hidden":false,"required":false,"index":false},{"name":"policy","description":"Policy that applies for this rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"target","description":"Target that applies for this rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Protocol number identification.","type":"integer","hidden":false,"required":false,"index":false},{"name":"src_port","description":"Protocol source port(s).","type":"text","hidden":false,"required":false,"index":false},{"name":"dst_port","description":"Protocol destination port(s).","type":"text","hidden":false,"required":false,"index":false},{"name":"src_ip","description":"Source IP address.","type":"text","hidden":false,"required":false,"index":false},{"name":"src_mask","description":"Source IP address mask.","type":"text","hidden":false,"required":false,"index":false},{"name":"iniface","description":"Input interface for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"iniface_mask","description":"Input interface mask for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"dst_ip","description":"Destination IP address.","type":"text","hidden":false,"required":false,"index":false},{"name":"dst_mask","description":"Destination IP address mask.","type":"text","hidden":false,"required":false,"index":false},{"name":"outiface","description":"Output interface for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"outiface_mask","description":"Output interface mask for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"match","description":"Matching rule that applies.","type":"text","hidden":false,"required":false,"index":false},{"name":"packets","description":"Number of matching packets for this rule.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of matching bytes for this rule.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"kernel_extensions","description":"OS X's kernel extensions, both loaded and within the load search path.","platforms":["darwin"],"columns":[{"name":"idx","description":"Extension load tag or index","type":"integer","hidden":false,"required":false,"index":false},{"name":"refs","description":"Reference count","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Bytes of wired memory used by extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension label","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension version","type":"text","hidden":false,"required":false,"index":false},{"name":"linked_against","description":"Indexes of extensions this extension is linked against","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Optional path to extension bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kernel_info","description":"Basic active kernel information.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"version","description":"Kernel version","type":"text","hidden":false,"required":false,"index":false},{"name":"arguments","description":"Kernel arguments","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Kernel path","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"Kernel device identifier","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kernel_modules","description":"Linux kernel modules both loaded and within the load search path.","platforms":["linux"],"columns":[{"name":"name","description":"Module name","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of module content","type":"bigint","hidden":false,"required":false,"index":false},{"name":"used_by","description":"Module reverse dependencies","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Kernel module status","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Kernel module address","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kernel_panics","description":"System kernel panic logs.","platforms":["darwin"],"columns":[{"name":"path","description":"Location of log file","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Formatted time of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"registers","description":"A space delimited line of register:value pairs","type":"text","hidden":false,"required":false,"index":false},{"name":"frame_backtrace","description":"Backtrace of the crashed module","type":"text","hidden":false,"required":false,"index":false},{"name":"module_backtrace","description":"Modules appearing in the crashed module's backtrace","type":"text","hidden":false,"required":false,"index":false},{"name":"dependencies","description":"Module dependencies existing in crashed module's backtrace","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name corresponding to crashed thread","type":"text","hidden":false,"required":false,"index":false},{"name":"os_version","description":"Version of the operating system","type":"text","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Version of the system kernel","type":"text","hidden":false,"required":false,"index":false},{"name":"system_model","description":"Physical system model, for example 'MacBookPro12,1 (Mac-E43C1C25D4880AD6)'","type":"text","hidden":false,"required":false,"index":false},{"name":"uptime","description":"System uptime at kernel panic in nanoseconds","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_loaded","description":"Last loaded module before panic","type":"text","hidden":false,"required":false,"index":false},{"name":"last_unloaded","description":"Last unloaded module before panic","type":"text","hidden":false,"required":false,"index":false}]},{"name":"keychain_acls","description":"Applications that have ACL entries in the keychain.","platforms":["darwin"],"columns":[{"name":"keychain_path","description":"The path of the keychain","type":"text","hidden":false,"required":false,"index":false},{"name":"authorizations","description":"A space delimited set of authorization attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the authorized application","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"The description included with the ACL entry","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"An optional label tag that may be included with the keychain entry","type":"text","hidden":false,"required":false,"index":false}]},{"name":"keychain_items","description":"Generic details about keychain items.","platforms":["darwin"],"columns":[{"name":"label","description":"Generic item name","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional item description","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional keychain comment","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Data item was created","type":"text","hidden":false,"required":false,"index":false},{"name":"modified","description":"Date of last modification","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Keychain item type (class)","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to keychain containing item","type":"text","hidden":false,"required":false,"index":false}]},{"name":"known_hosts","description":"A line-delimited known_hosts table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local user that owns the known_hosts file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"key","description":"parsed authorized keys line","type":"text","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to known_hosts file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kva_speculative_info","description":"Display kernel virtual address and speculative execution information for the system.","platforms":["windows"],"columns":[{"name":"kva_shadow_enabled","description":"Kernel Virtual Address shadowing is enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"kva_shadow_user_global","description":"User pages are marked as global.","type":"integer","hidden":false,"required":false,"index":false},{"name":"kva_shadow_pcid","description":"Kernel VA PCID flushing optimization is enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"kva_shadow_inv_pcid","description":"Kernel VA INVPCID is enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bp_mitigations","description":"Branch Prediction mitigations are enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bp_system_pol_disabled","description":"Branch Predictions are disabled via system policy.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bp_microcode_disabled","description":"Branch Predictions are disabled due to lack of microcode update.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_spec_ctrl_supported","description":"SPEC_CTRL MSR supported by CPU Microcode.","type":"integer","hidden":false,"required":false,"index":false},{"name":"ibrs_support_enabled","description":"Windows uses IBRS.","type":"integer","hidden":false,"required":false,"index":false},{"name":"stibp_support_enabled","description":"Windows uses STIBP.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_pred_cmd_supported","description":"PRED_CMD MSR supported by CPU Microcode.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"last","description":"System logins and logouts.","platforms":["darwin","linux"],"columns":[{"name":"username","description":"Entry username","type":"text","hidden":false,"required":false,"index":false},{"name":"tty","description":"Entry terminal","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Entry type, according to ut_type types (utmp.h)","type":"integer","hidden":false,"required":false,"index":false},{"name":"type_name","description":"Entry type name, according to ut_type types (utmp.h)","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp","type":"integer","hidden":false,"required":false,"index":false},{"name":"host","description":"Entry hostname","type":"text","hidden":false,"required":false,"index":false}]},{"name":"launchd","description":"LaunchAgents and LaunchDaemons from default search paths.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to daemon or agent plist","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"File name of plist (used by launchd)","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"Daemon or agent service name","type":"text","hidden":false,"required":false,"index":false},{"name":"program","description":"Path to target program","type":"text","hidden":false,"required":false,"index":false},{"name":"run_at_load","description":"Should the program run on launch load","type":"text","hidden":false,"required":false,"index":false},{"name":"keep_alive","description":"Should the process be restarted if killed","type":"text","hidden":false,"required":false,"index":false},{"name":"on_demand","description":"Deprecated key, replaced by keep_alive","type":"text","hidden":false,"required":false,"index":false},{"name":"disabled","description":"Skip loading this daemon or agent on boot","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Run this daemon or agent as this username","type":"text","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Run this daemon or agent as this group","type":"text","hidden":false,"required":false,"index":false},{"name":"stdout_path","description":"Pipe stdout to a target path","type":"text","hidden":false,"required":false,"index":false},{"name":"stderr_path","description":"Pipe stderr to a target path","type":"text","hidden":false,"required":false,"index":false},{"name":"start_interval","description":"Frequency to run in seconds","type":"text","hidden":false,"required":false,"index":false},{"name":"program_arguments","description":"Command line arguments passed to program","type":"text","hidden":false,"required":false,"index":false},{"name":"watch_paths","description":"Key that launches daemon or agent if path is modified","type":"text","hidden":false,"required":false,"index":false},{"name":"queue_directories","description":"Similar to watch_paths but only with non-empty directories","type":"text","hidden":false,"required":false,"index":false},{"name":"inetd_compatibility","description":"Run this daemon or agent as it was launched from inetd","type":"text","hidden":false,"required":false,"index":false},{"name":"start_on_mount","description":"Run daemon or agent every time a filesystem is mounted","type":"text","hidden":false,"required":false,"index":false},{"name":"root_directory","description":"Key used to specify a directory to chroot to before launch","type":"text","hidden":false,"required":false,"index":false},{"name":"working_directory","description":"Key used to specify a directory to chdir to before launch","type":"text","hidden":false,"required":false,"index":false},{"name":"process_type","description":"Key describes the intended purpose of the job","type":"text","hidden":false,"required":false,"index":false}]},{"name":"launchd_overrides","description":"Override keys, per user, for LaunchDaemons and Agents.","platforms":["darwin"],"columns":[{"name":"label","description":"Daemon or agent service name","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Name of the override key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Overridden value","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID applied to the override, 0 applies to all","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to daemon or agent plist","type":"text","hidden":false,"required":false,"index":false}]},{"name":"listening_ports","description":"Processes with listening (bound) network sockets/ports.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"port","description":"Transport layer port","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for bind","type":"text","hidden":false,"required":false,"index":false},{"name":"fd","description":"Socket file descriptor number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path for UNIX domain sockets","type":"text","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","hidden":true,"required":false,"index":false}]},{"name":"lldp_neighbors","description":"LLDP neighbors of interfaces.","platforms":["linux"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"rid","description":"Neighbor chassis index","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_id_type","description":"Neighbor chassis ID type","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_id","description":"Neighbor chassis ID value","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_sysname","description":"CPU brand string, contains vendor and model","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_sys_description","description":"Max number of CPU physical cores","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_bridge_capability_available","description":"Chassis bridge capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_bridge_capability_enabled","description":"Is chassis bridge capability enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_router_capability_available","description":"Chassis router capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_router_capability_enabled","description":"Chassis router capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_repeater_capability_available","description":"Chassis repeater capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_repeater_capability_enabled","description":"Chassis repeater capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_wlan_capability_available","description":"Chassis wlan capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_wlan_capability_enabled","description":"Chassis wlan capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_tel_capability_available","description":"Chassis telephone capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_tel_capability_enabled","description":"Chassis telephone capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_docsis_capability_available","description":"Chassis DOCSIS capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_docsis_capability_enabled","description":"Chassis DOCSIS capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_station_capability_available","description":"Chassis station capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_station_capability_enabled","description":"Chassis station capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_other_capability_available","description":"Chassis other capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_other_capability_enabled","description":"Chassis other capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_mgmt_ips","description":"Comma delimited list of chassis management IPS","type":"text","hidden":false,"required":false,"index":false},{"name":"port_id_type","description":"Port ID type","type":"text","hidden":false,"required":false,"index":false},{"name":"port_id","description":"Port ID value","type":"text","hidden":false,"required":false,"index":false},{"name":"port_description","description":"Port description","type":"text","hidden":false,"required":false,"index":false},{"name":"port_ttl","description":"Age of neighbor port","type":"bigint","hidden":false,"required":false,"index":false},{"name":"port_mfs","description":"Port max frame size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"port_aggregation_id","description":"Port aggregation ID","type":"text","hidden":false,"required":false,"index":false},{"name":"port_autoneg_supported","description":"Auto negotiation supported","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_enabled","description":"Is auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_mau_type","description":"MAU type","type":"text","hidden":false,"required":false,"index":false},{"name":"port_autoneg_10baset_hd_enabled","description":"10Base-T HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_10baset_fd_enabled","description":"10Base-T FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100basetx_hd_enabled","description":"100Base-TX HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100basetx_fd_enabled","description":"100Base-TX FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset2_hd_enabled","description":"100Base-T2 HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset2_fd_enabled","description":"100Base-T2 FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset4_hd_enabled","description":"100Base-T4 HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset4_fd_enabled","description":"100Base-T4 FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000basex_hd_enabled","description":"1000Base-X HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000basex_fd_enabled","description":"1000Base-X FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000baset_hd_enabled","description":"1000Base-T HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000baset_fd_enabled","description":"1000Base-T FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_device_type","description":"Dot3 power device type","type":"text","hidden":false,"required":false,"index":false},{"name":"power_mdi_supported","description":"MDI power supported","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_mdi_enabled","description":"Is MDI power enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_paircontrol_enabled","description":"Is power pair control enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_pairs","description":"Dot3 power pairs","type":"text","hidden":false,"required":false,"index":false},{"name":"power_class","description":"Power class","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_enabled","description":"Is 802.3at enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_type","description":"802.3at power type","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_source","description":"802.3at power source","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_priority","description":"802.3at power priority","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_allocated","description":"802.3at power allocated","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_requested","description":"802.3at power requested","type":"text","hidden":false,"required":false,"index":false},{"name":"med_device_type","description":"Chassis MED type","type":"text","hidden":false,"required":false,"index":false},{"name":"med_capability_capabilities","description":"Is MED capabilities enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_policy","description":"Is MED policy capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_location","description":"Is MED location capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_mdi_pse","description":"Is MED MDI PSE capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_mdi_pd","description":"Is MED MDI PD capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_inventory","description":"Is MED inventory capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_policies","description":"Comma delimited list of MED policies","type":"text","hidden":false,"required":false,"index":false},{"name":"vlans","description":"Comma delimited list of vlan ids","type":"text","hidden":false,"required":false,"index":false},{"name":"pvid","description":"Primary VLAN id","type":"text","hidden":false,"required":false,"index":false},{"name":"ppvids_supported","description":"Comma delimited list of supported PPVIDs","type":"text","hidden":false,"required":false,"index":false},{"name":"ppvids_enabled","description":"Comma delimited list of enabled PPVIDs","type":"text","hidden":false,"required":false,"index":false},{"name":"pids","description":"Comma delimited list of PIDs","type":"text","hidden":false,"required":false,"index":false}]},{"name":"load_average","description":"Displays information about the system wide load averages.","platforms":["darwin","linux"],"columns":[{"name":"period","description":"Period over which the average is calculated.","type":"text","hidden":false,"required":false,"index":false},{"name":"average","description":"Load average over the specified period.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"location_services","description":"Reports the status of the Location Services feature of the OS.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 if Location Services are enabled, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"logged_in_users","description":"Users with an active shell on the system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"type","description":"Login type","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"User login name","type":"text","hidden":false,"required":false,"index":false},{"name":"tty","description":"Device name","type":"text","hidden":false,"required":false,"index":false},{"name":"host","description":"Remote hostname","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time entry was made","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"sid","description":"The user's unique security identifier","type":"text","hidden":true,"required":false,"index":false},{"name":"registry_hive","description":"HKEY_USERS registry hive","type":"text","hidden":true,"required":false,"index":false}]},{"name":"logical_drives","description":"Details for logical drives on the system. A logical drive generally represents a single partition.","platforms":["windows"],"columns":[{"name":"device_id","description":"The drive id, usually the drive name, e.g., 'C:'.","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Deprecated (always 'Unknown').","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"The canonical description of the drive, e.g. 'Logical Fixed Disk', 'CD-ROM Disk'.","type":"text","hidden":false,"required":false,"index":false},{"name":"free_space","description":"The amount of free space, in bytes, of the drive (-1 on failure).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"The total amount of space, in bytes, of the drive (-1 on failure).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"file_system","description":"The file system of the drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"boot_partition","description":"True if Windows booted from this drive.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"logon_sessions","description":"Windows Logon Session.","platforms":["windows"],"columns":[{"name":"logon_id","description":"A locally unique identifier (LUID) that identifies a logon session.","type":"integer","hidden":false,"required":false,"index":false},{"name":"user","description":"The account name of the security principal that owns the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_domain","description":"The name of the domain used to authenticate the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"authentication_package","description":"The authentication package used to authenticate the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_type","description":"The logon method.","type":"text","hidden":false,"required":false,"index":false},{"name":"session_id","description":"The Terminal Services session identifier.","type":"integer","hidden":false,"required":false,"index":false},{"name":"logon_sid","description":"The user's security identifier (SID).","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_time","description":"The time the session owner logged on.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"logon_server","description":"The name of the server used to authenticate the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"dns_domain_name","description":"The DNS name for the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"upn","description":"The user principal name (UPN) for the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_script","description":"The script used for logging on.","type":"text","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The home directory for the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"home_directory","description":"The home directory for the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"home_directory_drive","description":"The drive location of the home directory of the logon session.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_certificates","description":"LXD certificates information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Name of the certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"fingerprint","description":"SHA256 hash of the certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"certificate","description":"Certificate content","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster","description":"LXD cluster information.","platforms":["darwin","linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether clustering enabled (1) or not (0) on this node","type":"integer","hidden":false,"required":false,"index":false},{"name":"member_config_entity","description":"Type of configuration parameter for this node","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_name","description":"Name of configuration parameter","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_key","description":"Config key","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_value","description":"Config value","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_description","description":"Config description","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster_members","description":"LXD cluster members information.","platforms":["darwin","linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","hidden":false,"required":false,"index":false},{"name":"url","description":"URL of the node","type":"text","hidden":false,"required":false,"index":false},{"name":"database","description":"Whether the server is a database node (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the node (Online/Offline)","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the node (Online/Offline)","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_images","description":"LXD images information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Target architecture for the image","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"OS on which image is based","type":"text","hidden":false,"required":false,"index":false},{"name":"release","description":"OS release version on which the image is based","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Image description","type":"text","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Comma-separated list of image aliases","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Filename of the image file","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of image in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"auto_update","description":"Whether the image auto-updates (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"cached","description":"Whether image is cached (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"public","description":"Whether image is public (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of image creation","type":"text","hidden":false,"required":false,"index":false},{"name":"expires_at","description":"ISO time of image expiration","type":"text","hidden":false,"required":false,"index":false},{"name":"uploaded_at","description":"ISO time of image upload","type":"text","hidden":false,"required":false,"index":false},{"name":"last_used_at","description":"ISO time for the most recent use of this image in terms of container spawn","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_server","description":"Server for image update","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_protocol","description":"Protocol used for image information update and image import from source server","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_certificate","description":"Certificate for update source server","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_alias","description":"Alias of image at update source server","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_config","description":"LXD instance configuration information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Instance name","type":"text","hidden":false,"required":true,"index":false},{"name":"key","description":"Configuration parameter name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Configuration parameter value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_devices","description":"LXD instance devices information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Instance name","type":"text","hidden":false,"required":true,"index":false},{"name":"device","description":"Name of the device","type":"text","hidden":false,"required":false,"index":false},{"name":"device_type","description":"Device type","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Device info param name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Device info param value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_instances","description":"LXD instances information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Instance name","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Instance state (running, stopped, etc.)","type":"text","hidden":false,"required":false,"index":false},{"name":"stateful","description":"Whether the instance is stateful(1) or not(0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"ephemeral","description":"Whether the instance is ephemeral(1) or not(0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of creation","type":"text","hidden":false,"required":false,"index":false},{"name":"base_image","description":"ID of image used to launch this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Instance architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"The OS of this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Instance description","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Instance's process ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"processes","description":"Number of processes running inside this instance","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"lxd_networks","description":"LXD network information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of network","type":"text","hidden":false,"required":false,"index":false},{"name":"managed","description":"1 if network created by LXD, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_address","description":"IPv4 address","type":"text","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","hidden":false,"required":false,"index":false},{"name":"used_by","description":"URLs for containers using this network","type":"text","hidden":false,"required":false,"index":false},{"name":"bytes_received","description":"Number of bytes received on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"bytes_sent","description":"Number of bytes sent on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"packets_received","description":"Number of packets received on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"packets_sent","description":"Number of packets sent on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hwaddr","description":"Hardware address for this network","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Network status","type":"text","hidden":false,"required":false,"index":false},{"name":"mtu","description":"MTU size","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"lxd_storage_pools","description":"LXD storage pool information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Name of the storage pool","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Storage driver","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Storage pool source","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the storage pool","type":"text","hidden":false,"required":false,"index":false},{"name":"space_used","description":"Storage space used in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"space_total","description":"Total available storage space in bytes for this storage pool","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes_used","description":"Number of inodes used","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes_total","description":"Total number of inodes available in this storage pool","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"magic","description":"Magic number recognition library table.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute path to target file","type":"text","hidden":false,"required":true,"index":false},{"name":"magic_db_files","description":"Colon(:) separated list of files where the magic db file can be found. By default one of the following is used: /usr/share/file/magic/magic, /usr/share/misc/magic or /usr/share/misc/magic.mgc","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Magic number data from libmagic","type":"text","hidden":false,"required":false,"index":false},{"name":"mime_type","description":"MIME type data from libmagic","type":"text","hidden":false,"required":false,"index":false},{"name":"mime_encoding","description":"MIME encoding data from libmagic","type":"text","hidden":false,"required":false,"index":false}]},{"name":"managed_policies","description":"The managed configuration policies from AD, MDM, MCX, etc.","platforms":["darwin"],"columns":[{"name":"domain","description":"System or manager-chosen domain key","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Optional UUID assigned to policy set","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Policy key name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Policy value","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Policy applies only this user","type":"text","hidden":false,"required":false,"index":false},{"name":"manual","description":"1 if policy was loaded manually, otherwise 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"md_devices","description":"Software RAID array settings.","platforms":["linux"],"columns":[{"name":"device_name","description":"md device name","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Current state of the array","type":"text","hidden":false,"required":false,"index":false},{"name":"raid_level","description":"Current raid level of the array","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"size of the array in blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"chunk_size","description":"chunk size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"raid_disks","description":"Number of configured RAID disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"nr_raid_disks","description":"Number of partitions or disk devices to comprise the array","type":"integer","hidden":false,"required":false,"index":false},{"name":"working_disks","description":"Number of working disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"active_disks","description":"Number of active disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"failed_disks","description":"Number of failed disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"spare_disks","description":"Number of idle disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"superblock_state","description":"State of the superblock","type":"text","hidden":false,"required":false,"index":false},{"name":"superblock_version","description":"Version of the superblock","type":"text","hidden":false,"required":false,"index":false},{"name":"superblock_update_time","description":"Unix timestamp of last update","type":"bigint","hidden":false,"required":false,"index":false},{"name":"bitmap_on_mem","description":"Pages allocated in in-memory bitmap, if enabled","type":"text","hidden":false,"required":false,"index":false},{"name":"bitmap_chunk_size","description":"Bitmap chunk size","type":"text","hidden":false,"required":false,"index":false},{"name":"bitmap_external_file","description":"External referenced bitmap file","type":"text","hidden":false,"required":false,"index":false},{"name":"recovery_progress","description":"Progress of the recovery activity","type":"text","hidden":false,"required":false,"index":false},{"name":"recovery_finish","description":"Estimated duration of recovery activity","type":"text","hidden":false,"required":false,"index":false},{"name":"recovery_speed","description":"Speed of recovery activity","type":"text","hidden":false,"required":false,"index":false},{"name":"resync_progress","description":"Progress of the resync activity","type":"text","hidden":false,"required":false,"index":false},{"name":"resync_finish","description":"Estimated duration of resync activity","type":"text","hidden":false,"required":false,"index":false},{"name":"resync_speed","description":"Speed of resync activity","type":"text","hidden":false,"required":false,"index":false},{"name":"reshape_progress","description":"Progress of the reshape activity","type":"text","hidden":false,"required":false,"index":false},{"name":"reshape_finish","description":"Estimated duration of reshape activity","type":"text","hidden":false,"required":false,"index":false},{"name":"reshape_speed","description":"Speed of reshape activity","type":"text","hidden":false,"required":false,"index":false},{"name":"check_array_progress","description":"Progress of the check array activity","type":"text","hidden":false,"required":false,"index":false},{"name":"check_array_finish","description":"Estimated duration of the check array activity","type":"text","hidden":false,"required":false,"index":false},{"name":"check_array_speed","description":"Speed of the check array activity","type":"text","hidden":false,"required":false,"index":false},{"name":"unused_devices","description":"Unused devices","type":"text","hidden":false,"required":false,"index":false},{"name":"other","description":"Other information associated with array from /proc/mdstat","type":"text","hidden":false,"required":false,"index":false}]},{"name":"md_drives","description":"Drive devices used for Software RAID.","platforms":["linux"],"columns":[{"name":"md_device_name","description":"md device name","type":"text","hidden":false,"required":false,"index":false},{"name":"drive_name","description":"Drive device name","type":"text","hidden":false,"required":false,"index":false},{"name":"slot","description":"Slot position of disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the drive","type":"text","hidden":false,"required":false,"index":false}]},{"name":"md_personalities","description":"Software RAID setting supported by the kernel.","platforms":["linux"],"columns":[{"name":"name","description":"Name of personality supported by kernel","type":"text","hidden":false,"required":false,"index":false}]},{"name":"mdfind","description":"Run searches against the spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file returned from spotlight","type":"text","hidden":false,"required":false,"index":false},{"name":"query","description":"The query that was run to find the file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"mdls","description":"Query file metadata in the Spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file","type":"text","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the metadata key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Value stored in the metadata key","type":"text","hidden":false,"required":false,"index":false},{"name":"valuetype","description":"CoreFoundation type of data stored in value","type":"text","hidden":true,"required":false,"index":false}]},{"name":"memory_array_mapped_addresses","description":"Data associated for address mapping of physical memory arrays.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_array_handle","description":"Handle of the memory array associated with this structure","type":"text","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"partition_width","description":"Number of memory devices that form a single row of memory for the address partition of this structure","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_arrays","description":"Data associated with collection of memory devices that operate to form a memory address.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the array","type":"text","hidden":false,"required":false,"index":false},{"name":"location","description":"Physical location of the memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"use","description":"Function for which the array is used","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_error_correction","description":"Primary hardware error correction or detection method supported","type":"text","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"Maximum capacity of array in gigabytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"memory_error_info_handle","description":"Handle, or instance number, associated with any error that was detected for the array","type":"text","hidden":false,"required":false,"index":false},{"name":"number_memory_devices","description":"Number of memory devices on array","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_device_mapped_addresses","description":"Data associated for address mapping of physical memory devices.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_device_handle","description":"Handle of the memory device structure associated with this structure","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_array_mapped_address_handle","description":"Handle of the memory array mapped address to which this device range is mapped to","type":"text","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"partition_row_position","description":"Identifies the position of the referenced memory device in a row of the address partition","type":"integer","hidden":false,"required":false,"index":false},{"name":"interleave_position","description":"The position of the device in a interleave, i.e. 0 indicates non-interleave, 1 indicates 1st interleave, 2 indicates 2nd interleave, etc.","type":"integer","hidden":false,"required":false,"index":false},{"name":"interleave_data_depth","description":"The max number of consecutive rows from memory device that are accessed in a single interleave transfer; 0 indicates device is non-interleave","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_devices","description":"Physical memory device (type 17) information retrieved from SMBIOS.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure in SMBIOS","type":"text","hidden":false,"required":false,"index":false},{"name":"array_handle","description":"The memory array that the device is attached to","type":"text","hidden":false,"required":false,"index":false},{"name":"form_factor","description":"Implementation form factor for this memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"total_width","description":"Total width, in bits, of this memory device, including any check or error-correction bits","type":"integer","hidden":false,"required":false,"index":false},{"name":"data_width","description":"Data width, in bits, of this memory device","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of memory device in Megabyte","type":"integer","hidden":false,"required":false,"index":false},{"name":"set","description":"Identifies if memory device is one of a set of devices. A value of 0 indicates no set affiliation.","type":"integer","hidden":false,"required":false,"index":false},{"name":"device_locator","description":"String number of the string that identifies the physically-labeled socket or board position where the memory device is located","type":"text","hidden":false,"required":false,"index":false},{"name":"bank_locator","description":"String number of the string that identifies the physically-labeled bank where the memory device is located","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_type","description":"Type of memory used","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_type_details","description":"Additional details for memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"max_speed","description":"Max speed of memory device in megatransfers per second (MT/s)","type":"integer","hidden":false,"required":false,"index":false},{"name":"configured_clock_speed","description":"Configured speed of memory device in megatransfers per second (MT/s)","type":"integer","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Manufacturer ID string","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Serial number of memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"asset_tag","description":"Manufacturer specific asset tag of memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"part_number","description":"Manufacturer specific serial number of memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"min_voltage","description":"Minimum operating voltage of device in millivolts","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_voltage","description":"Maximum operating voltage of device in millivolts","type":"integer","hidden":false,"required":false,"index":false},{"name":"configured_voltage","description":"Configured operating voltage of device in millivolts","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_error_info","description":"Data associated with errors of a physical memory array.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","hidden":false,"required":false,"index":false},{"name":"error_type","description":"type of error associated with current error status for array or device","type":"text","hidden":false,"required":false,"index":false},{"name":"error_granularity","description":"Granularity to which the error can be resolved","type":"text","hidden":false,"required":false,"index":false},{"name":"error_operation","description":"Memory access operation that caused the error","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_syndrome","description":"Vendor specific ECC syndrome or CRC data associated with the erroneous access","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_array_error_address","description":"32 bit physical address of the error based on the addressing of the bus to which the memory array is connected","type":"text","hidden":false,"required":false,"index":false},{"name":"device_error_address","description":"32 bit physical address of the error relative to the start of the failing memory address, in bytes","type":"text","hidden":false,"required":false,"index":false},{"name":"error_resolution","description":"Range, in bytes, within which this error can be determined, when an error address is given","type":"text","hidden":false,"required":false,"index":false}]},{"name":"memory_info","description":"Main memory information in bytes.","platforms":["linux"],"columns":[{"name":"memory_total","description":"Total amount of physical RAM, in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"memory_free","description":"The amount of physical RAM, in bytes, left unused by the system","type":"bigint","hidden":false,"required":false,"index":false},{"name":"buffers","description":"The amount of physical RAM, in bytes, used for file buffers","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cached","description":"The amount of physical RAM, in bytes, used as cache memory","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_cached","description":"The amount of swap, in bytes, used as cache memory","type":"bigint","hidden":false,"required":false,"index":false},{"name":"active","description":"The total amount of buffer or page cache memory, in bytes, that is in active use","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inactive","description":"The total amount of buffer or page cache memory, in bytes, that are free and available","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_total","description":"The total amount of swap available, in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_free","description":"The total amount of swap free, in bytes","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"memory_map","description":"OS memory region map.","platforms":["linux"],"columns":[{"name":"name","description":"Region name","type":"text","hidden":false,"required":false,"index":false},{"name":"start","description":"Start address of memory region","type":"text","hidden":false,"required":false,"index":false},{"name":"end","description":"End address of memory region","type":"text","hidden":false,"required":false,"index":false}]},{"name":"mounts","description":"System mounted devices and filesystems (not process specific).","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Mounted device","type":"text","hidden":false,"required":false,"index":false},{"name":"device_alias","description":"Mounted device alias","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Mounted device path","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Mounted device type","type":"text","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Block size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Mounted device used blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks_free","description":"Mounted device free blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks_available","description":"Mounted device available blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Mounted device used inodes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes_free","description":"Mounted device free inodes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flags","description":"Mounted device flags","type":"text","hidden":false,"required":false,"index":false}]},{"name":"msr","description":"Various pieces of data stored in the model specific register per processor. NOTE: the msr kernel module must be enabled, and osquery must be run as root.","platforms":["linux"],"columns":[{"name":"processor_number","description":"The processor number as reported in /proc/cpuinfo","type":"bigint","hidden":false,"required":false,"index":false},{"name":"turbo_disabled","description":"Whether the turbo feature is disabled.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"turbo_ratio_limit","description":"The turbo feature ratio limit.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"platform_info","description":"Platform information.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"perf_ctl","description":"Performance setting for the processor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"perf_status","description":"Performance status for the processor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"feature_control","description":"Bitfield controlling enabled features.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"rapl_power_limit","description":"Run Time Average Power Limiting power limit.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"rapl_energy_status","description":"Run Time Average Power Limiting energy status.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"rapl_power_units","description":"Run Time Average Power Limiting power units.","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"nfs_shares","description":"NFS shares exported by the host.","platforms":["darwin"],"columns":[{"name":"share","description":"Filesystem path to the share","type":"text","hidden":false,"required":false,"index":false},{"name":"options","description":"Options string set on the export share","type":"text","hidden":false,"required":false,"index":false},{"name":"readonly","description":"1 if the share is exported readonly else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"npm_packages","description":"Lists all npm packages in a directory or globally installed in a system.","platforms":["linux"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Package supplied description","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Package author name","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License for package","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Module's package.json path","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"Node module's directory where this package is located","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"ntdomains","description":"Display basic NT domain information of a Windows machine.","platforms":["windows"],"columns":[{"name":"name","description":"The label by which the object is known.","type":"text","hidden":false,"required":false,"index":false},{"name":"client_site_name","description":"The name of the site where the domain controller is configured.","type":"text","hidden":false,"required":false,"index":false},{"name":"dc_site_name","description":"The name of the site where the domain controller is located.","type":"text","hidden":false,"required":false,"index":false},{"name":"dns_forest_name","description":"The name of the root of the DNS tree.","type":"text","hidden":false,"required":false,"index":false},{"name":"domain_controller_address","description":"The IP Address of the discovered domain controller..","type":"text","hidden":false,"required":false,"index":false},{"name":"domain_controller_name","description":"The name of the discovered domain controller.","type":"text","hidden":false,"required":false,"index":false},{"name":"domain_name","description":"The name of the domain.","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"The current status of the domain object.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ntfs_acl_permissions","description":"Retrieve NTFS ACL permission information for files and directories.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the file or directory.","type":"text","hidden":false,"required":true,"index":false},{"name":"type","description":"Type of access mode for the access control entry.","type":"text","hidden":false,"required":false,"index":false},{"name":"principal","description":"User or group to which the ACE applies.","type":"text","hidden":false,"required":false,"index":false},{"name":"access","description":"Specific permissions that indicate the rights described by the ACE.","type":"text","hidden":false,"required":false,"index":false},{"name":"inherited_from","description":"The inheritance policy of the ACE.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ntfs_journal_events","description":"Track time/action changes to files specified in configuration data.","platforms":["windows"],"columns":[{"name":"action","description":"Change action (Write, Delete, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The category that the event originated from","type":"text","hidden":false,"required":false,"index":false},{"name":"old_path","description":"Old path (renames only)","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path","type":"text","hidden":false,"required":false,"index":false},{"name":"record_timestamp","description":"Journal record timestamp","type":"text","hidden":false,"required":false,"index":false},{"name":"record_usn","description":"The update sequence number that identifies the journal record","type":"text","hidden":false,"required":false,"index":false},{"name":"node_ref_number","description":"The ordinal that associates a journal record with a filename","type":"text","hidden":false,"required":false,"index":false},{"name":"parent_ref_number","description":"The ordinal that associates a journal record with a filename's parent directory","type":"text","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"The drive letter identifying the source journal","type":"text","hidden":false,"required":false,"index":false},{"name":"file_attributes","description":"File attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"partial","description":"Set to 1 if either path or old_path only contains the file or folder name","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"nvram","description":"Apple NVRAM variable listing.","platforms":["darwin"],"columns":[{"name":"name","description":"Variable name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Data type (CFData, CFString, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Raw variable data","type":"text","hidden":false,"required":false,"index":false}]},{"name":"oem_strings","description":"OEM defined strings retrieved from SMBIOS.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the Type 11 structure","type":"text","hidden":false,"required":false,"index":false},{"name":"number","description":"The string index of the structure","type":"integer","hidden":false,"required":false,"index":false},{"name":"value","description":"The value of the OEM string","type":"text","hidden":false,"required":false,"index":false}]},{"name":"office_mru","description":"View recently opened Office documents.","platforms":["windows"],"columns":[{"name":"application","description":"Associated Office application","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Office application version number","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"File path","type":"text","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"Most recent opened time file was opened","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID","type":"text","hidden":false,"required":false,"index":false}]},{"name":"os_version","description":"A single row containing the operating system name and version.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Distribution or product name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Pretty, suitable for presentation, OS version","type":"text","hidden":false,"required":false,"index":false},{"name":"major","description":"Major release version","type":"integer","hidden":false,"required":false,"index":false},{"name":"minor","description":"Minor release version","type":"integer","hidden":false,"required":false,"index":false},{"name":"patch","description":"Optional patch release","type":"integer","hidden":false,"required":false,"index":false},{"name":"build","description":"Optional build-specific or variant string","type":"text","hidden":false,"required":false,"index":false},{"name":"platform","description":"OS Platform or ID","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_like","description":"Closely related platforms","type":"text","hidden":false,"required":false,"index":false},{"name":"codename","description":"OS version codename","type":"text","hidden":false,"required":false,"index":false},{"name":"arch","description":"OS Architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"The install date of the OS.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"osquery_events","description":"Information about the event publishers and subscribers.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"Event publisher or subscriber name","type":"text","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the associated publisher","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Either publisher or subscriber","type":"text","hidden":false,"required":false,"index":false},{"name":"subscriptions","description":"Number of subscriptions the publisher received or subscriber used","type":"integer","hidden":false,"required":false,"index":false},{"name":"events","description":"Number of events emitted or received since osquery started","type":"integer","hidden":false,"required":false,"index":false},{"name":"refreshes","description":"Publisher only: number of runloop restarts","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"1 if the publisher or subscriber is active else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_extensions","description":"List of active osquery extensions.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"uuid","description":"The transient ID assigned for communication","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension's name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension's version","type":"text","hidden":false,"required":false,"index":false},{"name":"sdk_version","description":"osquery SDK version used to build the extension","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the extension's Thrift connection or library path","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"SDK extension type: extension or module","type":"text","hidden":false,"required":false,"index":false}]},{"name":"osquery_flags","description":"Configurable flags that modify osquery's behavior.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"Flag name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Flag type","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Flag description","type":"text","hidden":false,"required":false,"index":false},{"name":"default_value","description":"Flag default value","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Flag value","type":"text","hidden":false,"required":false,"index":false},{"name":"shell_only","description":"Is the flag shell only?","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_info","description":"Top level information about the running version of osquery.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"pid","description":"Process (or thread/handle) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","hidden":false,"required":false,"index":false},{"name":"instance_id","description":"Unique, long-lived ID per instance of osquery","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"osquery toolkit version","type":"text","hidden":false,"required":false,"index":false},{"name":"config_hash","description":"Hash of the working configuration state","type":"text","hidden":false,"required":false,"index":false},{"name":"config_valid","description":"1 if the config was loaded and considered valid, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"extensions","description":"osquery extensions status","type":"text","hidden":false,"required":false,"index":false},{"name":"build_platform","description":"osquery toolkit build platform","type":"text","hidden":false,"required":false,"index":false},{"name":"build_distro","description":"osquery toolkit platform distribution name (os version)","type":"text","hidden":false,"required":false,"index":false},{"name":"start_time","description":"UNIX time in seconds when the process started","type":"integer","hidden":false,"required":false,"index":false},{"name":"watcher","description":"Process (or thread/handle) ID of optional watcher process","type":"integer","hidden":false,"required":false,"index":false},{"name":"platform_mask","description":"The osquery platform bitmask","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_packs","description":"Information about the current query packs that are loaded in osquery.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"The given name for this query pack","type":"text","hidden":false,"required":false,"index":false},{"name":"platform","description":"Platforms this query is supported on","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Minimum osquery version that this query will run on","type":"text","hidden":false,"required":false,"index":false},{"name":"shard","description":"Shard restriction limit, 1-100, 0 meaning no restriction","type":"integer","hidden":false,"required":false,"index":false},{"name":"discovery_cache_hits","description":"The number of times that the discovery query used cached values since the last time the config was reloaded","type":"integer","hidden":false,"required":false,"index":false},{"name":"discovery_executions","description":"The number of times that the discovery queries have been executed since the last time the config was reloaded","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"Whether this pack is active (the version, platform and discovery queries match) yes=1, no=0.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_registry","description":"List the osquery registry plugins.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"registry","description":"Name of the osquery registry","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the plugin item","type":"text","hidden":false,"required":false,"index":false},{"name":"owner_uuid","description":"Extension route UUID (0 for core)","type":"integer","hidden":false,"required":false,"index":false},{"name":"internal","description":"1 If the plugin is internal else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If this plugin is active else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_schedule","description":"Information about the current queries that are scheduled in osquery.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"The given name for this query","type":"text","hidden":false,"required":false,"index":false},{"name":"query","description":"The exact query to run","type":"text","hidden":false,"required":false,"index":false},{"name":"interval","description":"The interval in seconds to run this query, not an exact interval","type":"integer","hidden":false,"required":false,"index":false},{"name":"executions","description":"Number of times the query was executed","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_executed","description":"UNIX time stamp in seconds of the last completed execution","type":"bigint","hidden":false,"required":false,"index":false},{"name":"denylisted","description":"1 if the query is denylisted else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"output_size","description":"Total number of bytes generated by the query","type":"bigint","hidden":false,"required":false,"index":false},{"name":"wall_time","description":"Total wall time spent executing","type":"bigint","hidden":false,"required":false,"index":false},{"name":"user_time","description":"Total user time spent executing","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_time","description":"Total system time spent executing","type":"bigint","hidden":false,"required":false,"index":false},{"name":"average_memory","description":"Average private memory left after executing","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"package_bom","description":"OS X package bill of materials (BOM) file list.","platforms":["darwin"],"columns":[{"name":"filepath","description":"Package file or directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Expected user of file or directory","type":"integer","hidden":false,"required":false,"index":false},{"name":"gid","description":"Expected group of file or directory","type":"integer","hidden":false,"required":false,"index":false},{"name":"mode","description":"Expected permissions","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Timestamp the file was installed","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of package bom","type":"text","hidden":false,"required":true,"index":false}]},{"name":"package_install_history","description":"OS X package install history.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Label packageIdentifiers","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Label date as UNIX timestamp","type":"integer","hidden":false,"required":false,"index":false},{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package display version","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Install source: usually the installer process name","type":"text","hidden":false,"required":false,"index":false},{"name":"content_type","description":"Package content_type (optional)","type":"text","hidden":false,"required":false,"index":false}]},{"name":"package_receipts","description":"OS X package receipt details.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Package domain identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"package_filename","description":"Filename of original .pkg file","type":"text","hidden":true,"required":false,"index":false},{"name":"version","description":"Installed package version","type":"text","hidden":false,"required":false,"index":false},{"name":"location","description":"Optional relative install path on volume","type":"text","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Timestamp of install time","type":"double","hidden":false,"required":false,"index":false},{"name":"installer_name","description":"Name of installer process","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of receipt plist","type":"text","hidden":false,"required":false,"index":false}]},{"name":"patches","description":"Lists all the patches applied. Note: This does not include patches applied via MSI or downloaded from Windows Update (e.g. Service Packs).","platforms":["windows"],"columns":[{"name":"csname","description":"The name of the host the patch is installed on.","type":"text","hidden":false,"required":false,"index":false},{"name":"hotfix_id","description":"The KB ID of the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"caption","description":"Short description of the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Fuller description of the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"fix_comments","description":"Additional comments about the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"installed_by","description":"The system context in which the patch as installed.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the patch was installed. Lack of a value does not indicate that the patch was not installed.","type":"text","hidden":false,"required":false,"index":false},{"name":"installed_on","description":"The date when the patch was installed.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"pci_devices","description":"PCI devices active on the host system.","platforms":["darwin","linux"],"columns":[{"name":"pci_slot","description":"PCI Device used slot","type":"text","hidden":false,"required":false,"index":false},{"name":"pci_class","description":"PCI Device class","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"PCI Device used driver","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"PCI Device vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded PCI Device vendor identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"PCI Device model","type":"text","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded PCI Device model identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"pci_class_id","description":"PCI Device class ID in hex format","type":"text","hidden":true,"required":false,"index":false},{"name":"pci_subclass_id","description":"PCI Device subclass in hex format","type":"text","hidden":true,"required":false,"index":false},{"name":"pci_subclass","description":"PCI Device subclass","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_vendor_id","description":"Vendor ID of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_vendor","description":"Vendor of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_model_id","description":"Model ID of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_model","description":"Device description of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false}]},{"name":"physical_disk_performance","description":"Provides provides raw data from performance counters that monitor hard or fixed disk drives on the system.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the physical disk","type":"text","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_read","description":"Average number of bytes transferred from the disk during read operations","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_write","description":"Average number of bytes transferred to the disk during write operations","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_read_queue_length","description":"Average number of read requests that were queued for the selected disk during the sample interval","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_write_queue_length","description":"Average number of write requests that were queued for the selected disk during the sample interval","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_read","description":"Average time, in seconds, of a read operation of data from the disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_write","description":"Average time, in seconds, of a write operation of data to the disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"current_disk_queue_length","description":"Number of requests outstanding on the disk at the time the performance data is collected","type":"integer","hidden":false,"required":false,"index":false},{"name":"percent_disk_read_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read requests","type":"bigint","hidden":false,"required":false,"index":false},{"name":"percent_disk_write_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing write requests","type":"bigint","hidden":false,"required":false,"index":false},{"name":"percent_disk_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read or write requests","type":"bigint","hidden":false,"required":false,"index":false},{"name":"percent_idle_time","description":"Percentage of time during the sample interval that the disk was idle","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"pipes","description":"Named and Anonymous pipes.","platforms":["windows"],"columns":[{"name":"pid","description":"Process ID of the process to which the pipe belongs","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the pipe","type":"text","hidden":false,"required":false,"index":false},{"name":"instances","description":"Number of instances of the named pipe","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_instances","description":"The maximum number of instances creatable for this pipe","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"The flags indicating whether this pipe connection is a server or client end, and if the pipe for sending messages or bytes","type":"text","hidden":false,"required":false,"index":false}]},{"name":"pkg_packages","description":"pkgng packages that are currently installed on the host system.","platforms":["freebsd"],"columns":[{"name":"name","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","hidden":false,"required":false,"index":false},{"name":"flatsize","description":"Package size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"arch","description":"Architecture(s) supported","type":"text","hidden":false,"required":false,"index":false}]},{"name":"platform_info","description":"Information about EFI/UEFI/ROM and platform/boot.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"vendor","description":"Platform code vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Platform code version","type":"text","hidden":false,"required":false,"index":false},{"name":"date","description":"Self-reported platform code update date","type":"text","hidden":false,"required":false,"index":false},{"name":"revision","description":"BIOS major and minor revision","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Relative address of firmware mapping","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size in bytes of firmware","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_size","description":"(Optional) size of firmware volume","type":"integer","hidden":false,"required":false,"index":false},{"name":"extra","description":"Platform-specific additional information","type":"text","hidden":false,"required":false,"index":false}]},{"name":"plist","description":"Read and parse a plist file.","platforms":["darwin"],"columns":[{"name":"key","description":"Preference top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"subkey","description":"Intermediate key path, includes lists/dicts","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"(required) read preferences from a plist","type":"text","hidden":false,"required":true,"index":false}]},{"name":"portage_keywords","description":"A summary about portage configurations like keywords, mask and unmask.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","hidden":false,"required":false,"index":false},{"name":"keyword","description":"The keyword applied to the package","type":"text","hidden":false,"required":false,"index":false},{"name":"mask","description":"If the package is masked","type":"integer","hidden":false,"required":false,"index":false},{"name":"unmask","description":"If the package is unmasked","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"portage_packages","description":"List of currently installed packages.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","hidden":false,"required":false,"index":false},{"name":"slot","description":"The slot used by package","type":"text","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Unix time when package was built","type":"bigint","hidden":false,"required":false,"index":false},{"name":"repository","description":"From which repository the ebuild was used","type":"text","hidden":false,"required":false,"index":false},{"name":"eapi","description":"The eapi for the ebuild","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the package","type":"bigint","hidden":false,"required":false,"index":false},{"name":"world","description":"If package is in the world file","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"portage_use","description":"List of enabled portage USE values for specific package.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The version of the installed package","type":"text","hidden":false,"required":false,"index":false},{"name":"use","description":"USE flag which has been enabled for package","type":"text","hidden":false,"required":false,"index":false}]},{"name":"power_sensors","description":"Machine power (currents, voltages, wattages, etc) sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on OS X","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The sensor category: currents, voltage, wattage","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of power source","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Power in Watts","type":"text","hidden":false,"required":false,"index":false}]},{"name":"powershell_events","description":"Powershell script blocks reconstructed to their full script content, this table requires script block logging to be enabled.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received by the osquery event publisher","type":"bigint","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the Powershell script event occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"script_block_id","description":"The unique GUID of the powershell script to which this block belongs","type":"text","hidden":false,"required":false,"index":false},{"name":"script_block_count","description":"The total number of script blocks for this script","type":"integer","hidden":false,"required":false,"index":false},{"name":"script_text","description":"The text content of the Powershell script","type":"text","hidden":false,"required":false,"index":false},{"name":"script_name","description":"The name of the Powershell script","type":"text","hidden":false,"required":false,"index":false},{"name":"script_path","description":"The path for the Powershell script","type":"text","hidden":false,"required":false,"index":false},{"name":"cosine_similarity","description":"How similar the Powershell script is to a provided 'normal' character frequency","type":"double","hidden":false,"required":false,"index":false}]},{"name":"preferences","description":"OS X defaults and managed preferences.","platforms":["darwin"],"columns":[{"name":"domain","description":"Application ID usually in com.name.product format","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Preference top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"subkey","description":"Intemediate key path, includes lists/dicts","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","hidden":false,"required":false,"index":false},{"name":"forced","description":"1 if the value is forced/managed, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"username","description":"(optional) read preferences for a specific user","type":"text","hidden":false,"required":false,"index":false},{"name":"host","description":"'current' or 'any' host, where 'current' takes precedence","type":"text","hidden":false,"required":false,"index":false}]},{"name":"prefetch","description":"Prefetch files show metadata related to file execution.","platforms":["windows"],"columns":[{"name":"path","description":"Prefetch file path.","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Executable filename.","type":"text","hidden":false,"required":false,"index":false},{"name":"hash","description":"Prefetch CRC hash.","type":"text","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Most recent time application was run.","type":"integer","hidden":false,"required":false,"index":false},{"name":"other_run_times","description":"Other execution times in prefetch file.","type":"text","hidden":false,"required":false,"index":false},{"name":"run_count","description":"Number of times the application has been run.","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Application file size.","type":"integer","hidden":false,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number.","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_creation","description":"Volume creation time.","type":"text","hidden":false,"required":false,"index":false},{"name":"accessed_files_count","description":"Number of files accessed.","type":"integer","hidden":false,"required":false,"index":false},{"name":"accessed_directories_count","description":"Number of directories accessed.","type":"integer","hidden":false,"required":false,"index":false},{"name":"accessed_files","description":"Files accessed by application within ten seconds of launch.","type":"text","hidden":false,"required":false,"index":false},{"name":"accessed_directories","description":"Directories accessed by application within ten seconds of launch.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_envs","description":"A key/value table of environment variables for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"key","description":"Environment variable name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Environment variable value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_events","description":"Track time/action process executions.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"File mode permissions","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline_size","description":"Actual size (bytes) of command line arguments","type":"bigint","hidden":true,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","hidden":true,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","hidden":true,"required":false,"index":false},{"name":"env_size","description":"Actual size (bytes) of environment list","type":"bigint","hidden":true,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"File owner user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"owner_gid","description":"File owner group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"atime","description":"File last access in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"File modification in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"File last metadata change in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"btime","description":"File creation in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"overflows","description":"List of structures that overflowed","type":"text","hidden":true,"required":false,"index":false},{"name":"parent","description":"Process parent's PID, or -1 if cannot be determined.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false},{"name":"status","description":"OpenBSM Attribute: Status of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"suid","description":"Saved user ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"fsgid","description":"Filesystem group ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"sgid","description":"Saved group ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"syscall","description":"Syscall name: fork, vfork, clone, execve, execveat","type":"text","hidden":true,"required":false,"index":false}]},{"name":"process_file_events","description":"A File Integrity Monitor implementation using the audit service.","platforms":["linux"],"columns":[{"name":"operation","description":"Operation type","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ppid","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"executable","description":"The executable path","type":"text","hidden":false,"required":false,"index":false},{"name":"partial","description":"True if this is a partial event (i.e.: this process existed before we started osquery)","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The current working directory of the process","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"The path associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"dest_path","description":"The canonical path associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The uid of the process performing the action","type":"text","hidden":false,"required":false,"index":false},{"name":"gid","description":"The gid of the process performing the action","type":"text","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"fsgid","description":"Filesystem group ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"process_memory_map","description":"Process memory mapped files and pseudo device/regions.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"start","description":"Virtual start address (hex)","type":"text","hidden":false,"required":false,"index":false},{"name":"end","description":"Virtual end address (hex)","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions","description":"r=read, w=write, x=execute, p=private (cow)","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"Offset into mapped path","type":"bigint","hidden":false,"required":false,"index":false},{"name":"device","description":"MA:MI Major/minor device ID","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Mapped path inode, 0 means uninitialized (BSS)","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to mapped file or mapped type","type":"text","hidden":false,"required":false,"index":false},{"name":"pseudo","description":"1 If path is a pseudo path, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"process_namespaces","description":"Linux namespaces for processes running on the host system.","platforms":["linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"cgroup_namespace","description":"cgroup namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"ipc_namespace","description":"ipc namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"mnt_namespace","description":"mnt namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"net namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_namespace","description":"pid namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"user_namespace","description":"user namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"uts_namespace","description":"uts namespace inode","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_open_files","description":"File descriptors for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"fd","description":"Process-specific file descriptor number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Filesystem path of descriptor","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_open_pipes","description":"Pipes and partner processes for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"fd","description":"File descriptor","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Pipe open mode (r/w)","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Pipe inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"type","description":"Pipe Type: named vs unnamed/anonymous","type":"text","hidden":false,"required":false,"index":false},{"name":"partner_pid","description":"Process ID of partner process sharing a particular pipe","type":"bigint","hidden":false,"required":false,"index":false},{"name":"partner_fd","description":"File descriptor of shared pipe at partner's end","type":"bigint","hidden":false,"required":false,"index":false},{"name":"partner_mode","description":"Mode of shared pipe at partner's end","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_open_sockets","description":"Processes which have open network sockets on the system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"fd","description":"Socket file descriptor number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Socket local address","type":"text","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Socket remote address","type":"text","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Socket local port","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Socket remote port","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"For UNIX sockets (family=AF_UNIX), the domain path","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"TCP socket state","type":"text","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","hidden":true,"required":false,"index":false}]},{"name":"processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"protection_type","description":"The protection type of the process","type":"text","hidden":true,"required":false,"index":false},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"programs","description":"Represents products as they are installed by Windows Installer. A product generally correlates to one installation package on Windows. Some fields may be blank as Windows installation details are left to the discretion of the product author.","platforms":["windows"],"columns":[{"name":"name","description":"Commonly used product name.","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Product version information.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_location","description":"The installation location directory of the product.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_source","description":"The installation source of the product.","type":"text","hidden":false,"required":false,"index":false},{"name":"language","description":"The language of the product.","type":"text","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the product supplier.","type":"text","hidden":false,"required":false,"index":false},{"name":"uninstall_string","description":"Path and filename of the uninstaller.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Date that this product was installed on the system. ","type":"text","hidden":false,"required":false,"index":false},{"name":"identifying_number","description":"Product identification such as a serial number on software, or a die number on a hardware chip.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"prometheus_metrics","description":"Retrieve metrics from a Prometheus server.","platforms":["darwin","linux"],"columns":[{"name":"target_name","description":"Address of prometheus target","type":"text","hidden":false,"required":false,"index":false},{"name":"metric_name","description":"Name of collected Prometheus metric","type":"text","hidden":false,"required":false,"index":false},{"name":"metric_value","description":"Value of collected Prometheus metric","type":"double","hidden":false,"required":false,"index":false},{"name":"timestamp_ms","description":"Unix timestamp of collected data in MS","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"python_packages","description":"Python packages installed in a system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this module resides","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"Directory where Python modules are located","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"quicklook_cache","description":"Files and thumbnails within OS X's Quicklook Cache.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of file","type":"text","hidden":false,"required":false,"index":false},{"name":"rowid","description":"Quicklook file rowid key","type":"integer","hidden":false,"required":false,"index":false},{"name":"fs_id","description":"Quicklook file fs_id key","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_id","description":"Parsed volume ID from fs_id","type":"integer","hidden":false,"required":false,"index":false},{"name":"inode","description":"Parsed file ID (inode) from fs_id","type":"integer","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Parsed version date field","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Parsed version size field","type":"bigint","hidden":false,"required":false,"index":false},{"name":"label","description":"Parsed version 'gen' field","type":"text","hidden":false,"required":false,"index":false},{"name":"last_hit_date","description":"Apple date format for last thumbnail cache hit","type":"integer","hidden":false,"required":false,"index":false},{"name":"hit_count","description":"Number of cache hits on thumbnail","type":"text","hidden":false,"required":false,"index":false},{"name":"icon_mode","description":"Thumbnail icon mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cache_path","description":"Path to cache data","type":"text","hidden":false,"required":false,"index":false}]},{"name":"registry","description":"All of the Windows registry hives.","platforms":["windows"],"columns":[{"name":"key","description":"Name of the key to search for","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Full path to the value","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the registry value entry","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the registry value, or 'subkey' if item is a subkey","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Data content of registry value","type":"text","hidden":false,"required":false,"index":false},{"name":"mtime","description":"timestamp of the most recent registry write","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"routes","description":"The active route table for the host system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"destination","description":"Destination IP address","type":"text","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Netmask length","type":"integer","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Route gateway","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Route source","type":"text","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags to describe route","type":"integer","hidden":false,"required":false,"index":false},{"name":"interface","description":"Route local interface","type":"text","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Maximum Transmission Unit for the route","type":"integer","hidden":false,"required":false,"index":false},{"name":"metric","description":"Cost of route. Lowest is preferred","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of route","type":"text","hidden":false,"required":false,"index":false},{"name":"hopcount","description":"Max hops expected","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"rpm_package_files","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"package","description":"RPM package name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"File path within the package","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"File default username from info DB","type":"text","hidden":false,"required":false,"index":false},{"name":"groupname","description":"File default groupname from info DB","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"File permissions mode from info DB","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size in bytes from RPM info DB","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 file digest from RPM info DB","type":"text","hidden":false,"required":false,"index":false}]},{"name":"rpm_packages","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"name","description":"RPM package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","hidden":false,"required":false,"index":false},{"name":"release","description":"Package release","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source RPM package name (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the package contents","type":"text","hidden":false,"required":false,"index":false},{"name":"arch","description":"Architecture(s) supported","type":"text","hidden":false,"required":false,"index":false},{"name":"epoch","description":"Package epoch value","type":"integer","hidden":false,"required":false,"index":false},{"name":"install_time","description":"When the package was installed","type":"integer","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Package vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"package_group","description":"Package group","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"running_apps","description":"macOS applications currently running on the host system.","platforms":["darwin"],"columns":[{"name":"pid","description":"The pid of the application","type":"integer","hidden":false,"required":false,"index":false},{"name":"bundle_identifier","description":"The bundle identifier of the application","type":"text","hidden":false,"required":false,"index":false},{"name":"is_active","description":"1 if the application is in focus, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"safari_extensions","description":"Safari browser extension details for all users.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension display name","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension long version","type":"text","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Bundle SDK used to compile extension","type":"text","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Optional developer identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional extension description text","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension XAR bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"sandboxes","description":"OS X application sandboxes container details.","platforms":["darwin"],"columns":[{"name":"label","description":"UTI-format bundle or label ID","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"Sandbox owner","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Application sandboxings enabled on container","type":"integer","hidden":false,"required":false,"index":false},{"name":"build_id","description":"Sandbox-specific identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"Application bundle used by the sandbox","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to sandbox container directory","type":"text","hidden":false,"required":false,"index":false}]},{"name":"scheduled_tasks","description":"Lists all of the tasks in the Windows task scheduler.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the scheduled task","type":"text","hidden":false,"required":false,"index":false},{"name":"action","description":"Actions executed by the scheduled task","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the executable to be run","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether or not the scheduled task is enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the scheduled task","type":"text","hidden":false,"required":false,"index":false},{"name":"hidden","description":"Whether or not the task is visible in the UI","type":"integer","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Timestamp the task last ran","type":"bigint","hidden":false,"required":false,"index":false},{"name":"next_run_time","description":"Timestamp the task is scheduled to run next","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_run_message","description":"Exit status message of the last task run","type":"text","hidden":false,"required":false,"index":false},{"name":"last_run_code","description":"Exit status code of the last task run","type":"text","hidden":false,"required":false,"index":false}]},{"name":"screenlock","description":"macOS screenlock status for the current logged in user context.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 If a password is required after sleep or the screensaver begins; else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"grace_period","description":"The amount of time in seconds the screen must be asleep or the screensaver on before a password is required on-wake. 0 = immediately; -1 = no password is required on-wake","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"seccomp_events","description":"A virtual table that tracks seccomp events.","platforms":["linux"],"columns":[{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID (loginuid) of the user who started the analyzed process","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the user who started the analyzed process","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the user who started the analyzed process","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"ses","description":"Session ID of the session from which the analyzed process was invoked","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","hidden":false,"required":false,"index":false},{"name":"exe","description":"The path to the executable that was used to invoke the analyzed process","type":"text","hidden":false,"required":false,"index":false},{"name":"sig","description":"Signal value sent to process by seccomp","type":"bigint","hidden":false,"required":false,"index":false},{"name":"arch","description":"Information about the CPU architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"syscall","description":"Type of the system call","type":"text","hidden":false,"required":false,"index":false},{"name":"compat","description":"Is system call in compatibility mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ip","description":"Instruction pointer value","type":"text","hidden":false,"required":false,"index":false},{"name":"code","description":"The seccomp action","type":"text","hidden":false,"required":false,"index":false}]},{"name":"secureboot","description":"Secure Boot UEFI Settings.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"secure_boot","description":"Whether secure boot is enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"setup_mode","description":"Whether setup mode is enabled","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"selinux_events","description":"Track SELinux events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"Message","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"selinux_settings","description":"Track active SELinux settings.","platforms":["linux"],"columns":[{"name":"scope","description":"Where the key is located inside the SELinuxFS mount point.","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Key or class name.","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Active value.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"services","description":"Lists all installed Windows services and their relevant data.","platforms":["windows"],"columns":[{"name":"name","description":"Service name","type":"text","hidden":false,"required":false,"index":false},{"name":"service_type","description":"Service Type: OWN_PROCESS, SHARE_PROCESS and maybe Interactive (can interact with the desktop)","type":"text","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Service Display name","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Service Current status: STOPPED, START_PENDING, STOP_PENDING, RUNNING, CONTINUE_PENDING, PAUSE_PENDING, PAUSED","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"the Process ID of the service","type":"integer","hidden":false,"required":false,"index":false},{"name":"start_type","description":"Service start type: BOOT_START, SYSTEM_START, AUTO_START, DEMAND_START, DISABLED","type":"text","hidden":false,"required":false,"index":false},{"name":"win32_exit_code","description":"The error code that the service uses to report an error that occurs when it is starting or stopping","type":"integer","hidden":false,"required":false,"index":false},{"name":"service_exit_code","description":"The service-specific error code that the service returns when an error occurs while the service is starting or stopping","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Service Executable","type":"text","hidden":false,"required":false,"index":false},{"name":"module_path","description":"Path to ServiceDll","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Service Description","type":"text","hidden":false,"required":false,"index":false},{"name":"user_account","description":"The name of the account that the service process will be logged on as when it runs. This name can be of the form Domain\\UserName. If the account belongs to the built-in domain, the name can be of the form .\\UserName.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shadow","description":"Local system users encrypted passwords and related information. Please note, that you usually need superuser rights to access `/etc/shadow`.","platforms":["linux"],"columns":[{"name":"password_status","description":"Password status","type":"text","hidden":false,"required":false,"index":false},{"name":"hash_alg","description":"Password hashing algorithm","type":"text","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Date of last password change (starting from UNIX epoch date)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimal number of days between password changes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum number of days between password changes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"warning","description":"Number of days before password expires to warn user about it","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Number of days after password expires until account is blocked","type":"bigint","hidden":false,"required":false,"index":false},{"name":"expire","description":"Number of days since UNIX epoch date until account is disabled","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flag","description":"Reserved","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shared_folders","description":"Folders available to others via SMB or AFP.","platforms":["darwin"],"columns":[{"name":"name","description":"The shared name of the folder as it appears to other users","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute path of shared folder on the local system","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shared_memory","description":"OS shared memory regions.","platforms":["linux"],"columns":[{"name":"shmid","description":"Shared memory segment ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"User ID of owning process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"creator_uid","description":"User ID of creator process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID to last use the segment","type":"bigint","hidden":false,"required":false,"index":false},{"name":"creator_pid","description":"Process ID that created the segment","type":"bigint","hidden":false,"required":false,"index":false},{"name":"atime","description":"Attached time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"dtime","description":"Detached time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Changed time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Memory segment permissions","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"attached","description":"Number of attached processes","type":"integer","hidden":false,"required":false,"index":false},{"name":"status","description":"Destination/attach status","type":"text","hidden":false,"required":false,"index":false},{"name":"locked","description":"1 if segment is locked else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shared_resources","description":"Displays shared resources on a computer system running Windows. This may be a disk drive, printer, interprocess communication, or other sharable device.","platforms":["windows"],"columns":[{"name":"description","description":"A textual description of the object","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the object was installed. Lack of a value does not indicate that the object is not installed.","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"String that indicates the current status of the object.","type":"text","hidden":false,"required":false,"index":false},{"name":"allow_maximum","description":"Number of concurrent users for this resource has been limited. If True, the value in the MaximumAllowed property is ignored.","type":"integer","hidden":false,"required":false,"index":false},{"name":"maximum_allowed","description":"Limit on the maximum number of users allowed to use this resource concurrently. The value is only valid if the AllowMaximum property is set to FALSE.","type":"integer","hidden":false,"required":false,"index":false},{"name":"name","description":"Alias given to a path set up as a share on a computer system running Windows.","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Local path of the Windows share.","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of resource being shared. Types include: disk drives, print queues, interprocess communications (IPC), and general devices.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"sharing_preferences","description":"OS X Sharing preferences.","platforms":["darwin"],"columns":[{"name":"screen_sharing","description":"1 If screen sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"file_sharing","description":"1 If file sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"printer_sharing","description":"1 If printer sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_login","description":"1 If remote login is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_management","description":"1 If remote management is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_apple_events","description":"1 If remote apple events are enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"internet_sharing","description":"1 If internet sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"bluetooth_sharing","description":"1 If bluetooth sharing is enabled for any user else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"disc_sharing","description":"1 If CD or DVD sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"content_caching","description":"1 If content caching is enabled else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shell_history","description":"A line-delimited (command) table of per-user .*_history data.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"Shell history owner","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp. It could be absent, default value is 0.","type":"integer","hidden":false,"required":false,"index":false},{"name":"command","description":"Unparsed date/line/command history line","type":"text","hidden":false,"required":false,"index":false},{"name":"history_file","description":"Path to the .*_history for this user","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shellbags","description":"Shows directories accessed via Windows Explorer.","platforms":["windows"],"columns":[{"name":"sid","description":"User SID","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Shellbags source Registry file","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Directory name.","type":"text","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Directory Modified time.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"created_time","description":"Directory Created time.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"accessed_time","description":"Directory Accessed time.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mft_entry","description":"Directory master file table entry.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mft_sequence","description":"Directory master file table sequence.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shimcache","description":"Application Compatibility Cache, contains artifacts of execution.","platforms":["windows"],"columns":[{"name":"entry","description":"Execution order.","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the executed file.","type":"text","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"File Modified time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"execution_flag","description":"Boolean Execution flag, 1 for execution, 0 for no execution, -1 for missing (this flag does not exist on Windows 10 and higher).","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shortcut_files","description":"View data about Windows Shortcut files.","platforms":["windows"],"columns":[{"name":"path","description":"Directory name.","type":"text","hidden":false,"required":true,"index":false},{"name":"target_path","description":"Target file path","type":"text","hidden":false,"required":false,"index":false},{"name":"target_modified","description":"Target Modified time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"target_created","description":"Target Created time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"target_accessed","description":"Target Accessed time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"target_size","description":"Size of target file.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to target file from lnk file.","type":"text","hidden":false,"required":false,"index":false},{"name":"local_path","description":"Local system path to target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"working_path","description":"Target file directory.","type":"text","hidden":false,"required":false,"index":false},{"name":"icon_path","description":"Lnk file icon location.","type":"text","hidden":false,"required":false,"index":false},{"name":"common_path","description":"Common system path to target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"command_args","description":"Command args passed to lnk file.","type":"text","hidden":false,"required":false,"index":false},{"name":"hostname","description":"Optional hostname of the target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"share_name","description":"Share name of the target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"device_type","description":"Device containing the target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number.","type":"text","hidden":false,"required":false,"index":false},{"name":"mft_entry","description":"Target mft entry.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mft_sequence","description":"Target mft sequence.","type":"integer","hidden":false,"required":false,"index":false},{"name":"description","description":"Lnk file description.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"signature","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["darwin"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"hash_resources","description":"Set to 1 to also hash resources, or 0 otherwise. Default is 1","type":"integer","hidden":false,"required":false,"index":false},{"name":"arch","description":"If applicable, the arch of the signed code","type":"text","hidden":false,"required":false,"index":false},{"name":"signed","description":"1 If the file is signed else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"identifier","description":"The signing identifier sealed into the signature","type":"text","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Hash of the application Code Directory","type":"text","hidden":false,"required":false,"index":false},{"name":"team_identifier","description":"The team signing identifier sealed into the signature","type":"text","hidden":false,"required":false,"index":false},{"name":"authority","description":"Certificate Common Name","type":"text","hidden":false,"required":false,"index":false}]},{"name":"sip_config","description":"Apple's System Integrity Protection (rootless) status.","platforms":["darwin"],"columns":[{"name":"config_flag","description":"The System Integrity Protection config flag","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this configuration is enabled, otherwise 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"enabled_nvram","description":"1 if this configuration is enabled, otherwise 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"smart_drive_info","description":"Drive information read by SMART controller utilizing autodetect.","platforms":["darwin","linux"],"columns":[{"name":"device_name","description":"Name of block device","type":"text","hidden":false,"required":false,"index":false},{"name":"disk_id","description":"Physical slot number of device, only exists when hardware storage controller exists","type":"integer","hidden":false,"required":false,"index":false},{"name":"driver_type","description":"The explicit device type used to retrieve the SMART information","type":"text","hidden":false,"required":false,"index":false},{"name":"model_family","description":"Drive model family","type":"text","hidden":false,"required":false,"index":false},{"name":"device_model","description":"Device Model","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Device serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"lu_wwn_device_id","description":"Device Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"additional_product_id","description":"An additional drive identifier if any","type":"text","hidden":false,"required":false,"index":false},{"name":"firmware_version","description":"Drive firmware version","type":"text","hidden":false,"required":false,"index":false},{"name":"user_capacity","description":"Bytes of drive capacity","type":"text","hidden":false,"required":false,"index":false},{"name":"sector_sizes","description":"Bytes of drive sector sizes","type":"text","hidden":false,"required":false,"index":false},{"name":"rotation_rate","description":"Drive RPM","type":"text","hidden":false,"required":false,"index":false},{"name":"form_factor","description":"Form factor if reported","type":"text","hidden":false,"required":false,"index":false},{"name":"in_smartctl_db","description":"Boolean value for if drive is recognized","type":"integer","hidden":false,"required":false,"index":false},{"name":"ata_version","description":"ATA version of drive","type":"text","hidden":false,"required":false,"index":false},{"name":"transport_type","description":"Drive transport type","type":"text","hidden":false,"required":false,"index":false},{"name":"sata_version","description":"SATA version, if any","type":"text","hidden":false,"required":false,"index":false},{"name":"read_device_identity_failure","description":"Error string for device id read, if any","type":"text","hidden":false,"required":false,"index":false},{"name":"smart_supported","description":"SMART support status","type":"text","hidden":false,"required":false,"index":false},{"name":"smart_enabled","description":"SMART enabled status","type":"text","hidden":false,"required":false,"index":false},{"name":"packet_device_type","description":"Packet device type","type":"text","hidden":false,"required":false,"index":false},{"name":"power_mode","description":"Device power mode","type":"text","hidden":false,"required":false,"index":false},{"name":"warnings","description":"Warning messages from SMART controller","type":"text","hidden":false,"required":false,"index":false}]},{"name":"smbios_tables","description":"BIOS (DMI) structure common details and content.","platforms":["darwin","linux"],"columns":[{"name":"number","description":"Table entry number","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Table entry type","type":"integer","hidden":false,"required":false,"index":false},{"name":"description","description":"Table entry description","type":"text","hidden":false,"required":false,"index":false},{"name":"handle","description":"Table entry handle","type":"integer","hidden":false,"required":false,"index":false},{"name":"header_size","description":"Header size in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Table entry size in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table entry","type":"text","hidden":false,"required":false,"index":false}]},{"name":"smc_keys","description":"Apple's system management controller keys.","platforms":["darwin"],"columns":[{"name":"key","description":"4-character key","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"SMC-reported type literal type","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Reported size of data in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"value","description":"A type-encoded representation of the key value","type":"text","hidden":false,"required":false,"index":false},{"name":"hidden","description":"1 if this key is normally hidden, otherwise 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"socket_events","description":"Track network socket opens and closes.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"The socket action (bind, listen, close)","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"status","description":"Either 'succeeded', 'failed', 'in_progress' (connect() on non-blocking socket) or 'no_client' (null accept() on non-blocking socket)","type":"text","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","hidden":true,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"socket","description":"The local path (UNIX domain socket only)","type":"text","hidden":true,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false},{"name":"success","description":"Deprecated. Use the 'status' column instead","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"ssh_configs","description":"A table of parsed ssh_configs.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"The local owner of the ssh_config file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block","description":"The host or match block","type":"text","hidden":false,"required":false,"index":false},{"name":"option","description":"The option and value","type":"text","hidden":false,"required":false,"index":false},{"name":"ssh_config_file","description":"Path to the ssh_config file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"startup_items","description":"Applications and binaries set as user/login startup items.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Name of startup item","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of startup item","type":"text","hidden":false,"required":false,"index":false},{"name":"args","description":"Arguments provided to startup executable","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Startup Item or Login Item","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Directory or plist containing startup item","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Startup status; either enabled or disabled","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"The user associated with the startup item","type":"text","hidden":false,"required":false,"index":false}]},{"name":"sudoers","description":"Rules for running commands as other users via sudo.","platforms":["darwin","linux"],"columns":[{"name":"source","description":"Source file containing the given rule","type":"text","hidden":false,"required":false,"index":false},{"name":"header","description":"Symbol for given rule","type":"text","hidden":false,"required":false,"index":false},{"name":"rule_details","description":"Rule definition","type":"text","hidden":false,"required":false,"index":false}]},{"name":"suid_bin","description":"suid binaries in common locations.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Binary path","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Binary owner username","type":"text","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Binary owner group","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Binary permissions","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"syslog_events","description":"","platforms":["linux"],"columns":[{"name":"time","description":"Current unix epoch time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Time known to syslog","type":"text","hidden":false,"required":false,"index":false},{"name":"host","description":"Hostname configured for syslog","type":"text","hidden":false,"required":false,"index":false},{"name":"severity","description":"Syslog severity","type":"integer","hidden":false,"required":false,"index":false},{"name":"facility","description":"Syslog facility","type":"text","hidden":false,"required":false,"index":false},{"name":"tag","description":"The syslog tag","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"The syslog message","type":"text","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"system_controls","description":"sysctl names, values, and settings information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Full sysctl MIB name","type":"text","hidden":false,"required":false,"index":false},{"name":"oid","description":"Control MIB","type":"text","hidden":false,"required":false,"index":false},{"name":"subsystem","description":"Subsystem ID, control type","type":"text","hidden":false,"required":false,"index":false},{"name":"current_value","description":"Value of setting","type":"text","hidden":false,"required":false,"index":false},{"name":"config_value","description":"The MIB value set in /etc/sysctl.conf","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Data type","type":"text","hidden":false,"required":false,"index":false},{"name":"field_name","description":"Specific attribute of opaque type","type":"text","hidden":false,"required":false,"index":false}]},{"name":"system_extensions","description":"macOS (>= 10.15) system extension table.","platforms":["darwin"],"columns":[{"name":"path","description":"Original path of system extension","type":"text","hidden":false,"required":false,"index":false},{"name":"UUID","description":"Extension unique id","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"System extension state","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Identifier name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"System extension version","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"System extension category","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"System extension bundle path","type":"text","hidden":false,"required":false,"index":false},{"name":"team","description":"Signing team ID","type":"text","hidden":false,"required":false,"index":false},{"name":"mdm_managed","description":"1 if managed by MDM system extension payload configuration, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"system_info","description":"System information for identification.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"hostname","description":"Network hostname including domain","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"CPU type","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"CPU subtype","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_brand","description":"CPU brand string, contains vendor and model","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_physical_cores","description":"Number of physical CPU cores in to the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_logical_cores","description":"Number of logical CPU cores available to the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_microcode","description":"Microcode version","type":"text","hidden":false,"required":false,"index":false},{"name":"physical_memory","description":"Total physical memory in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hardware_vendor","description":"Hardware vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hardware model","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_version","description":"Hardware version","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_serial","description":"Device serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"board_vendor","description":"Board vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"board_model","description":"Board model","type":"text","hidden":false,"required":false,"index":false},{"name":"board_version","description":"Board version","type":"text","hidden":false,"required":false,"index":false},{"name":"board_serial","description":"Board serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Friendly computer name (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Local hostname (optional)","type":"text","hidden":false,"required":false,"index":false}]},{"name":"systemd_units","description":"Track systemd units.","platforms":["linux"],"columns":[{"name":"id","description":"Unique unit identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Unit description","type":"text","hidden":false,"required":false,"index":false},{"name":"load_state","description":"Reflects whether the unit definition was properly loaded","type":"text","hidden":false,"required":false,"index":false},{"name":"active_state","description":"The high-level unit activation state, i.e. generalization of SUB","type":"text","hidden":false,"required":false,"index":false},{"name":"sub_state","description":"The low-level unit activation state, values depend on unit type","type":"text","hidden":false,"required":false,"index":false},{"name":"following","description":"The name of another unit that this unit follows in state","type":"text","hidden":false,"required":false,"index":false},{"name":"object_path","description":"The object path for this unit","type":"text","hidden":false,"required":false,"index":false},{"name":"job_id","description":"Next queued job id","type":"bigint","hidden":false,"required":false,"index":false},{"name":"job_type","description":"Job type","type":"text","hidden":false,"required":false,"index":false},{"name":"job_path","description":"The object path for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"fragment_path","description":"The unit file path this unit was read from, if there is any","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"The configured user, if any","type":"text","hidden":false,"required":false,"index":false},{"name":"source_path","description":"Path to the (possibly generated) unit configuration file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"temperature_sensors","description":"Machine's temperature sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on OS X","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of temperature source","type":"text","hidden":false,"required":false,"index":false},{"name":"celsius","description":"Temperature in Celsius","type":"double","hidden":false,"required":false,"index":false},{"name":"fahrenheit","description":"Temperature in Fahrenheit","type":"double","hidden":false,"required":false,"index":false}]},{"name":"time","description":"Track current date and time in the system.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"weekday","description":"Current weekday in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"year","description":"Current year in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"month","description":"Current month in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"day","description":"Current day in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"hour","description":"Current hour in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Current minutes in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Current seconds in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"timezone","description":"Current timezone in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"local_time","description":"Current local UNIX time in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"local_timezone","description":"Current local timezone in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"unix_time","description":"Current UNIX time in the system, converted to UTC if --utc enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"timestamp","description":"Current timestamp (log format) in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Current date and time (ISO format) in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"iso_8601","description":"Current time (ISO format) in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"win_timestamp","description":"Timestamp value in 100 nanosecond units.","type":"bigint","hidden":true,"required":false,"index":false}]},{"name":"time_machine_backups","description":"Backups to drives using TimeMachine.","platforms":["darwin"],"columns":[{"name":"destination_id","description":"Time Machine destination ID","type":"text","hidden":false,"required":false,"index":false},{"name":"backup_date","description":"Backup Date","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"time_machine_destinations","description":"Locations backed up to using Time Machine.","platforms":["darwin"],"columns":[{"name":"alias","description":"Human readable name of drive","type":"text","hidden":false,"required":false,"index":false},{"name":"destination_id","description":"Time Machine destination ID","type":"text","hidden":false,"required":false,"index":false},{"name":"consistency_scan_date","description":"Consistency scan date","type":"integer","hidden":false,"required":false,"index":false},{"name":"root_volume_uuid","description":"Root UUID of backup volume","type":"text","hidden":false,"required":false,"index":false},{"name":"bytes_available","description":"Bytes available on volume","type":"integer","hidden":false,"required":false,"index":false},{"name":"bytes_used","description":"Bytes used on volume","type":"integer","hidden":false,"required":false,"index":false},{"name":"encryption","description":"Last known encrypted state","type":"text","hidden":false,"required":false,"index":false}]},{"name":"tpm_info","description":"A table that lists the TPM related information.","platforms":["windows"],"columns":[{"name":"activated","description":"TPM is activated","type":"integer","hidden":false,"required":false,"index":false},{"name":"enabled","description":"TPM is enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"owned","description":"TPM is ownned","type":"integer","hidden":false,"required":false,"index":false},{"name":"manufacturer_version","description":"TPM version","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer_id","description":"TPM manufacturers ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"manufacturer_name","description":"TPM manufacturers name","type":"text","hidden":false,"required":false,"index":false},{"name":"product_name","description":"Product name of the TPM","type":"text","hidden":false,"required":false,"index":false},{"name":"physical_presence_version","description":"Version of the Physical Presence Interface","type":"text","hidden":false,"required":false,"index":false},{"name":"spec_version","description":"Trusted Computing Group specification that the TPM supports","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ulimit_info","description":"System resource usage limits.","platforms":["darwin","linux"],"columns":[{"name":"type","description":"System resource to be limited","type":"text","hidden":false,"required":false,"index":false},{"name":"soft_limit","description":"Current limit value","type":"text","hidden":false,"required":false,"index":false},{"name":"hard_limit","description":"Maximum limit value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"uptime","description":"Track time passed since last boot. Some systems track this as calendar time, some as runtime.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"days","description":"Days of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"hours","description":"Hours of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Minutes of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Seconds of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"total_seconds","description":"Total uptime seconds","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"usb_devices","description":"USB devices that are actively plugged into the host system.","platforms":["darwin","linux"],"columns":[{"name":"usb_address","description":"USB Device used address","type":"integer","hidden":false,"required":false,"index":false},{"name":"usb_port","description":"USB Device used port","type":"integer","hidden":false,"required":false,"index":false},{"name":"vendor","description":"USB Device vendor string","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded USB Device vendor identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"USB Device version number","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"USB Device model string","type":"text","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded USB Device model identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"USB Device serial connection","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"USB Device class","type":"text","hidden":false,"required":false,"index":false},{"name":"subclass","description":"USB Device subclass","type":"text","hidden":false,"required":false,"index":false},{"name":"protocol","description":"USB Device protocol","type":"text","hidden":false,"required":false,"index":false},{"name":"removable","description":"1 If USB device is removable else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"user_events","description":"Track user events from the audit framework.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the event","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"The file description for the process socket","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Supplied path from event","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"The Internet protocol address or family ID","type":"text","hidden":false,"required":false,"index":false},{"name":"terminal","description":"The network protocol ID","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"user_groups","description":"Local system user group relationships.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"user_interaction_events","description":"Track user interaction events from macOS' event tapping framework.","platforms":["darwin"],"columns":[{"name":"time","description":"Time","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"user_ssh_keys","description":"Returns the private keys in the users ~/.ssh directory and whether or not they are encrypted.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"The local user that owns the key file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to key file","type":"text","hidden":false,"required":false,"index":false},{"name":"encrypted","description":"1 if key is encrypted, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"key_type","description":"The type of the private key. One of [rsa, dsa, dh, ec, hmac, cmac], or the empty string.","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"userassist","description":"UserAssist Registry Key tracks when a user executes an application from Windows Explorer.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of times the application has been executed.","type":"integer","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","hidden":true,"required":false,"index":false},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"video_info","description":"Retrieve video card information of the machine.","platforms":["windows"],"columns":[{"name":"color_depth","description":"The amount of bits per pixel to represent color.","type":"integer","hidden":false,"required":false,"index":false},{"name":"driver","description":"The driver of the device.","type":"text","hidden":false,"required":false,"index":false},{"name":"driver_date","description":"The date listed on the installed driver.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"driver_version","description":"The version of the installed driver.","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the gpu.","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the gpu.","type":"text","hidden":false,"required":false,"index":false},{"name":"series","description":"The series of the gpu.","type":"text","hidden":false,"required":false,"index":false},{"name":"video_mode","description":"The current resolution of the display.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"virtual_memory_info","description":"Darwin Virtual Memory statistics.","platforms":["darwin"],"columns":[{"name":"free","description":"Total number of free pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"active","description":"Total number of active pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Total number of inactive pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"speculative","description":"Total number of speculative pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"throttled","description":"Total number of throttled pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"wired","description":"Total number of wired down pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"purgeable","description":"Total number of purgeable pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"faults","description":"Total number of calls to vm_faults.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"copy","description":"Total number of copy-on-write pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"zero_fill","description":"Total number of zero filled pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"reactivated","description":"Total number of reactivated pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"purged","description":"Total number of purged pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"file_backed","description":"Total number of file backed pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"anonymous","description":"Total number of anonymous pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uncompressed","description":"Total number of uncompressed pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"compressor","description":"The number of pages used to store compressed VM pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"decompressed","description":"The total number of pages that have been decompressed by the VM compressor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"compressed","description":"The total number of pages that have been compressed by the VM compressor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"page_ins","description":"The total number of requests for pages from a pager.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"page_outs","description":"Total number of pages paged out.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_ins","description":"The total number of compressed pages that have been swapped out to disk.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_outs","description":"The total number of compressed pages that have been swapped back in from disk.","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"wifi_networks","description":"OS X known/remembered Wi-Fi networks list.","platforms":["darwin"],"columns":[{"name":"ssid","description":"SSID octets of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","hidden":false,"required":false,"index":false},{"name":"last_connected","description":"Last time this netword was connected to as a unix_time","type":"integer","hidden":false,"required":false,"index":false},{"name":"passpoint","description":"1 if Passpoint is supported, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"possibly_hidden","description":"1 if network is possibly a hidden network, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"roaming","description":"1 if roaming is supported, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"roaming_profile","description":"Describe the roaming profile, usually one of Single, Dual or Multi","type":"text","hidden":false,"required":false,"index":false},{"name":"captive_portal","description":"1 if this network has a captive portal, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"auto_login","description":"1 if auto login is enabled, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"temporarily_disabled","description":"1 if this network is temporarily disabled, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 if this network is disabled, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"wifi_status","description":"OS X current WiFi status.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","hidden":false,"required":false,"index":false},{"name":"transmit_rate","description":"The current transmit rate","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"The current operating mode for the Wi-Fi interface","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wifi_survey","description":"Scan for nearby WiFi networks.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"winbaseobj","description":"Lists named Windows objects in the default object directories, across all terminal services sessions. Example Windows ojbect types include Mutexes, Events, Jobs and Semaphors.","platforms":["windows"],"columns":[{"name":"session_id","description":"Terminal Services Session Id","type":"integer","hidden":false,"required":false,"index":false},{"name":"object_name","description":"Object Name","type":"text","hidden":false,"required":false,"index":false},{"name":"object_type","description":"Object Type","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_crashes","description":"Extracted information from Windows crash logs (Minidumps).","platforms":["windows"],"columns":[{"name":"datetime","description":"Timestamp (log format) of the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"module","description":"Path of the crashed module within the process","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the executable file for the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID of the crashed process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID of the crashed thread","type":"bigint","hidden":false,"required":false,"index":false},{"name":"version","description":"File version info of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"process_uptime","description":"Uptime of the process in seconds","type":"bigint","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Multiple stack frames from the stack trace","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_code","description":"The Windows exception code","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_message","description":"The NTSTATUS error message associated with the exception code","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_address","description":"Address (in hex) where the exception occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"registers","description":"The values of the system registers","type":"text","hidden":false,"required":false,"index":false},{"name":"command_line","description":"Command-line string passed to the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"current_directory","description":"Current working directory of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Username of the user who ran the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"machine_name","description":"Name of the machine where the crash happened","type":"text","hidden":false,"required":false,"index":false},{"name":"major_version","description":"Windows major version of the machine","type":"integer","hidden":false,"required":false,"index":false},{"name":"minor_version","description":"Windows minor version of the machine","type":"integer","hidden":false,"required":false,"index":false},{"name":"build_number","description":"Windows build number of the crashing machine","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of crash log","type":"text","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Path of the log file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_eventlog","description":"Table for querying all recorded Windows event logs.","platforms":["windows"],"columns":[{"name":"channel","description":"Source or channel of the event","type":"text","hidden":false,"required":true,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"level","description":"Severity level associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID which emitted the event record","type":"integer","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID which emitted the event record","type":"integer","hidden":false,"required":false,"index":false},{"name":"time_range","description":"System time to selectively filter the events","type":"text","hidden":true,"required":false,"index":false},{"name":"timestamp","description":"Timestamp to selectively filter the events","type":"text","hidden":true,"required":false,"index":false},{"name":"xpath","description":"The custom query to filter events","type":"text","hidden":true,"required":true,"index":false}]},{"name":"windows_events","description":"Windows Event logs.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received","type":"bigint","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source or channel of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"level","description":"The severity level associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"windows_optional_features","description":"Lists names and installation states of windows features. Maps to Win32_OptionalFeature WMI class.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the feature","type":"text","hidden":false,"required":false,"index":false},{"name":"caption","description":"Caption of feature in settings UI","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Installation state value. 1 == Enabled, 2 == Disabled, 3 == Absent","type":"integer","hidden":false,"required":false,"index":false},{"name":"statename","description":"Installation state name. 'Enabled','Disabled','Absent'","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_security_center","description":"The health status of Window Security features. Health values can be \"Good\", \"Poor\". \"Snoozed\", \"Not Monitored\", and \"Error\".","platforms":["windows"],"columns":[{"name":"firewall","description":"The health of the monitored Firewall (see windows_security_products)","type":"text","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"The health of the Windows Autoupdate feature","type":"text","hidden":false,"required":false,"index":false},{"name":"antivirus","description":"The health of the monitored Antivirus solution (see windows_security_products)","type":"text","hidden":false,"required":false,"index":false},{"name":"antispyware","description":"The health of the monitored Antispyware solution (see windows_security_products)","type":"text","hidden":false,"required":false,"index":false},{"name":"internet_settings","description":"The health of the Internet Settings","type":"text","hidden":false,"required":false,"index":false},{"name":"windows_security_center_service","description":"The health of the Windows Security Center Service","type":"text","hidden":false,"required":false,"index":false},{"name":"user_account_control","description":"The health of the User Account Control (UAC) capability in Windows","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_security_products","description":"Enumeration of registered Windows security products.","platforms":["windows"],"columns":[{"name":"type","description":"Type of security product","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of product","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"State of protection","type":"text","hidden":false,"required":false,"index":false},{"name":"state_timestamp","description":"Timestamp for the product state","type":"text","hidden":false,"required":false,"index":false},{"name":"remediation_path","description":"Remediation path","type":"text","hidden":false,"required":false,"index":false},{"name":"signatures_up_to_date","description":"1 if product signatures are up to date, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"wmi_bios_info","description":"Lists important information from the system bios.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the Bios setting","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the Bios setting","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_cli_event_consumers","description":"WMI CommandLineEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique name of a consumer.","type":"text","hidden":false,"required":false,"index":false},{"name":"command_line_template","description":"Standard string template that specifies the process to be started. This property can be NULL, and the ExecutablePath property is used as the command line.","type":"text","hidden":false,"required":false,"index":false},{"name":"executable_path","description":"Module to execute. The string can specify the full path and file name of the module to execute, or it can specify a partial name. If a partial name is specified, the current drive and current directory are assumed.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_event_filters","description":"Lists WMI event filters.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier of an event filter.","type":"text","hidden":false,"required":false,"index":false},{"name":"query","description":"Windows Management Instrumentation Query Language (WQL) event query that specifies the set of events for consumer notification, and the specific conditions for notification.","type":"text","hidden":false,"required":false,"index":false},{"name":"query_language","description":"Query language that the query is written in.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_filter_consumer_binding","description":"Lists the relationship between event consumers and filters.","platforms":["windows"],"columns":[{"name":"consumer","description":"Reference to an instance of __EventConsumer that represents the object path to a logical consumer, the recipient of an event.","type":"text","hidden":false,"required":false,"index":false},{"name":"filter","description":"Reference to an instance of __EventFilter that represents the object path to an event filter which is a query that specifies the type of event to be received.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_script_event_consumers","description":"WMI ActiveScriptEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier for the event consumer. ","type":"text","hidden":false,"required":false,"index":false},{"name":"scripting_engine","description":"Name of the scripting engine to use, for example, 'VBScript'. This property cannot be NULL.","type":"text","hidden":false,"required":false,"index":false},{"name":"script_file_name","description":"Name of the file from which the script text is read, intended as an alternative to specifying the text of the script in the ScriptText property.","type":"text","hidden":false,"required":false,"index":false},{"name":"script_text","description":"Text of the script that is expressed in a language known to the scripting engine. This property must be NULL if the ScriptFileName property is not NULL.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"xprotect_entries","description":"Database of the machine's XProtect signatures.","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","hidden":false,"required":false,"index":false},{"name":"launch_type","description":"Launch services content type","type":"text","hidden":false,"required":false,"index":false},{"name":"identity","description":"XProtect identity (SHA1) of content","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Use this file name to match","type":"text","hidden":false,"required":false,"index":false},{"name":"filetype","description":"Use this file type to match","type":"text","hidden":false,"required":false,"index":false},{"name":"optional","description":"Match any of the identities/patterns for this XProtect name","type":"integer","hidden":false,"required":false,"index":false},{"name":"uses_pattern","description":"Uses a match pattern instead of identity","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"xprotect_meta","description":"Database of the machine's XProtect browser-related signatures.","platforms":["darwin"],"columns":[{"name":"identifier","description":"Browser plugin or extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Either plugin or extension","type":"text","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Developer identity (SHA1) of extension","type":"text","hidden":false,"required":false,"index":false},{"name":"min_version","description":"The minimum allowed plugin version.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"xprotect_reports","description":"Database of XProtect matches (if user generated/sent an XProtect report).","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","hidden":false,"required":false,"index":false},{"name":"user_action","description":"Action taken by user after prompted","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Quarantine alert time","type":"text","hidden":false,"required":false,"index":false}]},{"name":"yara","description":"Track YARA matches for files or PIDs.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"The path scanned","type":"text","hidden":false,"required":true,"index":false},{"name":"matches","description":"List of YARA matches","type":"text","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","hidden":false,"required":false,"index":false},{"name":"sig_group","description":"Signature group used","type":"text","hidden":false,"required":false,"index":false},{"name":"sigfile","description":"Signature file used","type":"text","hidden":false,"required":false,"index":false},{"name":"sigrule","description":"Signature strings used","type":"text","hidden":true,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","hidden":false,"required":false,"index":false},{"name":"sigurl","description":"Signature url","type":"text","hidden":true,"required":false,"index":false}]},{"name":"yara_events","description":"Track YARA matches for files specified in configuration data.","platforms":["darwin","linux","windows"],"columns":[{"name":"target_path","description":"The path scanned","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file","type":"text","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","hidden":false,"required":false,"index":false},{"name":"matches","description":"List of YARA matches","type":"text","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","hidden":false,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of the scan","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"ycloud_instance_metadata","description":"Yandex.Cloud instance metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"instance_id","description":"Unique identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"folder_id","description":"Folder identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"hostname","description":"Hostname of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_port_enabled","description":"Indicates if serial port is enabled for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"metadata_endpoint","description":"Endpoint used to fetch VM metadata","type":"text","hidden":false,"required":false,"index":false}]},{"name":"yum_sources","description":"Current list of Yum repositories or software channels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Repository name","type":"text","hidden":false,"required":false,"index":false},{"name":"baseurl","description":"Repository base URL","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether the repository is used","type":"text","hidden":false,"required":false,"index":false},{"name":"gpgcheck","description":"Whether packages are GPG checked","type":"text","hidden":false,"required":false,"index":false},{"name":"gpgkey","description":"URL to GPG key","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]}] \ No newline at end of file +[{"name":"account_policy_data","description":"Additional OS X user account data from the AccountPolicy section of OpenDirectory.","platforms":["darwin"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the account was first created","type":"double","hidden":false,"required":false,"index":false},{"name":"failed_login_count","description":"The number of failed login attempts using an incorrect password. Count resets after a correct password is entered.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"failed_login_timestamp","description":"The time of the last failed login attempt. Resets after a correct password is entered","type":"double","hidden":false,"required":false,"index":false},{"name":"password_last_set_time","description":"The time the password was last changed","type":"double","hidden":false,"required":false,"index":false}]},{"name":"acpi_tables","description":"Firmware ACPI functional table common metadata and content.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"ACPI table name","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of compiled table data","type":"integer","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table content","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ad_config","description":"OS X Active Directory configuration.","platforms":["darwin"],"columns":[{"name":"name","description":"The OS X-specific configuration name","type":"text","hidden":false,"required":false,"index":false},{"name":"domain","description":"Active Directory trust domain","type":"text","hidden":false,"required":false,"index":false},{"name":"option","description":"Canonical name of option","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Variable typed option value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"alf","description":"OS X application layer firewall (ALF) service details.","platforms":["darwin"],"columns":[{"name":"allow_signed_enabled","description":"1 If allow signed mode is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"firewall_unload","description":"1 If firewall unloading enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"global_state","description":"1 If the firewall is enabled with exceptions, 2 if the firewall is configured to block all incoming connections, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"logging_enabled","description":"1 If logging mode is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"logging_option","description":"Firewall logging option","type":"integer","hidden":false,"required":false,"index":false},{"name":"stealth_enabled","description":"1 If stealth mode is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"version","description":"Application Layer Firewall version","type":"text","hidden":false,"required":false,"index":false}]},{"name":"alf_exceptions","description":"OS X application layer firewall (ALF) service exceptions.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to the executable that is excepted","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Firewall exception state","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"alf_explicit_auths","description":"ALF services explicitly allowed to perform networking.","platforms":["darwin"],"columns":[{"name":"process","description":"Process name explicitly allowed","type":"text","hidden":false,"required":false,"index":false}]},{"name":"app_schemes","description":"OS X application schemes and handlers (e.g., http, file, mailto).","platforms":["darwin"],"columns":[{"name":"scheme","description":"Name of the scheme/protocol","type":"text","hidden":false,"required":false,"index":false},{"name":"handler","description":"Application label for the handler","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this handler is the OS default, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"external","description":"1 if this handler does NOT exist on OS X by default, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"protected","description":"1 if this handler is protected (reserved) by OS X, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"apparmor_events","description":"Track AppArmor events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"Raw audit message","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false},{"name":"apparmor","description":"Apparmor Status like ALLOWED, DENIED etc.","type":"text","hidden":false,"required":false,"index":false},{"name":"operation","description":"Permission requested by the process","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process PID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"profile","description":"Apparmor profile name","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","hidden":false,"required":false,"index":false},{"name":"denied_mask","description":"Denied permissions for the process","type":"text","hidden":false,"required":false,"index":false},{"name":"capname","description":"Capability requested by the process","type":"text","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"ouid","description":"Object owner's user ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"capability","description":"Capability number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"requested_mask","description":"Requested access mask","type":"text","hidden":false,"required":false,"index":false},{"name":"info","description":"Additional information","type":"text","hidden":false,"required":false,"index":false},{"name":"error","description":"Error information","type":"text","hidden":false,"required":false,"index":false},{"name":"namespace","description":"AppArmor namespace","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"AppArmor label","type":"text","hidden":false,"required":false,"index":false}]},{"name":"apparmor_profiles","description":"Track active AppArmor profiles.","platforms":["linux"],"columns":[{"name":"path","description":"Unique, aa-status compatible, policy identifier.","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Policy name.","type":"text","hidden":false,"required":false,"index":false},{"name":"attach","description":"Which executable(s) a profile will attach to.","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"How the policy is applied.","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"A unique hash that identifies this policy.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"appcompat_shims","description":"Application Compatibility shims are a way to persist malware. This table presents the AppCompat Shim information from the registry in a nice format. See http://files.brucon.org/2015/Tomczak_and_Ballenthin_Shims_for_the_Win.pdf for more details.","platforms":["windows"],"columns":[{"name":"executable","description":"Name of the executable that is being shimmed. This is pulled from the registry.","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the SDB database.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the SDB.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Install time of the SDB","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the SDB database.","type":"text","hidden":false,"required":false,"index":false},{"name":"sdb_id","description":"Unique GUID of the SDB.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"apps","description":"OS X applications installed in known search paths (e.g., /Applications).","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the Name.app folder","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute and full Name.app path","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_executable","description":"Info properties CFBundleExecutable label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_identifier","description":"Info properties CFBundleIdentifier label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_name","description":"Info properties CFBundleName label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_short_version","description":"Info properties CFBundleShortVersionString label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_version","description":"Info properties CFBundleVersion label","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_package_type","description":"Info properties CFBundlePackageType label","type":"text","hidden":false,"required":false,"index":false},{"name":"environment","description":"Application-set environment variables","type":"text","hidden":false,"required":false,"index":false},{"name":"element","description":"Does the app identify as a background agent","type":"text","hidden":false,"required":false,"index":false},{"name":"compiler","description":"Info properties DTCompiler label","type":"text","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Info properties CFBundleDevelopmentRegion label","type":"text","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Info properties CFBundleDisplayName label","type":"text","hidden":false,"required":false,"index":false},{"name":"info_string","description":"Info properties CFBundleGetInfoString label","type":"text","hidden":false,"required":false,"index":false},{"name":"minimum_system_version","description":"Minimum version of OS X required for the app to run","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The UTI that categorizes the app for the App Store","type":"text","hidden":false,"required":false,"index":false},{"name":"applescript_enabled","description":"Info properties NSAppleScriptEnabled label","type":"text","hidden":false,"required":false,"index":false},{"name":"copyright","description":"Info properties NSHumanReadableCopyright label","type":"text","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"The time that the app was last used","type":"double","hidden":false,"required":false,"index":false}]},{"name":"apt_sources","description":"Current list of APT repositories or software channels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Repository name","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source file","type":"text","hidden":false,"required":false,"index":false},{"name":"base_uri","description":"Repository base URI","type":"text","hidden":false,"required":false,"index":false},{"name":"release","description":"Release name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Repository source version","type":"text","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Repository maintainer","type":"text","hidden":false,"required":false,"index":false},{"name":"components","description":"Repository components","type":"text","hidden":false,"required":false,"index":false},{"name":"architectures","description":"Repository architectures","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"arp_cache","description":"Address resolution cache, both static and dynamic (from ARP, NDP).","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"address","description":"IPv4 address target","type":"text","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address of broadcasted address","type":"text","hidden":false,"required":false,"index":false},{"name":"interface","description":"Interface of the network for the MAC","type":"text","hidden":false,"required":false,"index":false},{"name":"permanent","description":"1 for true, 0 for false","type":"text","hidden":false,"required":false,"index":false}]},{"name":"asl","description":"Queries the Apple System Log data structure for system events.","platforms":["darwin"],"columns":[{"name":"time","description":"Unix timestamp. Set automatically","type":"integer","hidden":false,"required":false,"index":false},{"name":"time_nano_sec","description":"Nanosecond time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"host","description":"Sender's address (set by the server).","type":"text","hidden":false,"required":false,"index":false},{"name":"sender","description":"Sender's identification string. Default is process name.","type":"text","hidden":false,"required":false,"index":false},{"name":"facility","description":"Sender's facility. Default is 'user'.","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Sending process ID encoded as a string. Set automatically.","type":"integer","hidden":false,"required":false,"index":false},{"name":"gid","description":"GID that sent the log message (set by the server).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"UID that sent the log message (set by the server).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"level","description":"Log level number. See levels in asl.h.","type":"integer","hidden":false,"required":false,"index":false},{"name":"message","description":"Message text.","type":"text","hidden":false,"required":false,"index":false},{"name":"ref_pid","description":"Reference PID for messages proxied by launchd","type":"integer","hidden":false,"required":false,"index":false},{"name":"ref_proc","description":"Reference process for messages proxied by launchd","type":"text","hidden":false,"required":false,"index":false},{"name":"extra","description":"Extra columns, in JSON format. Queries against this column are performed entirely in SQLite, so do not benefit from efficient querying via asl.h.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"atom_packages","description":"Lists all atom packages in a directory or globally installed in a system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Package supplied description","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Package's package.json path","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License for package","type":"text","hidden":false,"required":false,"index":false},{"name":"homepage","description":"Package supplied homepage","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the plugin","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"augeas","description":"Configuration files parsed by augeas.","platforms":["darwin","linux"],"columns":[{"name":"node","description":"The node path of the configuration item","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"The value of the configuration item","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"The label of the configuration item","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"The path to the configuration file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authenticode","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["windows"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"original_program_name","description":"The original program name that the publisher has signed","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The certificate serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_name","description":"The certificate issuer name","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_name","description":"The certificate subject name","type":"text","hidden":false,"required":false,"index":false},{"name":"result","description":"The signature check result","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authorization_mechanisms","description":"OS X Authorization mechanisms database.","platforms":["darwin"],"columns":[{"name":"label","description":"Label of the authorization right","type":"text","hidden":false,"required":false,"index":false},{"name":"plugin","description":"Authorization plugin name","type":"text","hidden":false,"required":false,"index":false},{"name":"mechanism","description":"Name of the mechanism that will be called","type":"text","hidden":false,"required":false,"index":false},{"name":"privileged","description":"If privileged it will run as root, else as an anonymous user","type":"text","hidden":false,"required":false,"index":false},{"name":"entry","description":"The whole string entry","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authorizations","description":"OS X Authorization rights database.","platforms":["darwin"],"columns":[{"name":"label","description":"Item name, usually in reverse domain format","type":"text","hidden":false,"required":false,"index":false},{"name":"modified","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"allow_root","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"timeout","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"tries","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"authenticate_user","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"shared","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"session_owner","description":"Label top-level key","type":"text","hidden":false,"required":false,"index":false}]},{"name":"authorized_keys","description":"A line-delimited authorized_keys table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local owner of authorized_keys file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"algorithm","description":"algorithm of key","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"parsed authorized keys line","type":"text","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to the authorized_keys file","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"autoexec","description":"Aggregate of executables that will automatically execute on the target machine. This is an amalgamation of other tables like services, scheduled_tasks, startup_items and more.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the executable","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the program","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source table of the autoexec item","type":"text","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_metadata","description":"Azure instance metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"location","description":"Azure Region the VM is running in","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"offer","description":"Offer information for the VM image (Azure image gallery VMs only)","type":"text","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Publisher of the VM image","type":"text","hidden":false,"required":false,"index":false},{"name":"sku","description":"SKU for the VM image","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the VM image","type":"text","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Linux or Windows","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_update_domain","description":"Update domain the VM is running in","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_fault_domain","description":"Fault domain the VM is running in","type":"text","hidden":false,"required":false,"index":false},{"name":"vm_id","description":"Unique identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"vm_size","description":"VM size","type":"text","hidden":false,"required":false,"index":false},{"name":"subscription_id","description":"Azure subscription for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"resource_group_name","description":"Resource group for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"placement_group_id","description":"Placement group for the VM scale set","type":"text","hidden":false,"required":false,"index":false},{"name":"vm_scale_set_name","description":"VM scale set name","type":"text","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_tags","description":"Azure instance tags.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"vm_id","description":"Unique identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"The tag key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"The tag value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"background_activities_moderator","description":"Background Activities Moderator (BAM) tracks application execution.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"battery","description":"Provides information about the internal battery of a Macbook.","platforms":["darwin"],"columns":[{"name":"manufacturer","description":"The battery manufacturer's name","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacture_date","description":"The date the battery was manufactured UNIX Epoch","type":"integer","hidden":false,"required":false,"index":false},{"name":"model","description":"The battery's model number","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The battery's unique serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"cycle_count","description":"The number of charge/discharge cycles","type":"integer","hidden":false,"required":false,"index":false},{"name":"health","description":"One of the following: \"Good\" describes a well-performing battery, \"Fair\" describes a functional battery with limited capacity, or \"Poor\" describes a battery that's not capable of providing power","type":"text","hidden":false,"required":false,"index":false},{"name":"condition","description":"One of the following: \"Normal\" indicates the condition of the battery is within normal tolerances, \"Service Needed\" indicates that the battery should be checked out by a licensed Mac repair service, \"Permanent Failure\" indicates the battery needs replacement","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"One of the following: \"AC Power\" indicates the battery is connected to an external power source, \"Battery Power\" indicates that the battery is drawing internal power, \"Off Line\" indicates the battery is off-line or no longer connected","type":"text","hidden":false,"required":false,"index":false},{"name":"charging","description":"1 if the battery is currently being charged by a power source. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"charged","description":"1 if the battery is currently completely charged. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"designed_capacity","description":"The battery's designed capacity in mAh","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"The battery's actual capacity when it is fully charged in mAh","type":"integer","hidden":false,"required":false,"index":false},{"name":"current_capacity","description":"The battery's current charged capacity in mAh","type":"integer","hidden":false,"required":false,"index":false},{"name":"percent_remaining","description":"The percentage of battery remaining before it is drained","type":"integer","hidden":false,"required":false,"index":false},{"name":"amperage","description":"The battery's current amperage in mA","type":"integer","hidden":false,"required":false,"index":false},{"name":"voltage","description":"The battery's current voltage in mV","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes_until_empty","description":"The number of minutes until the battery is fully depleted. This value is -1 if this time is still being calculated","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes_to_full_charge","description":"The number of minutes until the battery is fully charged. This value is -1 if this time is still being calculated","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"bitlocker_info","description":"Retrieve bitlocker status of the machine.","platforms":["windows"],"columns":[{"name":"device_id","description":"ID of the encrypted drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"Drive letter of the encrypted drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"persistent_volume_id","description":"Persistent ID of the drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"conversion_status","description":"The bitlocker conversion status of the drive.","type":"integer","hidden":false,"required":false,"index":false},{"name":"protection_status","description":"The bitlocker protection status of the drive.","type":"integer","hidden":false,"required":false,"index":false},{"name":"encryption_method","description":"The encryption type of the device.","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The FVE metadata version of the drive.","type":"integer","hidden":false,"required":false,"index":false},{"name":"percentage_encrypted","description":"The percentage of the drive that is encrypted.","type":"integer","hidden":false,"required":false,"index":false},{"name":"lock_status","description":"The accessibility status of the drive from Windows.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"block_devices","description":"Block (buffered access) device file nodes: disks, ramdisks, and DMG containers.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Block device name","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Block device parent name","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Block device vendor string","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"Block device model string identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Block device size in blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Block device Universally Unique Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Block device type string","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"Block device label string","type":"text","hidden":false,"required":false,"index":false}]},{"name":"bpf_process_events","description":"Track time/action process executions.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Binary path","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments","type":"text","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","hidden":false,"required":false,"index":false},{"name":"json_cmdline","description":"Command line arguments, in JSON format","type":"text","hidden":true,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"bpf_socket_events","description":"Track network socket opens and closes.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"The socket type","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","hidden":false,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"browser_plugins","description":"All C/NPAPI browser plugin details for all users.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the plugin","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Plugin display name","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Plugin identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Plugin short version","type":"text","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Build SDK used to compile plugin","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Plugin description text","type":"text","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Plugin language-localization","type":"text","hidden":false,"required":false,"index":false},{"name":"native","description":"Plugin requires native execution","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","hidden":false,"required":false,"index":false},{"name":"disabled","description":"Is the plugin disabled. 1 = Disabled","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"carbon_black_info","description":"Returns info about a Carbon Black sensor install.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"sensor_id","description":"Sensor ID of the Carbon Black sensor","type":"integer","hidden":false,"required":false,"index":false},{"name":"config_name","description":"Sensor group","type":"text","hidden":false,"required":false,"index":false},{"name":"collect_store_files","description":"If the sensor is configured to send back binaries to the Carbon Black server","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_module_loads","description":"If the sensor is configured to capture module loads","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_module_info","description":"If the sensor is configured to collect metadata of binaries","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_file_mods","description":"If the sensor is configured to collect file modification events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_reg_mods","description":"If the sensor is configured to collect registry modification events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_net_conns","description":"If the sensor is configured to collect network connections","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_processes","description":"If the sensor is configured to process events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_cross_processes","description":"If the sensor is configured to cross process events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_emet_events","description":"If the sensor is configured to EMET events","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_data_file_writes","description":"If the sensor is configured to collect non binary file writes","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_process_user_context","description":"If the sensor is configured to collect the user running a process","type":"integer","hidden":false,"required":false,"index":false},{"name":"collect_sensor_operations","description":"Unknown","type":"integer","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_mb","description":"Event file disk quota in MB","type":"integer","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_percentage","description":"Event file disk quota in a percentage","type":"integer","hidden":false,"required":false,"index":false},{"name":"protection_disabled","description":"If the sensor is configured to report tamper events","type":"integer","hidden":false,"required":false,"index":false},{"name":"sensor_ip_addr","description":"IP address of the sensor","type":"text","hidden":false,"required":false,"index":false},{"name":"sensor_backend_server","description":"Carbon Black server","type":"text","hidden":false,"required":false,"index":false},{"name":"event_queue","description":"Size in bytes of Carbon Black event files on disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"binary_queue","description":"Size in bytes of binaries waiting to be sent to Carbon Black server","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"carves","description":"List the set of completed and in-progress carves. If carve=1 then the query is treated as a new carve request.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"time","description":"Time at which the carve was kicked off","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sha256","description":"A SHA256 sum of the carved archive","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the carved archive","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the requested carve","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the carve, can be STARTING, PENDING, SUCCESS, or FAILED","type":"text","hidden":false,"required":false,"index":false},{"name":"carve_guid","description":"Identifying value of the carve session","type":"text","hidden":false,"required":false,"index":false},{"name":"request_id","description":"Identifying value of the carve request (e.g., scheduled query name, distributed request, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"carve","description":"Set this value to '1' to start a file carve","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"certificates","description":"Certificate Authorities installed in Keychains/ca-bundles.","platforms":["darwin","windows"],"columns":[{"name":"common_name","description":"Certificate CommonName","type":"text","hidden":false,"required":false,"index":false},{"name":"subject","description":"Certificate distinguished name","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer","description":"Certificate issuer distinguished name","type":"text","hidden":false,"required":false,"index":false},{"name":"ca","description":"1 if CA: true (certificate is an authority) else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"self_signed","description":"1 if self-signed, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"not_valid_before","description":"Lower bound of valid date","type":"text","hidden":false,"required":false,"index":false},{"name":"not_valid_after","description":"Certificate expiration data","type":"text","hidden":false,"required":false,"index":false},{"name":"signing_algorithm","description":"Signing algorithm used","type":"text","hidden":false,"required":false,"index":false},{"name":"key_algorithm","description":"Key algorithm used","type":"text","hidden":false,"required":false,"index":false},{"name":"key_strength","description":"Key size used for RSA/DSA, or curve name","type":"text","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Certificate key usage and extended key usage","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_key_id","description":"SKID an optionally included SHA1","type":"text","hidden":false,"required":false,"index":false},{"name":"authority_key_id","description":"AKID an optionally included SHA1","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the raw certificate contents","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Keychain or PEM bundle","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"Certificate serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"sid","description":"SID","type":"text","hidden":true,"required":false,"index":false},{"name":"store_location","description":"Certificate system store location","type":"text","hidden":true,"required":false,"index":false},{"name":"store","description":"Certificate system store","type":"text","hidden":true,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":true,"required":false,"index":false},{"name":"store_id","description":"Exists for service/user stores. Contains raw store id provided by WinAPI.","type":"text","hidden":true,"required":false,"index":false}]},{"name":"chassis_info","description":"Display information pertaining to the chassis and its security status.","platforms":["windows"],"columns":[{"name":"audible_alarm","description":"If TRUE, the frame is equipped with an audible alarm.","type":"text","hidden":false,"required":false,"index":false},{"name":"breach_description","description":"If provided, gives a more detailed description of a detected security breach.","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_types","description":"A comma-separated list of chassis types, such as Desktop or Laptop.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"An extended description of the chassis if available.","type":"text","hidden":false,"required":false,"index":false},{"name":"lock","description":"If TRUE, the frame is equipped with a lock.","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"security_breach","description":"The physical status of the chassis such as Breach Successful, Breach Attempted, etc.","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"smbios_tag","description":"The assigned asset tag number of the chassis.","type":"text","hidden":false,"required":false,"index":false},{"name":"sku","description":"The Stock Keeping Unit number if available.","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"If available, gives various operational or nonoperational statuses such as OK, Degraded, and Pred Fail.","type":"text","hidden":false,"required":false,"index":false},{"name":"visible_alarm","description":"If TRUE, the frame is equipped with a visual alarm.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"chocolatey_packages","description":"Chocolatey packages installed in a system.","platforms":["windows"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this package resides","type":"text","hidden":false,"required":false,"index":false}]},{"name":"chrome_extension_content_scripts","description":"Chrome browser extension content scripts.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave)","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"script","description":"The content script used by the extension","type":"text","hidden":false,"required":false,"index":false},{"name":"match","description":"The pattern that the script is matched against","type":"text","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"chrome_extensions","description":"Chrome-based browser extensions.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave, edge, edge_beta)","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension display name","type":"text","hidden":false,"required":false,"index":false},{"name":"profile","description":"The name of the Chrome profile that contains this extension","type":"text","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","hidden":false,"required":false,"index":false},{"name":"referenced_identifier","description":"Extension identifier, as specified by the preferences file. Empty if the extension is not in the profile.","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier, computed from its manifest. Empty in case of error.","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Extension-optional description","type":"text","hidden":false,"required":false,"index":false},{"name":"default_locale","description":"Default locale supported by extension","type":"text","hidden":false,"required":false,"index":false},{"name":"current_locale","description":"Current locale supported by extension","type":"text","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","hidden":false,"required":false,"index":false},{"name":"persistent","description":"1 If extension is persistent across all tabs else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions","description":"The permissions required by the extension","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions_json","description":"The JSON-encoded permissions required by the extension","type":"text","hidden":true,"required":false,"index":false},{"name":"optional_permissions","description":"The permissions optionally required by the extensions","type":"text","hidden":false,"required":false,"index":false},{"name":"optional_permissions_json","description":"The JSON-encoded permissions optionally required by the extensions","type":"text","hidden":true,"required":false,"index":false},{"name":"manifest_hash","description":"The SHA256 hash of the manifest.json file","type":"text","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","hidden":false,"required":false,"index":false},{"name":"from_webstore","description":"True if this extension was installed from the web store","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"1 if this extension is enabled","type":"text","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Extension install time, in its original Webkit format","type":"text","hidden":false,"required":false,"index":false},{"name":"install_timestamp","description":"Extension install time, converted to unix time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"manifest_json","description":"The manifest file of the extension","type":"text","hidden":true,"required":false,"index":false},{"name":"key","description":"The extension key, from the manifest file","type":"text","hidden":true,"required":false,"index":false}]},{"name":"connectivity","description":"Provides the overall system's network state.","platforms":["windows"],"columns":[{"name":"disconnected","description":"True if the all interfaces are not connected to any network","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_no_traffic","description":"True if any interface is connected via IPv4, but has seen no traffic","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_no_traffic","description":"True if any interface is connected via IPv6, but has seen no traffic","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_subnet","description":"True if any interface is connected to the local subnet via IPv4","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_local_network","description":"True if any interface is connected to a routed network via IPv4","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_internet","description":"True if any interface is connected to the Internet via IPv4","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_subnet","description":"True if any interface is connected to the local subnet via IPv6","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_local_network","description":"True if any interface is connected to a routed network via IPv6","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_internet","description":"True if any interface is connected to the Internet via IPv6","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"cpu_info","description":"Retrieve cpu hardware info of the machine.","platforms":["windows"],"columns":[{"name":"device_id","description":"The DeviceID of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"processor_type","description":"The processor type, such as Central, Math, or Video.","type":"text","hidden":false,"required":false,"index":false},{"name":"availability","description":"The availability and status of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_status","description":"The current operating status of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"number_of_cores","description":"The number of cores of the CPU.","type":"text","hidden":false,"required":false,"index":false},{"name":"logical_processors","description":"The number of logical processors of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"address_width","description":"The width of the CPU address bus.","type":"text","hidden":false,"required":false,"index":false},{"name":"current_clock_speed","description":"The current frequency of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_clock_speed","description":"The maximum possible frequency of the CPU.","type":"integer","hidden":false,"required":false,"index":false},{"name":"socket_designation","description":"The assigned socket on the board for the given CPU.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"cpu_time","description":"Displays information from /proc/stat file about the time the cpu cores spent in different parts of the system.","platforms":["darwin","linux"],"columns":[{"name":"core","description":"Name of the cpu (core)","type":"integer","hidden":false,"required":false,"index":false},{"name":"user","description":"Time spent in user mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"nice","description":"Time spent in user mode with low priority (nice)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system","description":"Time spent in system mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"idle","description":"Time spent in the idle task","type":"bigint","hidden":false,"required":false,"index":false},{"name":"iowait","description":"Time spent waiting for I/O to complete","type":"bigint","hidden":false,"required":false,"index":false},{"name":"irq","description":"Time spent servicing interrupts","type":"bigint","hidden":false,"required":false,"index":false},{"name":"softirq","description":"Time spent servicing softirqs","type":"bigint","hidden":false,"required":false,"index":false},{"name":"steal","description":"Time spent in other operating systems when running in a virtualized environment","type":"bigint","hidden":false,"required":false,"index":false},{"name":"guest","description":"Time spent running a virtual CPU for a guest OS under the control of the Linux kernel","type":"bigint","hidden":false,"required":false,"index":false},{"name":"guest_nice","description":"Time spent running a niced guest ","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"cpuid","description":"Useful CPU features from the cpuid ASM call.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"feature","description":"Present feature flags","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Bit value or string","type":"text","hidden":false,"required":false,"index":false},{"name":"output_register","description":"Register used to for feature value","type":"text","hidden":false,"required":false,"index":false},{"name":"output_bit","description":"Bit in register value for feature value","type":"integer","hidden":false,"required":false,"index":false},{"name":"input_eax","description":"Value of EAX used","type":"text","hidden":false,"required":false,"index":false}]},{"name":"crashes","description":"Application, System, and Mobile App crash logs.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of crash log","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID of the crashed process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Location of log file","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Identifier of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version info of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent PID of the crashed process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"responsible","description":"Process responsible for the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the crashed process","type":"integer","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Date/Time at which the crash occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"crashed_thread","description":"Thread ID which crashed","type":"bigint","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Most recent frame from the stack trace","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_type","description":"Exception type of the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_codes","description":"Exception codes from the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_notes","description":"Exception notes from the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"registers","description":"The value of the system registers","type":"text","hidden":false,"required":false,"index":false}]},{"name":"crontab","description":"Line parsed values from system and user cron/tab.","platforms":["darwin","linux"],"columns":[{"name":"event","description":"The job @event name (rare)","type":"text","hidden":false,"required":false,"index":false},{"name":"minute","description":"The exact minute for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"hour","description":"The hour of the day for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"day_of_month","description":"The day of the month for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"month","description":"The month of the year for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"day_of_week","description":"The day of the week for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"command","description":"Raw command string","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"File parsed","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"cups_destinations","description":"Returns all configured printers.","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the printer","type":"text","hidden":false,"required":false,"index":false},{"name":"option_name","description":"Option name","type":"text","hidden":false,"required":false,"index":false},{"name":"option_value","description":"Option value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"cups_jobs","description":"Returns all completed print jobs from cups.","platforms":["darwin"],"columns":[{"name":"title","description":"Title of the printed job","type":"text","hidden":false,"required":false,"index":false},{"name":"destination","description":"The printer the job was sent to","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"The user who printed the job","type":"text","hidden":false,"required":false,"index":false},{"name":"format","description":"The format of the print job","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the print job","type":"integer","hidden":false,"required":false,"index":false},{"name":"completed_time","description":"When the job completed printing","type":"integer","hidden":false,"required":false,"index":false},{"name":"processing_time","description":"How long the job took to process","type":"integer","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the print request was initiated","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"curl","description":"Perform an http request and return stats about it.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"url","description":"The url for the request","type":"text","hidden":false,"required":true,"index":false},{"name":"method","description":"The HTTP method for the request","type":"text","hidden":false,"required":false,"index":false},{"name":"user_agent","description":"The user-agent string to use for the request","type":"text","hidden":false,"required":false,"index":false},{"name":"response_code","description":"The HTTP status code for the response","type":"integer","hidden":false,"required":false,"index":false},{"name":"round_trip_time","description":"Time taken to complete the request","type":"bigint","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of bytes in the response","type":"bigint","hidden":false,"required":false,"index":false},{"name":"result","description":"The HTTP response body","type":"text","hidden":false,"required":false,"index":false}]},{"name":"curl_certificate","description":"Inspect TLS certificates by connecting to input hostnames.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"hostname","description":"Hostname (domain[:port]) to CURL","type":"text","hidden":false,"required":true,"index":false},{"name":"common_name","description":"Common name of company issued to","type":"text","hidden":false,"required":false,"index":false},{"name":"organization","description":"Organization issued to","type":"text","hidden":false,"required":false,"index":false},{"name":"organization_unit","description":"Organization unit issued to","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Certificate serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_common_name","description":"Issuer common name","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_organization","description":"Issuer organization","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_organization_unit","description":"Issuer organization unit","type":"text","hidden":false,"required":false,"index":false},{"name":"valid_from","description":"Period of validity start date","type":"text","hidden":false,"required":false,"index":false},{"name":"valid_to","description":"Period of validity end date","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256_fingerprint","description":"SHA-256 fingerprint","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1_fingerprint","description":"SHA1 fingerprint","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version Number","type":"integer","hidden":false,"required":false,"index":false},{"name":"signature_algorithm","description":"Signature Algorithm","type":"text","hidden":false,"required":false,"index":false},{"name":"signature","description":"Signature","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_key_identifier","description":"Subject Key Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"authority_key_identifier","description":"Authority Key Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Usage of key in certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"extended_key_usage","description":"Extended usage of key in certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"policies","description":"Certificate Policies","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_alternative_names","description":"Subject Alternative Name","type":"text","hidden":false,"required":false,"index":false},{"name":"issuer_alternative_names","description":"Issuer Alternative Name","type":"text","hidden":false,"required":false,"index":false},{"name":"info_access","description":"Authority Information Access","type":"text","hidden":false,"required":false,"index":false},{"name":"subject_info_access","description":"Subject Information Access","type":"text","hidden":false,"required":false,"index":false},{"name":"policy_mappings","description":"Policy Mappings","type":"text","hidden":false,"required":false,"index":false},{"name":"has_expired","description":"1 if the certificate has expired, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"basic_constraint","description":"Basic Constraints","type":"text","hidden":false,"required":false,"index":false},{"name":"name_constraints","description":"Name Constraints","type":"text","hidden":false,"required":false,"index":false},{"name":"policy_constraints","description":"Policy Constraints","type":"text","hidden":false,"required":false,"index":false},{"name":"dump_certificate","description":"Set this value to '1' to dump certificate","type":"integer","hidden":true,"required":false,"index":false},{"name":"timeout","description":"Set this value to the timeout in seconds to complete the TLS handshake (default 4s, use 0 for no timeout)","type":"integer","hidden":true,"required":false,"index":false},{"name":"pem","description":"Certificate PEM format","type":"text","hidden":false,"required":false,"index":false}]},{"name":"deb_packages","description":"The installed DEB package database.","platforms":["linux"],"columns":[{"name":"name","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Package source","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"arch","description":"Package architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"revision","description":"Package revision","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Package status","type":"text","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Package maintainer","type":"text","hidden":false,"required":false,"index":false},{"name":"section","description":"Package section","type":"text","hidden":false,"required":false,"index":false},{"name":"priority","description":"Package priority","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"default_environment","description":"Default environment variables and values.","platforms":["windows"],"columns":[{"name":"variable","description":"Name of the environment variable","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the environment variable","type":"text","hidden":false,"required":false,"index":false},{"name":"expand","description":"1 if the variable needs expanding, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"device_file","description":"Similar to the file table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number","type":"text","hidden":false,"required":true,"index":false},{"name":"path","description":"A logical path within the device node","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Creation time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","hidden":false,"required":false,"index":false}]},{"name":"device_firmware","description":"A best-effort list of discovered firmware versions.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of device","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"The device name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Firmware version","type":"text","hidden":false,"required":false,"index":false}]},{"name":"device_hash","description":"Similar to the hash table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number","type":"text","hidden":false,"required":true,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided inode data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided inode data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided inode data","type":"text","hidden":false,"required":false,"index":false}]},{"name":"device_partitions","description":"Use TSK to enumerate details about partitions on a disk device.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number or description","type":"integer","hidden":false,"required":false,"index":false},{"name":"label","description":"","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Byte size of each block","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Number of blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Number of meta nodes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flags","description":"","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"disk_encryption","description":"Disk encryption status and information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Disk name","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Disk Universally Unique Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"encrypted","description":"1 If encrypted: true (disk is encrypted), else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Description of cipher type and mode if available","type":"text","hidden":false,"required":false,"index":false},{"name":"encryption_status","description":"Disk encryption status with one of following values: encrypted | not encrypted | undefined","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Currently authenticated user if available","type":"text","hidden":false,"required":false,"index":false},{"name":"user_uuid","description":"UUID of authenticated user if available","type":"text","hidden":false,"required":false,"index":false},{"name":"filevault_status","description":"FileVault status with one of following values: on | off | unknown","type":"text","hidden":false,"required":false,"index":false}]},{"name":"disk_events","description":"Track DMG disk image events (appearance/disappearance) when opened.","platforms":["darwin"],"columns":[{"name":"action","description":"Appear or disappear","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the DMG file accessed","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Disk event name","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"Disk event BSD name","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"UUID of the volume inside DMG if available","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of partition in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ejectable","description":"1 if ejectable, 0 if not","type":"integer","hidden":false,"required":false,"index":false},{"name":"mountable","description":"1 if mountable, 0 if not","type":"integer","hidden":false,"required":false,"index":false},{"name":"writable","description":"1 if writable, 0 if not","type":"integer","hidden":false,"required":false,"index":false},{"name":"content","description":"Disk event content","type":"text","hidden":false,"required":false,"index":false},{"name":"media_name","description":"Disk event media name string","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Disk event vendor string","type":"text","hidden":false,"required":false,"index":false},{"name":"filesystem","description":"Filesystem if available","type":"text","hidden":false,"required":false,"index":false},{"name":"checksum","description":"UDIF Master checksum if available (CRC32)","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of appearance/disappearance in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"disk_info","description":"Retrieve basic information about the physical disks of a system.","platforms":["windows"],"columns":[{"name":"partitions","description":"Number of detected partitions on disk.","type":"integer","hidden":false,"required":false,"index":false},{"name":"disk_index","description":"Physical drive number of the disk.","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"The interface type of the disk.","type":"text","hidden":false,"required":false,"index":false},{"name":"id","description":"The unique identifier of the drive on the system.","type":"text","hidden":false,"required":false,"index":false},{"name":"pnp_device_id","description":"The unique identifier of the drive on the system.","type":"text","hidden":false,"required":false,"index":false},{"name":"disk_size","description":"Size of the disk.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the disk.","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hard drive model.","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"The label of the disk object.","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the disk.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"The OS's description of the disk.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"dns_cache","description":"Enumerate the DNS cache using the undocumented DnsGetCacheDataTable function in dnsapi.dll.","platforms":["windows"],"columns":[{"name":"name","description":"DNS record name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"DNS record type","type":"text","hidden":false,"required":false,"index":false},{"name":"flags","description":"DNS record flags","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"dns_resolvers","description":"Resolvers used by this host.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Address type index or order","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Address type: sortlist, nameserver, search","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Resolver IP/IPv6 address","type":"text","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Address (sortlist) netmask length","type":"text","hidden":false,"required":false,"index":false},{"name":"options","description":"Resolver options","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"docker_container_fs_changes","description":"Changes to files or directories on container's filesystem.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":true,"index":false},{"name":"path","description":"FIle or directory path relative to rootfs","type":"text","hidden":false,"required":false,"index":false},{"name":"change_type","description":"Type of change: C:Modified, A:Added, D:Deleted","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_labels","description":"Docker container labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_mounts","description":"Docker container mounts.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of mount (bind, volume)","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Optional mount name","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source path on host","type":"text","hidden":false,"required":false,"index":false},{"name":"destination","description":"Destination path inside container","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver providing the mount","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"Mount options (rw, ro)","type":"text","hidden":false,"required":false,"index":false},{"name":"rw","description":"1 if read/write. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"propagation","description":"Mount propagation","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_networks","description":"Docker container networks.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Network name","type":"text","hidden":false,"required":false,"index":false},{"name":"network_id","description":"Network ID","type":"text","hidden":false,"required":false,"index":false},{"name":"endpoint_id","description":"Endpoint ID","type":"text","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Gateway","type":"text","hidden":false,"required":false,"index":false},{"name":"ip_address","description":"IP address","type":"text","hidden":false,"required":false,"index":false},{"name":"ip_prefix_len","description":"IP subnet prefix length","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv6_gateway","description":"IPv6 gateway","type":"text","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","hidden":false,"required":false,"index":false},{"name":"ipv6_prefix_len","description":"IPv6 subnet prefix length","type":"integer","hidden":false,"required":false,"index":false},{"name":"mac_address","description":"MAC address","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_container_ports","description":"Docker container ports.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Protocol (tcp, udp)","type":"text","hidden":false,"required":false,"index":false},{"name":"port","description":"Port inside the container","type":"integer","hidden":false,"required":false,"index":false},{"name":"host_ip","description":"Host IP address on which public port is listening","type":"text","hidden":false,"required":false,"index":false},{"name":"host_port","description":"Host port","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"docker_container_processes","description":"Docker container processes.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":true,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start in seconds since boot (non-sleeping)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"user","description":"User name","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Cumulative CPU time. [DD-]HH:MM:SS format","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu","description":"CPU utilization as percentage","type":"double","hidden":false,"required":false,"index":false},{"name":"mem","description":"Memory utilization as percentage","type":"double","hidden":false,"required":false,"index":false}]},{"name":"docker_container_stats","description":"Docker container statistics. Queries on this table take at least one second.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":true,"index":false},{"name":"name","description":"Container name","type":"text","hidden":false,"required":false,"index":false},{"name":"pids","description":"Number of processes","type":"integer","hidden":false,"required":false,"index":false},{"name":"read","description":"UNIX time when stats were read","type":"bigint","hidden":false,"required":false,"index":false},{"name":"preread","description":"UNIX time when stats were last read","type":"bigint","hidden":false,"required":false,"index":false},{"name":"interval","description":"Difference between read and preread in nano-seconds","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_read","description":"Total disk read bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_write","description":"Total disk write bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"num_procs","description":"Number of processors","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_total_usage","description":"Total CPU usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_kernelmode_usage","description":"CPU kernel mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_usermode_usage","description":"CPU user mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_cpu_usage","description":"CPU system usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"online_cpus","description":"Online CPUs","type":"integer","hidden":false,"required":false,"index":false},{"name":"pre_cpu_total_usage","description":"Last read total CPU usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_cpu_kernelmode_usage","description":"Last read CPU kernel mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_cpu_usermode_usage","description":"Last read CPU user mode usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_system_cpu_usage","description":"Last read CPU system usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pre_online_cpus","description":"Last read online CPUs","type":"integer","hidden":false,"required":false,"index":false},{"name":"memory_usage","description":"Memory usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"memory_max_usage","description":"Memory maximum usage","type":"bigint","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"Memory limit","type":"bigint","hidden":false,"required":false,"index":false},{"name":"network_rx_bytes","description":"Total network bytes read","type":"bigint","hidden":false,"required":false,"index":false},{"name":"network_tx_bytes","description":"Total network bytes transmitted","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"docker_containers","description":"Docker containers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Container name","type":"text","hidden":false,"required":false,"index":false},{"name":"image","description":"Docker image (name) used to launch this container","type":"text","hidden":false,"required":false,"index":false},{"name":"image_id","description":"Docker image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"command","description":"Command with arguments","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"state","description":"Container state (created, restarting, running, removing, paused, exited, dead)","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Container status information","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Identifier of the initial process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Container path","type":"text","hidden":false,"required":false,"index":false},{"name":"config_entrypoint","description":"Container entrypoint(s)","type":"text","hidden":false,"required":false,"index":false},{"name":"started_at","description":"Container start time as string","type":"text","hidden":false,"required":false,"index":false},{"name":"finished_at","description":"Container finish time as string","type":"text","hidden":false,"required":false,"index":false},{"name":"privileged","description":"Is the container privileged","type":"integer","hidden":false,"required":false,"index":false},{"name":"security_options","description":"List of container security options","type":"text","hidden":false,"required":false,"index":false},{"name":"env_variables","description":"Container environmental variables","type":"text","hidden":false,"required":false,"index":false},{"name":"readonly_rootfs","description":"Is the root filesystem mounted as read only","type":"integer","hidden":false,"required":false,"index":false},{"name":"cgroup_namespace","description":"cgroup namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"ipc_namespace","description":"IPC namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"mnt_namespace","description":"Mount namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"net_namespace","description":"Network namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"pid_namespace","description":"PID namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"user_namespace","description":"User namespace","type":"text","hidden":true,"required":false,"index":false},{"name":"uts_namespace","description":"UTS namespace","type":"text","hidden":true,"required":false,"index":false}]},{"name":"docker_image_history","description":"Docker image history information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of instruction in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"created_by","description":"Created by instruction","type":"text","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of tags","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Instruction comment","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_image_labels","description":"Docker image labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_image_layers","description":"Docker image layers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"layer_id","description":"Layer ID","type":"text","hidden":false,"required":false,"index":false},{"name":"layer_order","description":"Layer Order (1 = base layer)","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"docker_images","description":"Docker images information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size_bytes","description":"Size of image in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of repository tags","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_info","description":"Docker system information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Docker system ID","type":"text","hidden":false,"required":false,"index":false},{"name":"containers","description":"Total number of containers","type":"integer","hidden":false,"required":false,"index":false},{"name":"containers_running","description":"Number of containers currently running","type":"integer","hidden":false,"required":false,"index":false},{"name":"containers_paused","description":"Number of containers in paused state","type":"integer","hidden":false,"required":false,"index":false},{"name":"containers_stopped","description":"Number of containers in stopped state","type":"integer","hidden":false,"required":false,"index":false},{"name":"images","description":"Number of images","type":"integer","hidden":false,"required":false,"index":false},{"name":"storage_driver","description":"Storage driver","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"1 if memory limit support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"swap_limit","description":"1 if swap limit support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"kernel_memory","description":"1 if kernel memory limit support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_period","description":"1 if CPU Completely Fair Scheduler (CFS) period support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_quota","description":"1 if CPU Completely Fair Scheduler (CFS) quota support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_shares","description":"1 if CPU share weighting support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_set","description":"1 if CPU set selection support is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_forwarding","description":"1 if IPv4 forwarding is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"bridge_nf_iptables","description":"1 if bridge netfilter iptables is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"bridge_nf_ip6tables","description":"1 if bridge netfilter ip6tables is enabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"oom_kill_disable","description":"1 if Out-of-memory kill is disabled. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"logging_driver","description":"Logging driver","type":"text","hidden":false,"required":false,"index":false},{"name":"cgroup_driver","description":"Control groups driver","type":"text","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Operating system type","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"cpus","description":"Number of CPUs","type":"integer","hidden":false,"required":false,"index":false},{"name":"memory","description":"Total memory","type":"bigint","hidden":false,"required":false,"index":false},{"name":"http_proxy","description":"HTTP proxy","type":"text","hidden":false,"required":false,"index":false},{"name":"https_proxy","description":"HTTPS proxy","type":"text","hidden":false,"required":false,"index":false},{"name":"no_proxy","description":"Comma-separated list of domain extensions proxy should not be used for","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the docker host","type":"text","hidden":false,"required":false,"index":false},{"name":"server_version","description":"Server version","type":"text","hidden":false,"required":false,"index":false},{"name":"root_dir","description":"Docker root directory","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_network_labels","description":"Docker network labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_networks","description":"Docker networks information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Network name","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Network driver","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"enable_ipv6","description":"1 if IPv6 is enabled on this network. 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"subnet","description":"Network subnet","type":"text","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Network gateway","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_version","description":"Docker version information.","platforms":["darwin","linux"],"columns":[{"name":"version","description":"Docker version","type":"text","hidden":false,"required":false,"index":false},{"name":"api_version","description":"API version","type":"text","hidden":false,"required":false,"index":false},{"name":"min_api_version","description":"Minimum API version supported","type":"text","hidden":false,"required":false,"index":false},{"name":"git_commit","description":"Docker build git commit","type":"text","hidden":false,"required":false,"index":false},{"name":"go_version","description":"Go version","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","hidden":false,"required":false,"index":false},{"name":"arch","description":"Hardware architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Build time","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_volume_labels","description":"Docker volume labels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Label key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"docker_volumes","description":"Docker volumes information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Volume driver","type":"text","hidden":false,"required":false,"index":false},{"name":"mount_point","description":"Mount point","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Volume type","type":"text","hidden":false,"required":false,"index":false}]},{"name":"drivers","description":"Details for in-use Windows device drivers. This does not display installed but unused drivers.","platforms":["windows"],"columns":[{"name":"device_id","description":"Device ID","type":"text","hidden":false,"required":false,"index":false},{"name":"device_name","description":"Device name","type":"text","hidden":false,"required":false,"index":false},{"name":"image","description":"Path to driver image file","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Driver description","type":"text","hidden":false,"required":false,"index":false},{"name":"service","description":"Driver service name, if one exists","type":"text","hidden":false,"required":false,"index":false},{"name":"service_key","description":"Driver service registry key","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Driver version","type":"text","hidden":false,"required":false,"index":false},{"name":"inf","description":"Associated inf file","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Device/driver class name","type":"text","hidden":false,"required":false,"index":false},{"name":"provider","description":"Driver provider","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Device manufacturer","type":"text","hidden":false,"required":false,"index":false},{"name":"driver_key","description":"Driver key","type":"text","hidden":false,"required":false,"index":false},{"name":"date","description":"Driver date","type":"bigint","hidden":false,"required":false,"index":false},{"name":"signed","description":"Whether the driver is signed or not","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_metadata","description":"EC2 instance metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","hidden":false,"required":false,"index":false},{"name":"instance_type","description":"EC2 instance type","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture of this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"region","description":"AWS region in which this instance launched","type":"text","hidden":false,"required":false,"index":false},{"name":"availability_zone","description":"Availability zone in which this instance launched","type":"text","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Private IPv4 DNS hostname of the first interface of this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"local_ipv4","description":"Private IPv4 address of the first interface of this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address for the first network interface of this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"security_groups","description":"Comma separated list of security group names","type":"text","hidden":false,"required":false,"index":false},{"name":"iam_arn","description":"If there is an IAM role associated with the instance, contains instance profile ARN","type":"text","hidden":false,"required":false,"index":false},{"name":"ami_id","description":"AMI ID used to launch this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"reservation_id","description":"ID of the reservation","type":"text","hidden":false,"required":false,"index":false},{"name":"account_id","description":"AWS account ID which owns this EC2 instance","type":"text","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_tags","description":"EC2 instance tag key value pairs.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Tag key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Tag value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"elf_dynamic","description":"ELF dynamic section information.","platforms":["linux"],"columns":[{"name":"tag","description":"Tag ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"value","description":"Tag value","type":"integer","hidden":false,"required":false,"index":false},{"name":"class","description":"Class (32 or 64)","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_info","description":"ELF file information.","platforms":["linux"],"columns":[{"name":"class","description":"Class type, 32 or 64bit","type":"text","hidden":false,"required":false,"index":false},{"name":"abi","description":"Section type","type":"text","hidden":false,"required":false,"index":false},{"name":"abi_version","description":"Section virtual address in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Offset of section in file","type":"text","hidden":false,"required":false,"index":false},{"name":"machine","description":"Machine type","type":"integer","hidden":false,"required":false,"index":false},{"name":"version","description":"Object file version","type":"integer","hidden":false,"required":false,"index":false},{"name":"entry","description":"Entry point address","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flags","description":"ELF header flags","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_sections","description":"ELF section information.","platforms":["linux"],"columns":[{"name":"name","description":"Section name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Section type","type":"integer","hidden":false,"required":false,"index":false},{"name":"vaddr","description":"Section virtual address in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"offset","description":"Offset of section in file","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of section","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"Section attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"link","description":"Link to other section","type":"text","hidden":false,"required":false,"index":false},{"name":"align","description":"Segment alignment","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_segments","description":"ELF segment information.","platforms":["linux"],"columns":[{"name":"name","description":"Segment type/name","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"Segment offset in file","type":"integer","hidden":false,"required":false,"index":false},{"name":"vaddr","description":"Segment virtual address in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"psize","description":"Size of segment in file","type":"integer","hidden":false,"required":false,"index":false},{"name":"msize","description":"Segment offset in memory","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"Segment attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"align","description":"Segment alignment","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"elf_symbols","description":"ELF symbol list.","platforms":["linux"],"columns":[{"name":"name","description":"Symbol name","type":"text","hidden":false,"required":false,"index":false},{"name":"addr","description":"Symbol address (value)","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of object","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Symbol type","type":"text","hidden":false,"required":false,"index":false},{"name":"binding","description":"Binding type","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"Section table index","type":"integer","hidden":false,"required":false,"index":false},{"name":"table","description":"Table name containing symbol","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to ELF file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"es_process_events","description":"Process execution events from EndpointSecurity.","platforms":["darwin"],"columns":[{"name":"version","description":"Version of EndpointSecurity event","type":"integer","hidden":false,"required":false,"index":false},{"name":"seq_num","description":"Per event sequence number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"global_seq_num","description":"Global sequence number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"original_parent","description":"Original parent process ID in case of reparenting","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline_count","description":"Number of command line arguments","type":"bigint","hidden":false,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","hidden":false,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective User ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective Group ID of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false},{"name":"signing_id","description":"Signature identifier of the process","type":"text","hidden":false,"required":false,"index":false},{"name":"team_id","description":"Team identifier of thd process","type":"text","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Codesigning hash of the process","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_binary","description":"Indicates if the binary is Apple signed binary (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of a process in case of an exit event","type":"integer","hidden":false,"required":false,"index":false},{"name":"child_pid","description":"Process ID of a child process in case of a fork event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"event_type","description":"Type of EndpointSecurity event","type":"text","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"etc_hosts","description":"Line-parsed /etc/hosts.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"address","description":"IP address mapping","type":"text","hidden":false,"required":false,"index":false},{"name":"hostnames","description":"Raw hosts mapping","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"etc_protocols","description":"Line-parsed /etc/protocols.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Protocol name","type":"text","hidden":false,"required":false,"index":false},{"name":"number","description":"Protocol number","type":"integer","hidden":false,"required":false,"index":false},{"name":"alias","description":"Protocol alias","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Comment with protocol description","type":"text","hidden":false,"required":false,"index":false}]},{"name":"etc_services","description":"Line-parsed /etc/services.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Service name","type":"text","hidden":false,"required":false,"index":false},{"name":"port","description":"Service port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"text","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Optional space separated list of other names for a service","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional comment for a service.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"event_taps","description":"Returns information about installed event taps.","platforms":["darwin"],"columns":[{"name":"enabled","description":"Is the Event Tap enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"event_tap_id","description":"Unique ID for the Tap","type":"integer","hidden":false,"required":false,"index":false},{"name":"event_tapped","description":"The mask that identifies the set of events to be observed.","type":"text","hidden":false,"required":false,"index":false},{"name":"process_being_tapped","description":"The process ID of the target application","type":"integer","hidden":false,"required":false,"index":false},{"name":"tapping_process","description":"The process ID of the application that created the event tap.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"example","description":"This is an example table spec.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Description for name column","type":"text","hidden":false,"required":false,"index":false},{"name":"points","description":"This is a signed SQLite int column","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"This is a signed SQLite bigint column","type":"bigint","hidden":false,"required":false,"index":false},{"name":"action","description":"Action performed in generation","type":"text","hidden":false,"required":true,"index":false},{"name":"id","description":"An index of some sort","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of example","type":"text","hidden":false,"required":false,"index":false}]},{"name":"extended_attributes","description":"Returns the extended attributes for files (similar to Windows ADS).","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute file path","type":"text","hidden":false,"required":true,"index":false},{"name":"directory","description":"Directory of file(s)","type":"text","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the value generated from the extended attribute","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"The parsed information from the attribute","type":"text","hidden":false,"required":false,"index":false},{"name":"base64","description":"1 if the value is base64 encoded else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"fan_speed_sensors","description":"Fan speeds.","platforms":["darwin"],"columns":[{"name":"fan","description":"Fan number","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Fan name","type":"text","hidden":false,"required":false,"index":false},{"name":"actual","description":"Actual speed","type":"integer","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimum speed","type":"integer","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum speed","type":"integer","hidden":false,"required":false,"index":false},{"name":"target","description":"Target speed","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"fbsd_kmods","description":"Loaded FreeBSD kernel modules.","platforms":["freebsd"],"columns":[{"name":"name","description":"Module name","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of module content","type":"integer","hidden":false,"required":false,"index":false},{"name":"refs","description":"Module reverse dependencies","type":"integer","hidden":false,"required":false,"index":false},{"name":"address","description":"Kernel module address","type":"text","hidden":false,"required":false,"index":false}]},{"name":"file","description":"Interactive filesystem attributes and metadata.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"path","description":"Absolute file path","type":"text","hidden":false,"required":true,"index":false},{"name":"directory","description":"Directory of file(s)","type":"text","hidden":false,"required":true,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"Device ID (optional)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"btime","description":"(B)irth or (cr)eate time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","hidden":false,"required":false,"index":false},{"name":"symlink","description":"1 if the path is a symlink, otherwise 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","hidden":false,"required":false,"index":false},{"name":"attributes","description":"File attrib string. See: https://ss64.com/nt/attrib.html","type":"text","hidden":true,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number","type":"text","hidden":true,"required":false,"index":false},{"name":"file_id","description":"file ID","type":"text","hidden":true,"required":false,"index":false},{"name":"file_version","description":"File version","type":"text","hidden":true,"required":false,"index":false},{"name":"product_version","description":"File product version","type":"text","hidden":true,"required":false,"index":false},{"name":"bsd_flags","description":"The BSD file flags (chflags). Possible values: NODUMP, UF_IMMUTABLE, UF_APPEND, OPAQUE, HIDDEN, ARCHIVED, SF_IMMUTABLE, SF_APPEND","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"file_events","description":"Track time/action changes to files specified in configuration data.","platforms":["darwin","linux"],"columns":[{"name":"target_path","description":"The path associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file defined in the config","type":"text","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"md5","description":"The MD5 of the file after change","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"The SHA1 of the file after change","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256","description":"The SHA256 of the file after change","type":"text","hidden":false,"required":false,"index":false},{"name":"hashed","description":"1 if the file was hashed, 0 if not, -1 if hashing failed","type":"integer","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"firefox_addons","description":"Firefox browser extensions, webapps, and addons.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"The local user that owns the addon","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Addon display name","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Addon identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"creator","description":"Addon-supported creator string","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Extension, addon, webapp","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Addon-supplied version string","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Addon-supplied description string","type":"text","hidden":false,"required":false,"index":false},{"name":"source_url","description":"URL that installed the addon","type":"text","hidden":false,"required":false,"index":false},{"name":"visible","description":"1 If the addon is shown in browser else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If the addon is active else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 If the addon is application-disabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"1 If the addon applies background updates else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"native","description":"1 If the addon includes binary components else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"location","description":"Global, profile location","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper","description":"OS X Gatekeeper Details.","platforms":["darwin"],"columns":[{"name":"assessments_enabled","description":"1 If a Gatekeeper is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"dev_id_enabled","description":"1 If a Gatekeeper allows execution from identified developers else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of Gatekeeper's gke.bundle","type":"text","hidden":false,"required":false,"index":false},{"name":"opaque_version","description":"Version of Gatekeeper's gkopaque.bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper_approved_apps","description":"Gatekeeper apps a user has allowed to run.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of executable allowed to run","type":"text","hidden":false,"required":false,"index":false},{"name":"requirement","description":"Code signing requirement language","type":"text","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last change time","type":"double","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"double","hidden":false,"required":false,"index":false}]},{"name":"groups","description":"Local system groups.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","hidden":true,"required":false,"index":false},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","hidden":true,"required":false,"index":false},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"hardware_events","description":"Hardware (PCI/USB/HID) events from UDEV or IOKit.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"Remove, insert, change properties, etc","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Local device path assigned (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of hardware and hardware event","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver claiming the device","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Hardware device vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded Hardware vendor identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"Hardware device model","type":"text","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded Hardware model identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"Device serial (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"revision","description":"Device revision (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of hardware event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"hash","description":"Filesystem hash data.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"directory","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"ssdeep","description":"ssdeep hash of provided filesystem data","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"homebrew_packages","description":"The installed homebrew package database.","platforms":["darwin"],"columns":[{"name":"name","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Package install path","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Current 'linked' version","type":"text","hidden":false,"required":false,"index":false},{"name":"prefix","description":"Homebrew install prefix","type":"text","hidden":true,"required":false,"index":false}]},{"name":"hvci_status","description":"Retrieve HVCI info of the machine.","platforms":["windows"],"columns":[{"name":"version","description":"The version number of the Device Guard build.","type":"text","hidden":false,"required":false,"index":false},{"name":"instance_identifier","description":"The instance ID of Device Guard.","type":"text","hidden":false,"required":false,"index":false},{"name":"vbs_status","description":"The status of the virtualization based security settings. Returns UNKNOWN if an error is encountered.","type":"text","hidden":false,"required":false,"index":false},{"name":"code_integrity_policy_enforcement_status","description":"The status of the code integrity policy enforcement settings. Returns UNKNOWN if an error is encountered.","type":"text","hidden":false,"required":false,"index":false},{"name":"umci_policy_status","description":"The status of the User Mode Code Integrity security settings. Returns UNKNOWN if an error is encountered.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ibridge_info","description":"Information about the Apple iBridge hardware controller.","platforms":["darwin"],"columns":[{"name":"boot_uuid","description":"Boot UUID of the iBridge controller","type":"text","hidden":false,"required":false,"index":false},{"name":"coprocessor_version","description":"The manufacturer and chip version","type":"text","hidden":false,"required":false,"index":false},{"name":"firmware_version","description":"The build version of the firmware","type":"text","hidden":false,"required":false,"index":false},{"name":"unique_chip_id","description":"Unique id of the iBridge controller","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ie_extensions","description":"Internet Explorer browser extensions.","platforms":["windows"],"columns":[{"name":"name","description":"Extension display name","type":"text","hidden":false,"required":false,"index":false},{"name":"registry_path","description":"Extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the executable","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executable","type":"text","hidden":false,"required":false,"index":false}]},{"name":"intel_me_info","description":"Intel ME/CSE Info.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"version","description":"Intel ME version","type":"text","hidden":false,"required":false,"index":false}]},{"name":"interface_addresses","description":"Network interfaces and relevant metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for interface","type":"text","hidden":false,"required":false,"index":false},{"name":"mask","description":"Interface netmask","type":"text","hidden":false,"required":false,"index":false},{"name":"broadcast","description":"Broadcast address for the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"point_to_point","description":"PtP address for the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of address. One of dhcp, manual, auto, other, unknown","type":"text","hidden":false,"required":false,"index":false},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","hidden":true,"required":false,"index":false}]},{"name":"interface_details","description":"Detailed information and stats of network interfaces.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC of interface (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Interface type (includes virtual)","type":"integer","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Network MTU","type":"integer","hidden":false,"required":false,"index":false},{"name":"metric","description":"Metric based on the speed of the interface","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags (netdevice) for the device","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipackets","description":"Input packets","type":"bigint","hidden":false,"required":false,"index":false},{"name":"opackets","description":"Output packets","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ibytes","description":"Input bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"obytes","description":"Output bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ierrors","description":"Input errors","type":"bigint","hidden":false,"required":false,"index":false},{"name":"oerrors","description":"Output errors","type":"bigint","hidden":false,"required":false,"index":false},{"name":"idrops","description":"Input drops","type":"bigint","hidden":false,"required":false,"index":false},{"name":"odrops","description":"Output drops","type":"bigint","hidden":false,"required":false,"index":false},{"name":"collisions","description":"Packet Collisions detected","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Time of last device modification (optional)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"link_speed","description":"Interface speed in Mb/s","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pci_slot","description":"PCI slot number","type":"text","hidden":true,"required":false,"index":false},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","hidden":true,"required":false,"index":false},{"name":"description","description":"Short description of the object a one-line string.","type":"text","hidden":true,"required":false,"index":false},{"name":"manufacturer","description":"Name of the network adapter's manufacturer.","type":"text","hidden":true,"required":false,"index":false},{"name":"connection_id","description":"Name of the network connection as it appears in the Network Connections Control Panel program.","type":"text","hidden":true,"required":false,"index":false},{"name":"connection_status","description":"State of the network adapter connection to the network.","type":"text","hidden":true,"required":false,"index":false},{"name":"enabled","description":"Indicates whether the adapter is enabled or not.","type":"integer","hidden":true,"required":false,"index":false},{"name":"physical_adapter","description":"Indicates whether the adapter is a physical or a logical adapter.","type":"integer","hidden":true,"required":false,"index":false},{"name":"speed","description":"Estimate of the current bandwidth in bits per second.","type":"integer","hidden":true,"required":false,"index":false},{"name":"service","description":"The name of the service the network adapter uses.","type":"text","hidden":true,"required":false,"index":false},{"name":"dhcp_enabled","description":"If TRUE, the dynamic host configuration protocol (DHCP) server automatically assigns an IP address to the computer system when establishing a network connection.","type":"integer","hidden":true,"required":false,"index":false},{"name":"dhcp_lease_expires","description":"Expiration date and time for a leased IP address that was assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","hidden":true,"required":false,"index":false},{"name":"dhcp_lease_obtained","description":"Date and time the lease was obtained for the IP address assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","hidden":true,"required":false,"index":false},{"name":"dhcp_server","description":"IP address of the dynamic host configuration protocol (DHCP) server.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_domain","description":"Organization name followed by a period and an extension that indicates the type of organization, such as 'microsoft.com'.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_domain_suffix_search_order","description":"Array of DNS domain suffixes to be appended to the end of host names during name resolution.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_host_name","description":"Host name used to identify the local computer for authentication by some utilities.","type":"text","hidden":true,"required":false,"index":false},{"name":"dns_server_search_order","description":"Array of server IP addresses to be used in querying for DNS servers.","type":"text","hidden":true,"required":false,"index":false}]},{"name":"interface_ipv6","description":"IPv6 configuration and stats of network interfaces.","platforms":["darwin","linux"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"hop_limit","description":"Current Hop Limit","type":"integer","hidden":false,"required":false,"index":false},{"name":"forwarding_enabled","description":"Enable IP forwarding","type":"integer","hidden":false,"required":false,"index":false},{"name":"redirect_accept","description":"Accept ICMP redirect messages","type":"integer","hidden":false,"required":false,"index":false},{"name":"rtadv_accept","description":"Accept ICMP Router Advertisement","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"iokit_devicetree","description":"The IOKit registry matching the DeviceTree plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Device node name","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent device registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"device_path","description":"Device tree path","type":"text","hidden":false,"required":false,"index":false},{"name":"service","description":"1 if the device conforms to IOService else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the device is in a busy state else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The device reference count","type":"integer","hidden":false,"required":false,"index":false},{"name":"depth","description":"Device nested depth","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"iokit_registry","description":"The full IOKit registry without selecting a plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Default name of the node","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent registry ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the node is in a busy state else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The node reference count","type":"integer","hidden":false,"required":false,"index":false},{"name":"depth","description":"Node nested depth","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"iptables","description":"Linux IP packet filtering and NAT tool.","platforms":["linux"],"columns":[{"name":"filter_name","description":"Packet matching filter table name.","type":"text","hidden":false,"required":false,"index":false},{"name":"chain","description":"Size of module content.","type":"text","hidden":false,"required":false,"index":false},{"name":"policy","description":"Policy that applies for this rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"target","description":"Target that applies for this rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Protocol number identification.","type":"integer","hidden":false,"required":false,"index":false},{"name":"src_port","description":"Protocol source port(s).","type":"text","hidden":false,"required":false,"index":false},{"name":"dst_port","description":"Protocol destination port(s).","type":"text","hidden":false,"required":false,"index":false},{"name":"src_ip","description":"Source IP address.","type":"text","hidden":false,"required":false,"index":false},{"name":"src_mask","description":"Source IP address mask.","type":"text","hidden":false,"required":false,"index":false},{"name":"iniface","description":"Input interface for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"iniface_mask","description":"Input interface mask for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"dst_ip","description":"Destination IP address.","type":"text","hidden":false,"required":false,"index":false},{"name":"dst_mask","description":"Destination IP address mask.","type":"text","hidden":false,"required":false,"index":false},{"name":"outiface","description":"Output interface for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"outiface_mask","description":"Output interface mask for the rule.","type":"text","hidden":false,"required":false,"index":false},{"name":"match","description":"Matching rule that applies.","type":"text","hidden":false,"required":false,"index":false},{"name":"packets","description":"Number of matching packets for this rule.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of matching bytes for this rule.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"kernel_extensions","description":"OS X's kernel extensions, both loaded and within the load search path.","platforms":["darwin"],"columns":[{"name":"idx","description":"Extension load tag or index","type":"integer","hidden":false,"required":false,"index":false},{"name":"refs","description":"Reference count","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Bytes of wired memory used by extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension label","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension version","type":"text","hidden":false,"required":false,"index":false},{"name":"linked_against","description":"Indexes of extensions this extension is linked against","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Optional path to extension bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kernel_info","description":"Basic active kernel information.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"version","description":"Kernel version","type":"text","hidden":false,"required":false,"index":false},{"name":"arguments","description":"Kernel arguments","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Kernel path","type":"text","hidden":false,"required":false,"index":false},{"name":"device","description":"Kernel device identifier","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kernel_modules","description":"Linux kernel modules both loaded and within the load search path.","platforms":["linux"],"columns":[{"name":"name","description":"Module name","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of module content","type":"bigint","hidden":false,"required":false,"index":false},{"name":"used_by","description":"Module reverse dependencies","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Kernel module status","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Kernel module address","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kernel_panics","description":"System kernel panic logs.","platforms":["darwin"],"columns":[{"name":"path","description":"Location of log file","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Formatted time of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"registers","description":"A space delimited line of register:value pairs","type":"text","hidden":false,"required":false,"index":false},{"name":"frame_backtrace","description":"Backtrace of the crashed module","type":"text","hidden":false,"required":false,"index":false},{"name":"module_backtrace","description":"Modules appearing in the crashed module's backtrace","type":"text","hidden":false,"required":false,"index":false},{"name":"dependencies","description":"Module dependencies existing in crashed module's backtrace","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name corresponding to crashed thread","type":"text","hidden":false,"required":false,"index":false},{"name":"os_version","description":"Version of the operating system","type":"text","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Version of the system kernel","type":"text","hidden":false,"required":false,"index":false},{"name":"system_model","description":"Physical system model, for example 'MacBookPro12,1 (Mac-E43C1C25D4880AD6)'","type":"text","hidden":false,"required":false,"index":false},{"name":"uptime","description":"System uptime at kernel panic in nanoseconds","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_loaded","description":"Last loaded module before panic","type":"text","hidden":false,"required":false,"index":false},{"name":"last_unloaded","description":"Last unloaded module before panic","type":"text","hidden":false,"required":false,"index":false}]},{"name":"keychain_acls","description":"Applications that have ACL entries in the keychain.","platforms":["darwin"],"columns":[{"name":"keychain_path","description":"The path of the keychain","type":"text","hidden":false,"required":false,"index":false},{"name":"authorizations","description":"A space delimited set of authorization attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the authorized application","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"The description included with the ACL entry","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"An optional label tag that may be included with the keychain entry","type":"text","hidden":false,"required":false,"index":false}]},{"name":"keychain_items","description":"Generic details about keychain items.","platforms":["darwin"],"columns":[{"name":"label","description":"Generic item name","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional item description","type":"text","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional keychain comment","type":"text","hidden":false,"required":false,"index":false},{"name":"created","description":"Data item was created","type":"text","hidden":false,"required":false,"index":false},{"name":"modified","description":"Date of last modification","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Keychain item type (class)","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to keychain containing item","type":"text","hidden":false,"required":false,"index":false}]},{"name":"known_hosts","description":"A line-delimited known_hosts table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local user that owns the known_hosts file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"key","description":"parsed authorized keys line","type":"text","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to known_hosts file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"kva_speculative_info","description":"Display kernel virtual address and speculative execution information for the system.","platforms":["windows"],"columns":[{"name":"kva_shadow_enabled","description":"Kernel Virtual Address shadowing is enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"kva_shadow_user_global","description":"User pages are marked as global.","type":"integer","hidden":false,"required":false,"index":false},{"name":"kva_shadow_pcid","description":"Kernel VA PCID flushing optimization is enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"kva_shadow_inv_pcid","description":"Kernel VA INVPCID is enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bp_mitigations","description":"Branch Prediction mitigations are enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bp_system_pol_disabled","description":"Branch Predictions are disabled via system policy.","type":"integer","hidden":false,"required":false,"index":false},{"name":"bp_microcode_disabled","description":"Branch Predictions are disabled due to lack of microcode update.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_spec_ctrl_supported","description":"SPEC_CTRL MSR supported by CPU Microcode.","type":"integer","hidden":false,"required":false,"index":false},{"name":"ibrs_support_enabled","description":"Windows uses IBRS.","type":"integer","hidden":false,"required":false,"index":false},{"name":"stibp_support_enabled","description":"Windows uses STIBP.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_pred_cmd_supported","description":"PRED_CMD MSR supported by CPU Microcode.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"last","description":"System logins and logouts.","platforms":["darwin","linux"],"columns":[{"name":"username","description":"Entry username","type":"text","hidden":false,"required":false,"index":false},{"name":"tty","description":"Entry terminal","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Entry type, according to ut_type types (utmp.h)","type":"integer","hidden":false,"required":false,"index":false},{"name":"type_name","description":"Entry type name, according to ut_type types (utmp.h)","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp","type":"integer","hidden":false,"required":false,"index":false},{"name":"host","description":"Entry hostname","type":"text","hidden":false,"required":false,"index":false}]},{"name":"launchd","description":"LaunchAgents and LaunchDaemons from default search paths.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to daemon or agent plist","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"File name of plist (used by launchd)","type":"text","hidden":false,"required":false,"index":false},{"name":"label","description":"Daemon or agent service name","type":"text","hidden":false,"required":false,"index":false},{"name":"program","description":"Path to target program","type":"text","hidden":false,"required":false,"index":false},{"name":"run_at_load","description":"Should the program run on launch load","type":"text","hidden":false,"required":false,"index":false},{"name":"keep_alive","description":"Should the process be restarted if killed","type":"text","hidden":false,"required":false,"index":false},{"name":"on_demand","description":"Deprecated key, replaced by keep_alive","type":"text","hidden":false,"required":false,"index":false},{"name":"disabled","description":"Skip loading this daemon or agent on boot","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Run this daemon or agent as this username","type":"text","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Run this daemon or agent as this group","type":"text","hidden":false,"required":false,"index":false},{"name":"stdout_path","description":"Pipe stdout to a target path","type":"text","hidden":false,"required":false,"index":false},{"name":"stderr_path","description":"Pipe stderr to a target path","type":"text","hidden":false,"required":false,"index":false},{"name":"start_interval","description":"Frequency to run in seconds","type":"text","hidden":false,"required":false,"index":false},{"name":"program_arguments","description":"Command line arguments passed to program","type":"text","hidden":false,"required":false,"index":false},{"name":"watch_paths","description":"Key that launches daemon or agent if path is modified","type":"text","hidden":false,"required":false,"index":false},{"name":"queue_directories","description":"Similar to watch_paths but only with non-empty directories","type":"text","hidden":false,"required":false,"index":false},{"name":"inetd_compatibility","description":"Run this daemon or agent as it was launched from inetd","type":"text","hidden":false,"required":false,"index":false},{"name":"start_on_mount","description":"Run daemon or agent every time a filesystem is mounted","type":"text","hidden":false,"required":false,"index":false},{"name":"root_directory","description":"Key used to specify a directory to chroot to before launch","type":"text","hidden":false,"required":false,"index":false},{"name":"working_directory","description":"Key used to specify a directory to chdir to before launch","type":"text","hidden":false,"required":false,"index":false},{"name":"process_type","description":"Key describes the intended purpose of the job","type":"text","hidden":false,"required":false,"index":false}]},{"name":"launchd_overrides","description":"Override keys, per user, for LaunchDaemons and Agents.","platforms":["darwin"],"columns":[{"name":"label","description":"Daemon or agent service name","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Name of the override key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Overridden value","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID applied to the override, 0 applies to all","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to daemon or agent plist","type":"text","hidden":false,"required":false,"index":false}]},{"name":"listening_ports","description":"Processes with listening (bound) network sockets/ports.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"port","description":"Transport layer port","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for bind","type":"text","hidden":false,"required":false,"index":false},{"name":"fd","description":"Socket file descriptor number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path for UNIX domain sockets","type":"text","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","hidden":true,"required":false,"index":false}]},{"name":"lldp_neighbors","description":"LLDP neighbors of interfaces.","platforms":["linux"],"columns":[{"name":"interface","description":"Interface name","type":"text","hidden":false,"required":false,"index":false},{"name":"rid","description":"Neighbor chassis index","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_id_type","description":"Neighbor chassis ID type","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_id","description":"Neighbor chassis ID value","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_sysname","description":"CPU brand string, contains vendor and model","type":"text","hidden":false,"required":false,"index":false},{"name":"chassis_sys_description","description":"Max number of CPU physical cores","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_bridge_capability_available","description":"Chassis bridge capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_bridge_capability_enabled","description":"Is chassis bridge capability enabled.","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_router_capability_available","description":"Chassis router capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_router_capability_enabled","description":"Chassis router capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_repeater_capability_available","description":"Chassis repeater capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_repeater_capability_enabled","description":"Chassis repeater capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_wlan_capability_available","description":"Chassis wlan capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_wlan_capability_enabled","description":"Chassis wlan capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_tel_capability_available","description":"Chassis telephone capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_tel_capability_enabled","description":"Chassis telephone capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_docsis_capability_available","description":"Chassis DOCSIS capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_docsis_capability_enabled","description":"Chassis DOCSIS capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_station_capability_available","description":"Chassis station capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_station_capability_enabled","description":"Chassis station capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_other_capability_available","description":"Chassis other capability availability","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_other_capability_enabled","description":"Chassis other capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"chassis_mgmt_ips","description":"Comma delimited list of chassis management IPS","type":"text","hidden":false,"required":false,"index":false},{"name":"port_id_type","description":"Port ID type","type":"text","hidden":false,"required":false,"index":false},{"name":"port_id","description":"Port ID value","type":"text","hidden":false,"required":false,"index":false},{"name":"port_description","description":"Port description","type":"text","hidden":false,"required":false,"index":false},{"name":"port_ttl","description":"Age of neighbor port","type":"bigint","hidden":false,"required":false,"index":false},{"name":"port_mfs","description":"Port max frame size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"port_aggregation_id","description":"Port aggregation ID","type":"text","hidden":false,"required":false,"index":false},{"name":"port_autoneg_supported","description":"Auto negotiation supported","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_enabled","description":"Is auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_mau_type","description":"MAU type","type":"text","hidden":false,"required":false,"index":false},{"name":"port_autoneg_10baset_hd_enabled","description":"10Base-T HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_10baset_fd_enabled","description":"10Base-T FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100basetx_hd_enabled","description":"100Base-TX HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100basetx_fd_enabled","description":"100Base-TX FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset2_hd_enabled","description":"100Base-T2 HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset2_fd_enabled","description":"100Base-T2 FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset4_hd_enabled","description":"100Base-T4 HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_100baset4_fd_enabled","description":"100Base-T4 FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000basex_hd_enabled","description":"1000Base-X HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000basex_fd_enabled","description":"1000Base-X FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000baset_hd_enabled","description":"1000Base-T HD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"port_autoneg_1000baset_fd_enabled","description":"1000Base-T FD auto negotiation enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_device_type","description":"Dot3 power device type","type":"text","hidden":false,"required":false,"index":false},{"name":"power_mdi_supported","description":"MDI power supported","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_mdi_enabled","description":"Is MDI power enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_paircontrol_enabled","description":"Is power pair control enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_pairs","description":"Dot3 power pairs","type":"text","hidden":false,"required":false,"index":false},{"name":"power_class","description":"Power class","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_enabled","description":"Is 802.3at enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_type","description":"802.3at power type","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_source","description":"802.3at power source","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_priority","description":"802.3at power priority","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_allocated","description":"802.3at power allocated","type":"text","hidden":false,"required":false,"index":false},{"name":"power_8023at_power_requested","description":"802.3at power requested","type":"text","hidden":false,"required":false,"index":false},{"name":"med_device_type","description":"Chassis MED type","type":"text","hidden":false,"required":false,"index":false},{"name":"med_capability_capabilities","description":"Is MED capabilities enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_policy","description":"Is MED policy capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_location","description":"Is MED location capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_mdi_pse","description":"Is MED MDI PSE capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_mdi_pd","description":"Is MED MDI PD capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_capability_inventory","description":"Is MED inventory capability enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"med_policies","description":"Comma delimited list of MED policies","type":"text","hidden":false,"required":false,"index":false},{"name":"vlans","description":"Comma delimited list of vlan ids","type":"text","hidden":false,"required":false,"index":false},{"name":"pvid","description":"Primary VLAN id","type":"text","hidden":false,"required":false,"index":false},{"name":"ppvids_supported","description":"Comma delimited list of supported PPVIDs","type":"text","hidden":false,"required":false,"index":false},{"name":"ppvids_enabled","description":"Comma delimited list of enabled PPVIDs","type":"text","hidden":false,"required":false,"index":false},{"name":"pids","description":"Comma delimited list of PIDs","type":"text","hidden":false,"required":false,"index":false}]},{"name":"load_average","description":"Displays information about the system wide load averages.","platforms":["darwin","linux"],"columns":[{"name":"period","description":"Period over which the average is calculated.","type":"text","hidden":false,"required":false,"index":false},{"name":"average","description":"Load average over the specified period.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"location_services","description":"Reports the status of the Location Services feature of the OS.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 if Location Services are enabled, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"logged_in_users","description":"Users with an active shell on the system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"type","description":"Login type","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"User login name","type":"text","hidden":false,"required":false,"index":false},{"name":"tty","description":"Device name","type":"text","hidden":false,"required":false,"index":false},{"name":"host","description":"Remote hostname","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time entry was made","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"sid","description":"The user's unique security identifier","type":"text","hidden":true,"required":false,"index":false},{"name":"registry_hive","description":"HKEY_USERS registry hive","type":"text","hidden":true,"required":false,"index":false}]},{"name":"logical_drives","description":"Details for logical drives on the system. A logical drive generally represents a single partition.","platforms":["windows"],"columns":[{"name":"device_id","description":"The drive id, usually the drive name, e.g., 'C:'.","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Deprecated (always 'Unknown').","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"The canonical description of the drive, e.g. 'Logical Fixed Disk', 'CD-ROM Disk'.","type":"text","hidden":false,"required":false,"index":false},{"name":"free_space","description":"The amount of free space, in bytes, of the drive (-1 on failure).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"The total amount of space, in bytes, of the drive (-1 on failure).","type":"bigint","hidden":false,"required":false,"index":false},{"name":"file_system","description":"The file system of the drive.","type":"text","hidden":false,"required":false,"index":false},{"name":"boot_partition","description":"True if Windows booted from this drive.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"logon_sessions","description":"Windows Logon Session.","platforms":["windows"],"columns":[{"name":"logon_id","description":"A locally unique identifier (LUID) that identifies a logon session.","type":"integer","hidden":false,"required":false,"index":false},{"name":"user","description":"The account name of the security principal that owns the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_domain","description":"The name of the domain used to authenticate the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"authentication_package","description":"The authentication package used to authenticate the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_type","description":"The logon method.","type":"text","hidden":false,"required":false,"index":false},{"name":"session_id","description":"The Terminal Services session identifier.","type":"integer","hidden":false,"required":false,"index":false},{"name":"logon_sid","description":"The user's security identifier (SID).","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_time","description":"The time the session owner logged on.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"logon_server","description":"The name of the server used to authenticate the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"dns_domain_name","description":"The DNS name for the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"upn","description":"The user principal name (UPN) for the owner of the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"logon_script","description":"The script used for logging on.","type":"text","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The home directory for the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"home_directory","description":"The home directory for the logon session.","type":"text","hidden":false,"required":false,"index":false},{"name":"home_directory_drive","description":"The drive location of the home directory of the logon session.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_certificates","description":"LXD certificates information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Name of the certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"fingerprint","description":"SHA256 hash of the certificate","type":"text","hidden":false,"required":false,"index":false},{"name":"certificate","description":"Certificate content","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster","description":"LXD cluster information.","platforms":["darwin","linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether clustering enabled (1) or not (0) on this node","type":"integer","hidden":false,"required":false,"index":false},{"name":"member_config_entity","description":"Type of configuration parameter for this node","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_name","description":"Name of configuration parameter","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_key","description":"Config key","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_value","description":"Config value","type":"text","hidden":false,"required":false,"index":false},{"name":"member_config_description","description":"Config description","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster_members","description":"LXD cluster members information.","platforms":["darwin","linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","hidden":false,"required":false,"index":false},{"name":"url","description":"URL of the node","type":"text","hidden":false,"required":false,"index":false},{"name":"database","description":"Whether the server is a database node (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the node (Online/Offline)","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the node (Online/Offline)","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_images","description":"LXD images information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Target architecture for the image","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"OS on which image is based","type":"text","hidden":false,"required":false,"index":false},{"name":"release","description":"OS release version on which the image is based","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Image description","type":"text","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Comma-separated list of image aliases","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Filename of the image file","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of image in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"auto_update","description":"Whether the image auto-updates (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"cached","description":"Whether image is cached (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"public","description":"Whether image is public (1) or not (0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of image creation","type":"text","hidden":false,"required":false,"index":false},{"name":"expires_at","description":"ISO time of image expiration","type":"text","hidden":false,"required":false,"index":false},{"name":"uploaded_at","description":"ISO time of image upload","type":"text","hidden":false,"required":false,"index":false},{"name":"last_used_at","description":"ISO time for the most recent use of this image in terms of container spawn","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_server","description":"Server for image update","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_protocol","description":"Protocol used for image information update and image import from source server","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_certificate","description":"Certificate for update source server","type":"text","hidden":false,"required":false,"index":false},{"name":"update_source_alias","description":"Alias of image at update source server","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_config","description":"LXD instance configuration information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Instance name","type":"text","hidden":false,"required":true,"index":false},{"name":"key","description":"Configuration parameter name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Configuration parameter value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_devices","description":"LXD instance devices information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Instance name","type":"text","hidden":false,"required":true,"index":false},{"name":"device","description":"Name of the device","type":"text","hidden":false,"required":false,"index":false},{"name":"device_type","description":"Device type","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Device info param name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Device info param value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"lxd_instances","description":"LXD instances information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Instance name","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Instance state (running, stopped, etc.)","type":"text","hidden":false,"required":false,"index":false},{"name":"stateful","description":"Whether the instance is stateful(1) or not(0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"ephemeral","description":"Whether the instance is ephemeral(1) or not(0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of creation","type":"text","hidden":false,"required":false,"index":false},{"name":"base_image","description":"ID of image used to launch this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Instance architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"os","description":"The OS of this instance","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Instance description","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Instance's process ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"processes","description":"Number of processes running inside this instance","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"lxd_networks","description":"LXD network information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of network","type":"text","hidden":false,"required":false,"index":false},{"name":"managed","description":"1 if network created by LXD, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"ipv4_address","description":"IPv4 address","type":"text","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","hidden":false,"required":false,"index":false},{"name":"used_by","description":"URLs for containers using this network","type":"text","hidden":false,"required":false,"index":false},{"name":"bytes_received","description":"Number of bytes received on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"bytes_sent","description":"Number of bytes sent on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"packets_received","description":"Number of packets received on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"packets_sent","description":"Number of packets sent on this network","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hwaddr","description":"Hardware address for this network","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Network status","type":"text","hidden":false,"required":false,"index":false},{"name":"mtu","description":"MTU size","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"lxd_storage_pools","description":"LXD storage pool information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Name of the storage pool","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"Storage driver","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Storage pool source","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the storage pool","type":"text","hidden":false,"required":false,"index":false},{"name":"space_used","description":"Storage space used in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"space_total","description":"Total available storage space in bytes for this storage pool","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes_used","description":"Number of inodes used","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes_total","description":"Total number of inodes available in this storage pool","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"magic","description":"Magic number recognition library table.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute path to target file","type":"text","hidden":false,"required":true,"index":false},{"name":"magic_db_files","description":"Colon(:) separated list of files where the magic db file can be found. By default one of the following is used: /usr/share/file/magic/magic, /usr/share/misc/magic or /usr/share/misc/magic.mgc","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Magic number data from libmagic","type":"text","hidden":false,"required":false,"index":false},{"name":"mime_type","description":"MIME type data from libmagic","type":"text","hidden":false,"required":false,"index":false},{"name":"mime_encoding","description":"MIME encoding data from libmagic","type":"text","hidden":false,"required":false,"index":false}]},{"name":"managed_policies","description":"The managed configuration policies from AD, MDM, MCX, etc.","platforms":["darwin"],"columns":[{"name":"domain","description":"System or manager-chosen domain key","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Optional UUID assigned to policy set","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Policy key name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Policy value","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Policy applies only this user","type":"text","hidden":false,"required":false,"index":false},{"name":"manual","description":"1 if policy was loaded manually, otherwise 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"md_devices","description":"Software RAID array settings.","platforms":["linux"],"columns":[{"name":"device_name","description":"md device name","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Current state of the array","type":"text","hidden":false,"required":false,"index":false},{"name":"raid_level","description":"Current raid level of the array","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"size of the array in blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"chunk_size","description":"chunk size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"raid_disks","description":"Number of configured RAID disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"nr_raid_disks","description":"Number of partitions or disk devices to comprise the array","type":"integer","hidden":false,"required":false,"index":false},{"name":"working_disks","description":"Number of working disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"active_disks","description":"Number of active disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"failed_disks","description":"Number of failed disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"spare_disks","description":"Number of idle disks in array","type":"integer","hidden":false,"required":false,"index":false},{"name":"superblock_state","description":"State of the superblock","type":"text","hidden":false,"required":false,"index":false},{"name":"superblock_version","description":"Version of the superblock","type":"text","hidden":false,"required":false,"index":false},{"name":"superblock_update_time","description":"Unix timestamp of last update","type":"bigint","hidden":false,"required":false,"index":false},{"name":"bitmap_on_mem","description":"Pages allocated in in-memory bitmap, if enabled","type":"text","hidden":false,"required":false,"index":false},{"name":"bitmap_chunk_size","description":"Bitmap chunk size","type":"text","hidden":false,"required":false,"index":false},{"name":"bitmap_external_file","description":"External referenced bitmap file","type":"text","hidden":false,"required":false,"index":false},{"name":"recovery_progress","description":"Progress of the recovery activity","type":"text","hidden":false,"required":false,"index":false},{"name":"recovery_finish","description":"Estimated duration of recovery activity","type":"text","hidden":false,"required":false,"index":false},{"name":"recovery_speed","description":"Speed of recovery activity","type":"text","hidden":false,"required":false,"index":false},{"name":"resync_progress","description":"Progress of the resync activity","type":"text","hidden":false,"required":false,"index":false},{"name":"resync_finish","description":"Estimated duration of resync activity","type":"text","hidden":false,"required":false,"index":false},{"name":"resync_speed","description":"Speed of resync activity","type":"text","hidden":false,"required":false,"index":false},{"name":"reshape_progress","description":"Progress of the reshape activity","type":"text","hidden":false,"required":false,"index":false},{"name":"reshape_finish","description":"Estimated duration of reshape activity","type":"text","hidden":false,"required":false,"index":false},{"name":"reshape_speed","description":"Speed of reshape activity","type":"text","hidden":false,"required":false,"index":false},{"name":"check_array_progress","description":"Progress of the check array activity","type":"text","hidden":false,"required":false,"index":false},{"name":"check_array_finish","description":"Estimated duration of the check array activity","type":"text","hidden":false,"required":false,"index":false},{"name":"check_array_speed","description":"Speed of the check array activity","type":"text","hidden":false,"required":false,"index":false},{"name":"unused_devices","description":"Unused devices","type":"text","hidden":false,"required":false,"index":false},{"name":"other","description":"Other information associated with array from /proc/mdstat","type":"text","hidden":false,"required":false,"index":false}]},{"name":"md_drives","description":"Drive devices used for Software RAID.","platforms":["linux"],"columns":[{"name":"md_device_name","description":"md device name","type":"text","hidden":false,"required":false,"index":false},{"name":"drive_name","description":"Drive device name","type":"text","hidden":false,"required":false,"index":false},{"name":"slot","description":"Slot position of disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the drive","type":"text","hidden":false,"required":false,"index":false}]},{"name":"md_personalities","description":"Software RAID setting supported by the kernel.","platforms":["linux"],"columns":[{"name":"name","description":"Name of personality supported by kernel","type":"text","hidden":false,"required":false,"index":false}]},{"name":"mdfind","description":"Run searches against the spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file returned from spotlight","type":"text","hidden":false,"required":false,"index":false},{"name":"query","description":"The query that was run to find the file","type":"text","hidden":false,"required":true,"index":false}]},{"name":"mdls","description":"Query file metadata in the Spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file","type":"text","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the metadata key","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Value stored in the metadata key","type":"text","hidden":false,"required":false,"index":false},{"name":"valuetype","description":"CoreFoundation type of data stored in value","type":"text","hidden":true,"required":false,"index":false}]},{"name":"memory_array_mapped_addresses","description":"Data associated for address mapping of physical memory arrays.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_array_handle","description":"Handle of the memory array associated with this structure","type":"text","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"partition_width","description":"Number of memory devices that form a single row of memory for the address partition of this structure","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_arrays","description":"Data associated with collection of memory devices that operate to form a memory address.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the array","type":"text","hidden":false,"required":false,"index":false},{"name":"location","description":"Physical location of the memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"use","description":"Function for which the array is used","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_error_correction","description":"Primary hardware error correction or detection method supported","type":"text","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"Maximum capacity of array in gigabytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"memory_error_info_handle","description":"Handle, or instance number, associated with any error that was detected for the array","type":"text","hidden":false,"required":false,"index":false},{"name":"number_memory_devices","description":"Number of memory devices on array","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_device_mapped_addresses","description":"Data associated for address mapping of physical memory devices.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_device_handle","description":"Handle of the memory device structure associated with this structure","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_array_mapped_address_handle","description":"Handle of the memory array mapped address to which this device range is mapped to","type":"text","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","hidden":false,"required":false,"index":false},{"name":"partition_row_position","description":"Identifies the position of the referenced memory device in a row of the address partition","type":"integer","hidden":false,"required":false,"index":false},{"name":"interleave_position","description":"The position of the device in a interleave, i.e. 0 indicates non-interleave, 1 indicates 1st interleave, 2 indicates 2nd interleave, etc.","type":"integer","hidden":false,"required":false,"index":false},{"name":"interleave_data_depth","description":"The max number of consecutive rows from memory device that are accessed in a single interleave transfer; 0 indicates device is non-interleave","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_devices","description":"Physical memory device (type 17) information retrieved from SMBIOS.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure in SMBIOS","type":"text","hidden":false,"required":false,"index":false},{"name":"array_handle","description":"The memory array that the device is attached to","type":"text","hidden":false,"required":false,"index":false},{"name":"form_factor","description":"Implementation form factor for this memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"total_width","description":"Total width, in bits, of this memory device, including any check or error-correction bits","type":"integer","hidden":false,"required":false,"index":false},{"name":"data_width","description":"Data width, in bits, of this memory device","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of memory device in Megabyte","type":"integer","hidden":false,"required":false,"index":false},{"name":"set","description":"Identifies if memory device is one of a set of devices. A value of 0 indicates no set affiliation.","type":"integer","hidden":false,"required":false,"index":false},{"name":"device_locator","description":"String number of the string that identifies the physically-labeled socket or board position where the memory device is located","type":"text","hidden":false,"required":false,"index":false},{"name":"bank_locator","description":"String number of the string that identifies the physically-labeled bank where the memory device is located","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_type","description":"Type of memory used","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_type_details","description":"Additional details for memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"max_speed","description":"Max speed of memory device in megatransfers per second (MT/s)","type":"integer","hidden":false,"required":false,"index":false},{"name":"configured_clock_speed","description":"Configured speed of memory device in megatransfers per second (MT/s)","type":"integer","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Manufacturer ID string","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Serial number of memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"asset_tag","description":"Manufacturer specific asset tag of memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"part_number","description":"Manufacturer specific serial number of memory device","type":"text","hidden":false,"required":false,"index":false},{"name":"min_voltage","description":"Minimum operating voltage of device in millivolts","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_voltage","description":"Maximum operating voltage of device in millivolts","type":"integer","hidden":false,"required":false,"index":false},{"name":"configured_voltage","description":"Configured operating voltage of device in millivolts","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"memory_error_info","description":"Data associated with errors of a physical memory array.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","hidden":false,"required":false,"index":false},{"name":"error_type","description":"type of error associated with current error status for array or device","type":"text","hidden":false,"required":false,"index":false},{"name":"error_granularity","description":"Granularity to which the error can be resolved","type":"text","hidden":false,"required":false,"index":false},{"name":"error_operation","description":"Memory access operation that caused the error","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_syndrome","description":"Vendor specific ECC syndrome or CRC data associated with the erroneous access","type":"text","hidden":false,"required":false,"index":false},{"name":"memory_array_error_address","description":"32 bit physical address of the error based on the addressing of the bus to which the memory array is connected","type":"text","hidden":false,"required":false,"index":false},{"name":"device_error_address","description":"32 bit physical address of the error relative to the start of the failing memory address, in bytes","type":"text","hidden":false,"required":false,"index":false},{"name":"error_resolution","description":"Range, in bytes, within which this error can be determined, when an error address is given","type":"text","hidden":false,"required":false,"index":false}]},{"name":"memory_info","description":"Main memory information in bytes.","platforms":["linux"],"columns":[{"name":"memory_total","description":"Total amount of physical RAM, in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"memory_free","description":"The amount of physical RAM, in bytes, left unused by the system","type":"bigint","hidden":false,"required":false,"index":false},{"name":"buffers","description":"The amount of physical RAM, in bytes, used for file buffers","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cached","description":"The amount of physical RAM, in bytes, used as cache memory","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_cached","description":"The amount of swap, in bytes, used as cache memory","type":"bigint","hidden":false,"required":false,"index":false},{"name":"active","description":"The total amount of buffer or page cache memory, in bytes, that is in active use","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inactive","description":"The total amount of buffer or page cache memory, in bytes, that are free and available","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_total","description":"The total amount of swap available, in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_free","description":"The total amount of swap free, in bytes","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"memory_map","description":"OS memory region map.","platforms":["linux"],"columns":[{"name":"name","description":"Region name","type":"text","hidden":false,"required":false,"index":false},{"name":"start","description":"Start address of memory region","type":"text","hidden":false,"required":false,"index":false},{"name":"end","description":"End address of memory region","type":"text","hidden":false,"required":false,"index":false}]},{"name":"mounts","description":"System mounted devices and filesystems (not process specific).","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Mounted device","type":"text","hidden":false,"required":false,"index":false},{"name":"device_alias","description":"Mounted device alias","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Mounted device path","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Mounted device type","type":"text","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Block size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Mounted device used blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks_free","description":"Mounted device free blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"blocks_available","description":"Mounted device available blocks","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Mounted device used inodes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inodes_free","description":"Mounted device free inodes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flags","description":"Mounted device flags","type":"text","hidden":false,"required":false,"index":false}]},{"name":"msr","description":"Various pieces of data stored in the model specific register per processor. NOTE: the msr kernel module must be enabled, and osquery must be run as root.","platforms":["linux"],"columns":[{"name":"processor_number","description":"The processor number as reported in /proc/cpuinfo","type":"bigint","hidden":false,"required":false,"index":false},{"name":"turbo_disabled","description":"Whether the turbo feature is disabled.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"turbo_ratio_limit","description":"The turbo feature ratio limit.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"platform_info","description":"Platform information.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"perf_ctl","description":"Performance setting for the processor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"perf_status","description":"Performance status for the processor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"feature_control","description":"Bitfield controlling enabled features.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"rapl_power_limit","description":"Run Time Average Power Limiting power limit.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"rapl_energy_status","description":"Run Time Average Power Limiting energy status.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"rapl_power_units","description":"Run Time Average Power Limiting power units.","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"nfs_shares","description":"NFS shares exported by the host.","platforms":["darwin"],"columns":[{"name":"share","description":"Filesystem path to the share","type":"text","hidden":false,"required":false,"index":false},{"name":"options","description":"Options string set on the export share","type":"text","hidden":false,"required":false,"index":false},{"name":"readonly","description":"1 if the share is exported readonly else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"npm_packages","description":"Lists all npm packages in a directory or globally installed in a system.","platforms":["linux"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Package supplied description","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Package author name","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License for package","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Module's package.json path","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"Node module's directory where this package is located","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"ntdomains","description":"Display basic NT domain information of a Windows machine.","platforms":["windows"],"columns":[{"name":"name","description":"The label by which the object is known.","type":"text","hidden":false,"required":false,"index":false},{"name":"client_site_name","description":"The name of the site where the domain controller is configured.","type":"text","hidden":false,"required":false,"index":false},{"name":"dc_site_name","description":"The name of the site where the domain controller is located.","type":"text","hidden":false,"required":false,"index":false},{"name":"dns_forest_name","description":"The name of the root of the DNS tree.","type":"text","hidden":false,"required":false,"index":false},{"name":"domain_controller_address","description":"The IP Address of the discovered domain controller..","type":"text","hidden":false,"required":false,"index":false},{"name":"domain_controller_name","description":"The name of the discovered domain controller.","type":"text","hidden":false,"required":false,"index":false},{"name":"domain_name","description":"The name of the domain.","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"The current status of the domain object.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ntfs_acl_permissions","description":"Retrieve NTFS ACL permission information for files and directories.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the file or directory.","type":"text","hidden":false,"required":true,"index":false},{"name":"type","description":"Type of access mode for the access control entry.","type":"text","hidden":false,"required":false,"index":false},{"name":"principal","description":"User or group to which the ACE applies.","type":"text","hidden":false,"required":false,"index":false},{"name":"access","description":"Specific permissions that indicate the rights described by the ACE.","type":"text","hidden":false,"required":false,"index":false},{"name":"inherited_from","description":"The inheritance policy of the ACE.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ntfs_journal_events","description":"Track time/action changes to files specified in configuration data.","platforms":["windows"],"columns":[{"name":"action","description":"Change action (Write, Delete, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The category that the event originated from","type":"text","hidden":false,"required":false,"index":false},{"name":"old_path","description":"Old path (renames only)","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path","type":"text","hidden":false,"required":false,"index":false},{"name":"record_timestamp","description":"Journal record timestamp","type":"text","hidden":false,"required":false,"index":false},{"name":"record_usn","description":"The update sequence number that identifies the journal record","type":"text","hidden":false,"required":false,"index":false},{"name":"node_ref_number","description":"The ordinal that associates a journal record with a filename","type":"text","hidden":false,"required":false,"index":false},{"name":"parent_ref_number","description":"The ordinal that associates a journal record with a filename's parent directory","type":"text","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"The drive letter identifying the source journal","type":"text","hidden":false,"required":false,"index":false},{"name":"file_attributes","description":"File attributes","type":"text","hidden":false,"required":false,"index":false},{"name":"partial","description":"Set to 1 if either path or old_path only contains the file or folder name","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"nvram","description":"Apple NVRAM variable listing.","platforms":["darwin"],"columns":[{"name":"name","description":"Variable name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Data type (CFData, CFString, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Raw variable data","type":"text","hidden":false,"required":false,"index":false}]},{"name":"oem_strings","description":"OEM defined strings retrieved from SMBIOS.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the Type 11 structure","type":"text","hidden":false,"required":false,"index":false},{"name":"number","description":"The string index of the structure","type":"integer","hidden":false,"required":false,"index":false},{"name":"value","description":"The value of the OEM string","type":"text","hidden":false,"required":false,"index":false}]},{"name":"office_mru","description":"View recently opened Office documents.","platforms":["windows"],"columns":[{"name":"application","description":"Associated Office application","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Office application version number","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"File path","type":"text","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"Most recent opened time file was opened","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID","type":"text","hidden":false,"required":false,"index":false}]},{"name":"os_version","description":"A single row containing the operating system name and version.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Distribution or product name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Pretty, suitable for presentation, OS version","type":"text","hidden":false,"required":false,"index":false},{"name":"major","description":"Major release version","type":"integer","hidden":false,"required":false,"index":false},{"name":"minor","description":"Minor release version","type":"integer","hidden":false,"required":false,"index":false},{"name":"patch","description":"Optional patch release","type":"integer","hidden":false,"required":false,"index":false},{"name":"build","description":"Optional build-specific or variant string","type":"text","hidden":false,"required":false,"index":false},{"name":"platform","description":"OS Platform or ID","type":"text","hidden":false,"required":false,"index":false},{"name":"platform_like","description":"Closely related platforms","type":"text","hidden":false,"required":false,"index":false},{"name":"codename","description":"OS version codename","type":"text","hidden":false,"required":false,"index":false},{"name":"arch","description":"OS Architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"The install date of the OS.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"osquery_events","description":"Information about the event publishers and subscribers.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"Event publisher or subscriber name","type":"text","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the associated publisher","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Either publisher or subscriber","type":"text","hidden":false,"required":false,"index":false},{"name":"subscriptions","description":"Number of subscriptions the publisher received or subscriber used","type":"integer","hidden":false,"required":false,"index":false},{"name":"events","description":"Number of events emitted or received since osquery started","type":"integer","hidden":false,"required":false,"index":false},{"name":"refreshes","description":"Publisher only: number of runloop restarts","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"1 if the publisher or subscriber is active else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_extensions","description":"List of active osquery extensions.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"uuid","description":"The transient ID assigned for communication","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension's name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension's version","type":"text","hidden":false,"required":false,"index":false},{"name":"sdk_version","description":"osquery SDK version used to build the extension","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the extension's Thrift connection or library path","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"SDK extension type: extension or module","type":"text","hidden":false,"required":false,"index":false}]},{"name":"osquery_flags","description":"Configurable flags that modify osquery's behavior.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"Flag name","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Flag type","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Flag description","type":"text","hidden":false,"required":false,"index":false},{"name":"default_value","description":"Flag default value","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Flag value","type":"text","hidden":false,"required":false,"index":false},{"name":"shell_only","description":"Is the flag shell only?","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_info","description":"Top level information about the running version of osquery.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"pid","description":"Process (or thread/handle) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","hidden":false,"required":false,"index":false},{"name":"instance_id","description":"Unique, long-lived ID per instance of osquery","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"osquery toolkit version","type":"text","hidden":false,"required":false,"index":false},{"name":"config_hash","description":"Hash of the working configuration state","type":"text","hidden":false,"required":false,"index":false},{"name":"config_valid","description":"1 if the config was loaded and considered valid, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"extensions","description":"osquery extensions status","type":"text","hidden":false,"required":false,"index":false},{"name":"build_platform","description":"osquery toolkit build platform","type":"text","hidden":false,"required":false,"index":false},{"name":"build_distro","description":"osquery toolkit platform distribution name (os version)","type":"text","hidden":false,"required":false,"index":false},{"name":"start_time","description":"UNIX time in seconds when the process started","type":"integer","hidden":false,"required":false,"index":false},{"name":"watcher","description":"Process (or thread/handle) ID of optional watcher process","type":"integer","hidden":false,"required":false,"index":false},{"name":"platform_mask","description":"The osquery platform bitmask","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_packs","description":"Information about the current query packs that are loaded in osquery.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"The given name for this query pack","type":"text","hidden":false,"required":false,"index":false},{"name":"platform","description":"Platforms this query is supported on","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Minimum osquery version that this query will run on","type":"text","hidden":false,"required":false,"index":false},{"name":"shard","description":"Shard restriction limit, 1-100, 0 meaning no restriction","type":"integer","hidden":false,"required":false,"index":false},{"name":"discovery_cache_hits","description":"The number of times that the discovery query used cached values since the last time the config was reloaded","type":"integer","hidden":false,"required":false,"index":false},{"name":"discovery_executions","description":"The number of times that the discovery queries have been executed since the last time the config was reloaded","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"Whether this pack is active (the version, platform and discovery queries match) yes=1, no=0.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_registry","description":"List the osquery registry plugins.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"registry","description":"Name of the osquery registry","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the plugin item","type":"text","hidden":false,"required":false,"index":false},{"name":"owner_uuid","description":"Extension route UUID (0 for core)","type":"integer","hidden":false,"required":false,"index":false},{"name":"internal","description":"1 If the plugin is internal else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If this plugin is active else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"osquery_schedule","description":"Information about the current queries that are scheduled in osquery.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"name","description":"The given name for this query","type":"text","hidden":false,"required":false,"index":false},{"name":"query","description":"The exact query to run","type":"text","hidden":false,"required":false,"index":false},{"name":"interval","description":"The interval in seconds to run this query, not an exact interval","type":"integer","hidden":false,"required":false,"index":false},{"name":"executions","description":"Number of times the query was executed","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_executed","description":"UNIX time stamp in seconds of the last completed execution","type":"bigint","hidden":false,"required":false,"index":false},{"name":"denylisted","description":"1 if the query is denylisted else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"output_size","description":"Total number of bytes generated by the query","type":"bigint","hidden":false,"required":false,"index":false},{"name":"wall_time","description":"Total wall time spent executing","type":"bigint","hidden":false,"required":false,"index":false},{"name":"user_time","description":"Total user time spent executing","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_time","description":"Total system time spent executing","type":"bigint","hidden":false,"required":false,"index":false},{"name":"average_memory","description":"Average private memory left after executing","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"package_bom","description":"OS X package bill of materials (BOM) file list.","platforms":["darwin"],"columns":[{"name":"filepath","description":"Package file or directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Expected user of file or directory","type":"integer","hidden":false,"required":false,"index":false},{"name":"gid","description":"Expected group of file or directory","type":"integer","hidden":false,"required":false,"index":false},{"name":"mode","description":"Expected permissions","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Timestamp the file was installed","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of package bom","type":"text","hidden":false,"required":true,"index":false}]},{"name":"package_install_history","description":"OS X package install history.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Label packageIdentifiers","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Label date as UNIX timestamp","type":"integer","hidden":false,"required":false,"index":false},{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package display version","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Install source: usually the installer process name","type":"text","hidden":false,"required":false,"index":false},{"name":"content_type","description":"Package content_type (optional)","type":"text","hidden":false,"required":false,"index":false}]},{"name":"package_receipts","description":"OS X package receipt details.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Package domain identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"package_filename","description":"Filename of original .pkg file","type":"text","hidden":true,"required":false,"index":false},{"name":"version","description":"Installed package version","type":"text","hidden":false,"required":false,"index":false},{"name":"location","description":"Optional relative install path on volume","type":"text","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Timestamp of install time","type":"double","hidden":false,"required":false,"index":false},{"name":"installer_name","description":"Name of installer process","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of receipt plist","type":"text","hidden":false,"required":false,"index":false}]},{"name":"patches","description":"Lists all the patches applied. Note: This does not include patches applied via MSI or downloaded from Windows Update (e.g. Service Packs).","platforms":["windows"],"columns":[{"name":"csname","description":"The name of the host the patch is installed on.","type":"text","hidden":false,"required":false,"index":false},{"name":"hotfix_id","description":"The KB ID of the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"caption","description":"Short description of the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Fuller description of the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"fix_comments","description":"Additional comments about the patch.","type":"text","hidden":false,"required":false,"index":false},{"name":"installed_by","description":"The system context in which the patch as installed.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the patch was installed. Lack of a value does not indicate that the patch was not installed.","type":"text","hidden":false,"required":false,"index":false},{"name":"installed_on","description":"The date when the patch was installed.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"pci_devices","description":"PCI devices active on the host system.","platforms":["darwin","linux"],"columns":[{"name":"pci_slot","description":"PCI Device used slot","type":"text","hidden":false,"required":false,"index":false},{"name":"pci_class","description":"PCI Device class","type":"text","hidden":false,"required":false,"index":false},{"name":"driver","description":"PCI Device used driver","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor","description":"PCI Device vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded PCI Device vendor identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"PCI Device model","type":"text","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded PCI Device model identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"pci_class_id","description":"PCI Device class ID in hex format","type":"text","hidden":true,"required":false,"index":false},{"name":"pci_subclass_id","description":"PCI Device subclass in hex format","type":"text","hidden":true,"required":false,"index":false},{"name":"pci_subclass","description":"PCI Device subclass","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_vendor_id","description":"Vendor ID of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_vendor","description":"Vendor of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_model_id","description":"Model ID of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false},{"name":"subsystem_model","description":"Device description of PCI device subsystem","type":"text","hidden":true,"required":false,"index":false}]},{"name":"physical_disk_performance","description":"Provides provides raw data from performance counters that monitor hard or fixed disk drives on the system.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the physical disk","type":"text","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_read","description":"Average number of bytes transferred from the disk during read operations","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_write","description":"Average number of bytes transferred to the disk during write operations","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_read_queue_length","description":"Average number of read requests that were queued for the selected disk during the sample interval","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_write_queue_length","description":"Average number of write requests that were queued for the selected disk during the sample interval","type":"bigint","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_read","description":"Average time, in seconds, of a read operation of data from the disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_write","description":"Average time, in seconds, of a write operation of data to the disk","type":"integer","hidden":false,"required":false,"index":false},{"name":"current_disk_queue_length","description":"Number of requests outstanding on the disk at the time the performance data is collected","type":"integer","hidden":false,"required":false,"index":false},{"name":"percent_disk_read_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read requests","type":"bigint","hidden":false,"required":false,"index":false},{"name":"percent_disk_write_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing write requests","type":"bigint","hidden":false,"required":false,"index":false},{"name":"percent_disk_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read or write requests","type":"bigint","hidden":false,"required":false,"index":false},{"name":"percent_idle_time","description":"Percentage of time during the sample interval that the disk was idle","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"pipes","description":"Named and Anonymous pipes.","platforms":["windows"],"columns":[{"name":"pid","description":"Process ID of the process to which the pipe belongs","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the pipe","type":"text","hidden":false,"required":false,"index":false},{"name":"instances","description":"Number of instances of the named pipe","type":"integer","hidden":false,"required":false,"index":false},{"name":"max_instances","description":"The maximum number of instances creatable for this pipe","type":"integer","hidden":false,"required":false,"index":false},{"name":"flags","description":"The flags indicating whether this pipe connection is a server or client end, and if the pipe for sending messages or bytes","type":"text","hidden":false,"required":false,"index":false}]},{"name":"pkg_packages","description":"pkgng packages that are currently installed on the host system.","platforms":["freebsd"],"columns":[{"name":"name","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","hidden":false,"required":false,"index":false},{"name":"flatsize","description":"Package size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"arch","description":"Architecture(s) supported","type":"text","hidden":false,"required":false,"index":false}]},{"name":"platform_info","description":"Information about EFI/UEFI/ROM and platform/boot.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"vendor","description":"Platform code vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Platform code version","type":"text","hidden":false,"required":false,"index":false},{"name":"date","description":"Self-reported platform code update date","type":"text","hidden":false,"required":false,"index":false},{"name":"revision","description":"BIOS major and minor revision","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"Relative address of firmware mapping","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size in bytes of firmware","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_size","description":"(Optional) size of firmware volume","type":"integer","hidden":false,"required":false,"index":false},{"name":"extra","description":"Platform-specific additional information","type":"text","hidden":false,"required":false,"index":false}]},{"name":"plist","description":"Read and parse a plist file.","platforms":["darwin"],"columns":[{"name":"key","description":"Preference top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"subkey","description":"Intermediate key path, includes lists/dicts","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"(required) read preferences from a plist","type":"text","hidden":false,"required":true,"index":false}]},{"name":"portage_keywords","description":"A summary about portage configurations like keywords, mask and unmask.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","hidden":false,"required":false,"index":false},{"name":"keyword","description":"The keyword applied to the package","type":"text","hidden":false,"required":false,"index":false},{"name":"mask","description":"If the package is masked","type":"integer","hidden":false,"required":false,"index":false},{"name":"unmask","description":"If the package is unmasked","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"portage_packages","description":"List of currently installed packages.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","hidden":false,"required":false,"index":false},{"name":"slot","description":"The slot used by package","type":"text","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Unix time when package was built","type":"bigint","hidden":false,"required":false,"index":false},{"name":"repository","description":"From which repository the ebuild was used","type":"text","hidden":false,"required":false,"index":false},{"name":"eapi","description":"The eapi for the ebuild","type":"bigint","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the package","type":"bigint","hidden":false,"required":false,"index":false},{"name":"world","description":"If package is in the world file","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"portage_use","description":"List of enabled portage USE values for specific package.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"The version of the installed package","type":"text","hidden":false,"required":false,"index":false},{"name":"use","description":"USE flag which has been enabled for package","type":"text","hidden":false,"required":false,"index":false}]},{"name":"power_sensors","description":"Machine power (currents, voltages, wattages, etc) sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on OS X","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The sensor category: currents, voltage, wattage","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of power source","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Power in Watts","type":"text","hidden":false,"required":false,"index":false}]},{"name":"powershell_events","description":"Powershell script blocks reconstructed to their full script content, this table requires script block logging to be enabled.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received by the osquery event publisher","type":"bigint","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the Powershell script event occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"script_block_id","description":"The unique GUID of the powershell script to which this block belongs","type":"text","hidden":false,"required":false,"index":false},{"name":"script_block_count","description":"The total number of script blocks for this script","type":"integer","hidden":false,"required":false,"index":false},{"name":"script_text","description":"The text content of the Powershell script","type":"text","hidden":false,"required":false,"index":false},{"name":"script_name","description":"The name of the Powershell script","type":"text","hidden":false,"required":false,"index":false},{"name":"script_path","description":"The path for the Powershell script","type":"text","hidden":false,"required":false,"index":false},{"name":"cosine_similarity","description":"How similar the Powershell script is to a provided 'normal' character frequency","type":"double","hidden":false,"required":false,"index":false}]},{"name":"preferences","description":"OS X defaults and managed preferences.","platforms":["darwin"],"columns":[{"name":"domain","description":"Application ID usually in com.name.product format","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Preference top-level key","type":"text","hidden":false,"required":false,"index":false},{"name":"subkey","description":"Intemediate key path, includes lists/dicts","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","hidden":false,"required":false,"index":false},{"name":"forced","description":"1 if the value is forced/managed, else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"username","description":"(optional) read preferences for a specific user","type":"text","hidden":false,"required":false,"index":false},{"name":"host","description":"'current' or 'any' host, where 'current' takes precedence","type":"text","hidden":false,"required":false,"index":false}]},{"name":"prefetch","description":"Prefetch files show metadata related to file execution.","platforms":["windows"],"columns":[{"name":"path","description":"Prefetch file path.","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Executable filename.","type":"text","hidden":false,"required":false,"index":false},{"name":"hash","description":"Prefetch CRC hash.","type":"text","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Most recent time application was run.","type":"integer","hidden":false,"required":false,"index":false},{"name":"other_run_times","description":"Other execution times in prefetch file.","type":"text","hidden":false,"required":false,"index":false},{"name":"run_count","description":"Number of times the application has been run.","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Application file size.","type":"integer","hidden":false,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number.","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_creation","description":"Volume creation time.","type":"text","hidden":false,"required":false,"index":false},{"name":"accessed_files_count","description":"Number of files accessed.","type":"integer","hidden":false,"required":false,"index":false},{"name":"accessed_directories_count","description":"Number of directories accessed.","type":"integer","hidden":false,"required":false,"index":false},{"name":"accessed_files","description":"Files accessed by application within ten seconds of launch.","type":"text","hidden":false,"required":false,"index":false},{"name":"accessed_directories","description":"Directories accessed by application within ten seconds of launch.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_envs","description":"A key/value table of environment variables for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"key","description":"Environment variable name","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Environment variable value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_events","description":"Track time/action process executions.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"File mode permissions","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline_size","description":"Actual size (bytes) of command line arguments","type":"bigint","hidden":true,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","hidden":true,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","hidden":true,"required":false,"index":false},{"name":"env_size","description":"Actual size (bytes) of environment list","type":"bigint","hidden":true,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID at process start","type":"bigint","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"File owner user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"owner_gid","description":"File owner group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"atime","description":"File last access in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mtime","description":"File modification in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"File last metadata change in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"btime","description":"File creation in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"overflows","description":"List of structures that overflowed","type":"text","hidden":true,"required":false,"index":false},{"name":"parent","description":"Process parent's PID, or -1 if cannot be determined.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false},{"name":"status","description":"OpenBSM Attribute: Status of the process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"suid","description":"Saved user ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"fsgid","description":"Filesystem group ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"sgid","description":"Saved group ID at process start","type":"bigint","hidden":true,"required":false,"index":false},{"name":"syscall","description":"Syscall name: fork, vfork, clone, execve, execveat","type":"text","hidden":true,"required":false,"index":false}]},{"name":"process_file_events","description":"A File Integrity Monitor implementation using the audit service.","platforms":["linux"],"columns":[{"name":"operation","description":"Operation type","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ppid","description":"Parent process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"executable","description":"The executable path","type":"text","hidden":false,"required":false,"index":false},{"name":"partial","description":"True if this is a partial event (i.e.: this process existed before we started osquery)","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The current working directory of the process","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"The path associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"dest_path","description":"The canonical path associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"The uid of the process performing the action","type":"text","hidden":false,"required":false,"index":false},{"name":"gid","description":"The gid of the process performing the action","type":"text","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"fsgid","description":"Filesystem group ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID of the process using the file","type":"text","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"process_memory_map","description":"Process memory mapped files and pseudo device/regions.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"start","description":"Virtual start address (hex)","type":"text","hidden":false,"required":false,"index":false},{"name":"end","description":"Virtual end address (hex)","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions","description":"r=read, w=write, x=execute, p=private (cow)","type":"text","hidden":false,"required":false,"index":false},{"name":"offset","description":"Offset into mapped path","type":"bigint","hidden":false,"required":false,"index":false},{"name":"device","description":"MA:MI Major/minor device ID","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Mapped path inode, 0 means uninitialized (BSS)","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to mapped file or mapped type","type":"text","hidden":false,"required":false,"index":false},{"name":"pseudo","description":"1 If path is a pseudo path, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"process_namespaces","description":"Linux namespaces for processes running on the host system.","platforms":["linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"cgroup_namespace","description":"cgroup namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"ipc_namespace","description":"ipc namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"mnt_namespace","description":"mnt namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"net namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_namespace","description":"pid namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"user_namespace","description":"user namespace inode","type":"text","hidden":false,"required":false,"index":false},{"name":"uts_namespace","description":"uts namespace inode","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_open_files","description":"File descriptors for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"fd","description":"Process-specific file descriptor number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Filesystem path of descriptor","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_open_pipes","description":"Pipes and partner processes for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"fd","description":"File descriptor","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mode","description":"Pipe open mode (r/w)","type":"text","hidden":false,"required":false,"index":false},{"name":"inode","description":"Pipe inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"type","description":"Pipe Type: named vs unnamed/anonymous","type":"text","hidden":false,"required":false,"index":false},{"name":"partner_pid","description":"Process ID of partner process sharing a particular pipe","type":"bigint","hidden":false,"required":false,"index":false},{"name":"partner_fd","description":"File descriptor of shared pipe at partner's end","type":"bigint","hidden":false,"required":false,"index":false},{"name":"partner_mode","description":"Mode of shared pipe at partner's end","type":"text","hidden":false,"required":false,"index":false}]},{"name":"process_open_sockets","description":"Processes which have open network sockets on the system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"fd","description":"Socket file descriptor number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Socket local address","type":"text","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Socket remote address","type":"text","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Socket local port","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Socket remote port","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"For UNIX sockets (family=AF_UNIX), the domain path","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"TCP socket state","type":"text","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","hidden":true,"required":false,"index":false}]},{"name":"processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"protection_type","description":"The protection type of the process","type":"text","hidden":true,"required":false,"index":false},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"programs","description":"Represents products as they are installed by Windows Installer. A product generally correlates to one installation package on Windows. Some fields may be blank as Windows installation details are left to the discretion of the product author.","platforms":["windows"],"columns":[{"name":"name","description":"Commonly used product name.","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Product version information.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_location","description":"The installation location directory of the product.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_source","description":"The installation source of the product.","type":"text","hidden":false,"required":false,"index":false},{"name":"language","description":"The language of the product.","type":"text","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the product supplier.","type":"text","hidden":false,"required":false,"index":false},{"name":"uninstall_string","description":"Path and filename of the uninstaller.","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Date that this product was installed on the system. ","type":"text","hidden":false,"required":false,"index":false},{"name":"identifying_number","description":"Product identification such as a serial number on software, or a die number on a hardware chip.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"prometheus_metrics","description":"Retrieve metrics from a Prometheus server.","platforms":["darwin","linux"],"columns":[{"name":"target_name","description":"Address of prometheus target","type":"text","hidden":false,"required":false,"index":false},{"name":"metric_name","description":"Name of collected Prometheus metric","type":"text","hidden":false,"required":false,"index":false},{"name":"metric_value","description":"Value of collected Prometheus metric","type":"double","hidden":false,"required":false,"index":false},{"name":"timestamp_ms","description":"Unix timestamp of collected data in MS","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"python_packages","description":"Python packages installed in a system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Package display name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this module resides","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"Directory where Python modules are located","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"quicklook_cache","description":"Files and thumbnails within OS X's Quicklook Cache.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of file","type":"text","hidden":false,"required":false,"index":false},{"name":"rowid","description":"Quicklook file rowid key","type":"integer","hidden":false,"required":false,"index":false},{"name":"fs_id","description":"Quicklook file fs_id key","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_id","description":"Parsed volume ID from fs_id","type":"integer","hidden":false,"required":false,"index":false},{"name":"inode","description":"Parsed file ID (inode) from fs_id","type":"integer","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Parsed version date field","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Parsed version size field","type":"bigint","hidden":false,"required":false,"index":false},{"name":"label","description":"Parsed version 'gen' field","type":"text","hidden":false,"required":false,"index":false},{"name":"last_hit_date","description":"Apple date format for last thumbnail cache hit","type":"integer","hidden":false,"required":false,"index":false},{"name":"hit_count","description":"Number of cache hits on thumbnail","type":"text","hidden":false,"required":false,"index":false},{"name":"icon_mode","description":"Thumbnail icon mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cache_path","description":"Path to cache data","type":"text","hidden":false,"required":false,"index":false}]},{"name":"registry","description":"All of the Windows registry hives.","platforms":["windows"],"columns":[{"name":"key","description":"Name of the key to search for","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Full path to the value","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the registry value entry","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the registry value, or 'subkey' if item is a subkey","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Data content of registry value","type":"text","hidden":false,"required":false,"index":false},{"name":"mtime","description":"timestamp of the most recent registry write","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"routes","description":"The active route table for the host system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"destination","description":"Destination IP address","type":"text","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Netmask length","type":"integer","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Route gateway","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Route source","type":"text","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags to describe route","type":"integer","hidden":false,"required":false,"index":false},{"name":"interface","description":"Route local interface","type":"text","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Maximum Transmission Unit for the route","type":"integer","hidden":false,"required":false,"index":false},{"name":"metric","description":"Cost of route. Lowest is preferred","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of route","type":"text","hidden":false,"required":false,"index":false},{"name":"hopcount","description":"Max hops expected","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"rpm_package_files","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"package","description":"RPM package name","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"File path within the package","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"File default username from info DB","type":"text","hidden":false,"required":false,"index":false},{"name":"groupname","description":"File default groupname from info DB","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"File permissions mode from info DB","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size in bytes from RPM info DB","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 file digest from RPM info DB","type":"text","hidden":false,"required":false,"index":false}]},{"name":"rpm_packages","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"name","description":"RPM package name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","hidden":false,"required":false,"index":false},{"name":"release","description":"Package release","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source RPM package name (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the package contents","type":"text","hidden":false,"required":false,"index":false},{"name":"arch","description":"Architecture(s) supported","type":"text","hidden":false,"required":false,"index":false},{"name":"epoch","description":"Package epoch value","type":"integer","hidden":false,"required":false,"index":false},{"name":"install_time","description":"When the package was installed","type":"integer","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Package vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"package_group","description":"Package group","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","hidden":true,"required":false,"index":false}]},{"name":"running_apps","description":"macOS applications currently running on the host system.","platforms":["darwin"],"columns":[{"name":"pid","description":"The pid of the application","type":"integer","hidden":false,"required":false,"index":false},{"name":"bundle_identifier","description":"The bundle identifier of the application","type":"text","hidden":false,"required":false,"index":false},{"name":"is_active","description":"1 if the application is in focus, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"safari_extensions","description":"Safari browser extension details for all users.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the extension","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension display name","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension long version","type":"text","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Bundle SDK used to compile extension","type":"text","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Optional developer identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional extension description text","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension XAR bundle","type":"text","hidden":false,"required":false,"index":false}]},{"name":"sandboxes","description":"OS X application sandboxes container details.","platforms":["darwin"],"columns":[{"name":"label","description":"UTI-format bundle or label ID","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"Sandbox owner","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Application sandboxings enabled on container","type":"integer","hidden":false,"required":false,"index":false},{"name":"build_id","description":"Sandbox-specific identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"Application bundle used by the sandbox","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to sandbox container directory","type":"text","hidden":false,"required":false,"index":false}]},{"name":"scheduled_tasks","description":"Lists all of the tasks in the Windows task scheduler.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the scheduled task","type":"text","hidden":false,"required":false,"index":false},{"name":"action","description":"Actions executed by the scheduled task","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the executable to be run","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether or not the scheduled task is enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the scheduled task","type":"text","hidden":false,"required":false,"index":false},{"name":"hidden","description":"Whether or not the task is visible in the UI","type":"integer","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Timestamp the task last ran","type":"bigint","hidden":false,"required":false,"index":false},{"name":"next_run_time","description":"Timestamp the task is scheduled to run next","type":"bigint","hidden":false,"required":false,"index":false},{"name":"last_run_message","description":"Exit status message of the last task run","type":"text","hidden":false,"required":false,"index":false},{"name":"last_run_code","description":"Exit status code of the last task run","type":"text","hidden":false,"required":false,"index":false}]},{"name":"screenlock","description":"macOS screenlock status for the current logged in user context.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 If a password is required after sleep or the screensaver begins; else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"grace_period","description":"The amount of time in seconds the screen must be asleep or the screensaver on before a password is required on-wake. 0 = immediately; -1 = no password is required on-wake","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"seccomp_events","description":"A virtual table that tracks seccomp events.","platforms":["linux"],"columns":[{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID (loginuid) of the user who started the analyzed process","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the user who started the analyzed process","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the user who started the analyzed process","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"ses","description":"Session ID of the session from which the analyzed process was invoked","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","hidden":false,"required":false,"index":false},{"name":"exe","description":"The path to the executable that was used to invoke the analyzed process","type":"text","hidden":false,"required":false,"index":false},{"name":"sig","description":"Signal value sent to process by seccomp","type":"bigint","hidden":false,"required":false,"index":false},{"name":"arch","description":"Information about the CPU architecture","type":"text","hidden":false,"required":false,"index":false},{"name":"syscall","description":"Type of the system call","type":"text","hidden":false,"required":false,"index":false},{"name":"compat","description":"Is system call in compatibility mode","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ip","description":"Instruction pointer value","type":"text","hidden":false,"required":false,"index":false},{"name":"code","description":"The seccomp action","type":"text","hidden":false,"required":false,"index":false}]},{"name":"secureboot","description":"Secure Boot UEFI Settings.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"secure_boot","description":"Whether secure boot is enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"setup_mode","description":"Whether setup mode is enabled","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"selinux_events","description":"Track SELinux events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"Message","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"selinux_settings","description":"Track active SELinux settings.","platforms":["linux"],"columns":[{"name":"scope","description":"Where the key is located inside the SELinuxFS mount point.","type":"text","hidden":false,"required":false,"index":false},{"name":"key","description":"Key or class name.","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Active value.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"services","description":"Lists all installed Windows services and their relevant data.","platforms":["windows"],"columns":[{"name":"name","description":"Service name","type":"text","hidden":false,"required":false,"index":false},{"name":"service_type","description":"Service Type: OWN_PROCESS, SHARE_PROCESS and maybe Interactive (can interact with the desktop)","type":"text","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Service Display name","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Service Current status: STOPPED, START_PENDING, STOP_PENDING, RUNNING, CONTINUE_PENDING, PAUSE_PENDING, PAUSED","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"the Process ID of the service","type":"integer","hidden":false,"required":false,"index":false},{"name":"start_type","description":"Service start type: BOOT_START, SYSTEM_START, AUTO_START, DEMAND_START, DISABLED","type":"text","hidden":false,"required":false,"index":false},{"name":"win32_exit_code","description":"The error code that the service uses to report an error that occurs when it is starting or stopping","type":"integer","hidden":false,"required":false,"index":false},{"name":"service_exit_code","description":"The service-specific error code that the service returns when an error occurs while the service is starting or stopping","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Service Executable","type":"text","hidden":false,"required":false,"index":false},{"name":"module_path","description":"Path to ServiceDll","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Service Description","type":"text","hidden":false,"required":false,"index":false},{"name":"user_account","description":"The name of the account that the service process will be logged on as when it runs. This name can be of the form Domain\\UserName. If the account belongs to the built-in domain, the name can be of the form .\\UserName.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shadow","description":"Local system users encrypted passwords and related information. Please note, that you usually need superuser rights to access `/etc/shadow`.","platforms":["linux"],"columns":[{"name":"password_status","description":"Password status","type":"text","hidden":false,"required":false,"index":false},{"name":"hash_alg","description":"Password hashing algorithm","type":"text","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Date of last password change (starting from UNIX epoch date)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimal number of days between password changes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum number of days between password changes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"warning","description":"Number of days before password expires to warn user about it","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Number of days after password expires until account is blocked","type":"bigint","hidden":false,"required":false,"index":false},{"name":"expire","description":"Number of days since UNIX epoch date until account is disabled","type":"bigint","hidden":false,"required":false,"index":false},{"name":"flag","description":"Reserved","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shared_folders","description":"Folders available to others via SMB or AFP.","platforms":["darwin"],"columns":[{"name":"name","description":"The shared name of the folder as it appears to other users","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute path of shared folder on the local system","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shared_memory","description":"OS shared memory regions.","platforms":["linux"],"columns":[{"name":"shmid","description":"Shared memory segment ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"User ID of owning process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"creator_uid","description":"User ID of creator process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID to last use the segment","type":"bigint","hidden":false,"required":false,"index":false},{"name":"creator_pid","description":"Process ID that created the segment","type":"bigint","hidden":false,"required":false,"index":false},{"name":"atime","description":"Attached time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"dtime","description":"Detached time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Changed time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Memory segment permissions","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Size in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"attached","description":"Number of attached processes","type":"integer","hidden":false,"required":false,"index":false},{"name":"status","description":"Destination/attach status","type":"text","hidden":false,"required":false,"index":false},{"name":"locked","description":"1 if segment is locked else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shared_resources","description":"Displays shared resources on a computer system running Windows. This may be a disk drive, printer, interprocess communication, or other sharable device.","platforms":["windows"],"columns":[{"name":"description","description":"A textual description of the object","type":"text","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the object was installed. Lack of a value does not indicate that the object is not installed.","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"String that indicates the current status of the object.","type":"text","hidden":false,"required":false,"index":false},{"name":"allow_maximum","description":"Number of concurrent users for this resource has been limited. If True, the value in the MaximumAllowed property is ignored.","type":"integer","hidden":false,"required":false,"index":false},{"name":"maximum_allowed","description":"Limit on the maximum number of users allowed to use this resource concurrently. The value is only valid if the AllowMaximum property is set to FALSE.","type":"integer","hidden":false,"required":false,"index":false},{"name":"name","description":"Alias given to a path set up as a share on a computer system running Windows.","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Local path of the Windows share.","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of resource being shared. Types include: disk drives, print queues, interprocess communications (IPC), and general devices.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"sharing_preferences","description":"OS X Sharing preferences.","platforms":["darwin"],"columns":[{"name":"screen_sharing","description":"1 If screen sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"file_sharing","description":"1 If file sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"printer_sharing","description":"1 If printer sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_login","description":"1 If remote login is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_management","description":"1 If remote management is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_apple_events","description":"1 If remote apple events are enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"internet_sharing","description":"1 If internet sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"bluetooth_sharing","description":"1 If bluetooth sharing is enabled for any user else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"disc_sharing","description":"1 If CD or DVD sharing is enabled else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"content_caching","description":"1 If content caching is enabled else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shell_history","description":"A line-delimited (command) table of per-user .*_history data.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"Shell history owner","type":"bigint","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp. It could be absent, default value is 0.","type":"integer","hidden":false,"required":false,"index":false},{"name":"command","description":"Unparsed date/line/command history line","type":"text","hidden":false,"required":false,"index":false},{"name":"history_file","description":"Path to the .*_history for this user","type":"text","hidden":false,"required":false,"index":false}]},{"name":"shellbags","description":"Shows directories accessed via Windows Explorer.","platforms":["windows"],"columns":[{"name":"sid","description":"User SID","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Shellbags source Registry file","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Directory name.","type":"text","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Directory Modified time.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"created_time","description":"Directory Created time.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"accessed_time","description":"Directory Accessed time.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mft_entry","description":"Directory master file table entry.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mft_sequence","description":"Directory master file table sequence.","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shimcache","description":"Application Compatibility Cache, contains artifacts of execution.","platforms":["windows"],"columns":[{"name":"entry","description":"Execution order.","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the executed file.","type":"text","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"File Modified time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"execution_flag","description":"Boolean Execution flag, 1 for execution, 0 for no execution, -1 for missing (this flag does not exist on Windows 10 and higher).","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"shortcut_files","description":"View data about Windows Shortcut files.","platforms":["windows"],"columns":[{"name":"path","description":"Directory name.","type":"text","hidden":false,"required":true,"index":false},{"name":"target_path","description":"Target file path","type":"text","hidden":false,"required":false,"index":false},{"name":"target_modified","description":"Target Modified time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"target_created","description":"Target Created time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"target_accessed","description":"Target Accessed time.","type":"integer","hidden":false,"required":false,"index":false},{"name":"target_size","description":"Size of target file.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to target file from lnk file.","type":"text","hidden":false,"required":false,"index":false},{"name":"local_path","description":"Local system path to target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"working_path","description":"Target file directory.","type":"text","hidden":false,"required":false,"index":false},{"name":"icon_path","description":"Lnk file icon location.","type":"text","hidden":false,"required":false,"index":false},{"name":"common_path","description":"Common system path to target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"command_args","description":"Command args passed to lnk file.","type":"text","hidden":false,"required":false,"index":false},{"name":"hostname","description":"Optional hostname of the target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"share_name","description":"Share name of the target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"device_type","description":"Device containing the target file.","type":"text","hidden":false,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number.","type":"text","hidden":false,"required":false,"index":false},{"name":"mft_entry","description":"Target mft entry.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"mft_sequence","description":"Target mft sequence.","type":"integer","hidden":false,"required":false,"index":false},{"name":"description","description":"Lnk file description.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"signature","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["darwin"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","hidden":false,"required":true,"index":false},{"name":"hash_resources","description":"Set to 1 to also hash resources, or 0 otherwise. Default is 1","type":"integer","hidden":false,"required":false,"index":false},{"name":"arch","description":"If applicable, the arch of the signed code","type":"text","hidden":false,"required":false,"index":false},{"name":"signed","description":"1 If the file is signed else 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"identifier","description":"The signing identifier sealed into the signature","type":"text","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Hash of the application Code Directory","type":"text","hidden":false,"required":false,"index":false},{"name":"team_identifier","description":"The team signing identifier sealed into the signature","type":"text","hidden":false,"required":false,"index":false},{"name":"authority","description":"Certificate Common Name","type":"text","hidden":false,"required":false,"index":false}]},{"name":"sip_config","description":"Apple's System Integrity Protection (rootless) status.","platforms":["darwin"],"columns":[{"name":"config_flag","description":"The System Integrity Protection config flag","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this configuration is enabled, otherwise 0","type":"integer","hidden":false,"required":false,"index":false},{"name":"enabled_nvram","description":"1 if this configuration is enabled, otherwise 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"smart_drive_info","description":"Drive information read by SMART controller utilizing autodetect.","platforms":["darwin","linux"],"columns":[{"name":"device_name","description":"Name of block device","type":"text","hidden":false,"required":false,"index":false},{"name":"disk_id","description":"Physical slot number of device, only exists when hardware storage controller exists","type":"integer","hidden":false,"required":false,"index":false},{"name":"driver_type","description":"The explicit device type used to retrieve the SMART information","type":"text","hidden":false,"required":false,"index":false},{"name":"model_family","description":"Drive model family","type":"text","hidden":false,"required":false,"index":false},{"name":"device_model","description":"Device Model","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Device serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"lu_wwn_device_id","description":"Device Identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"additional_product_id","description":"An additional drive identifier if any","type":"text","hidden":false,"required":false,"index":false},{"name":"firmware_version","description":"Drive firmware version","type":"text","hidden":false,"required":false,"index":false},{"name":"user_capacity","description":"Bytes of drive capacity","type":"text","hidden":false,"required":false,"index":false},{"name":"sector_sizes","description":"Bytes of drive sector sizes","type":"text","hidden":false,"required":false,"index":false},{"name":"rotation_rate","description":"Drive RPM","type":"text","hidden":false,"required":false,"index":false},{"name":"form_factor","description":"Form factor if reported","type":"text","hidden":false,"required":false,"index":false},{"name":"in_smartctl_db","description":"Boolean value for if drive is recognized","type":"integer","hidden":false,"required":false,"index":false},{"name":"ata_version","description":"ATA version of drive","type":"text","hidden":false,"required":false,"index":false},{"name":"transport_type","description":"Drive transport type","type":"text","hidden":false,"required":false,"index":false},{"name":"sata_version","description":"SATA version, if any","type":"text","hidden":false,"required":false,"index":false},{"name":"read_device_identity_failure","description":"Error string for device id read, if any","type":"text","hidden":false,"required":false,"index":false},{"name":"smart_supported","description":"SMART support status","type":"text","hidden":false,"required":false,"index":false},{"name":"smart_enabled","description":"SMART enabled status","type":"text","hidden":false,"required":false,"index":false},{"name":"packet_device_type","description":"Packet device type","type":"text","hidden":false,"required":false,"index":false},{"name":"power_mode","description":"Device power mode","type":"text","hidden":false,"required":false,"index":false},{"name":"warnings","description":"Warning messages from SMART controller","type":"text","hidden":false,"required":false,"index":false}]},{"name":"smbios_tables","description":"BIOS (DMI) structure common details and content.","platforms":["darwin","linux"],"columns":[{"name":"number","description":"Table entry number","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Table entry type","type":"integer","hidden":false,"required":false,"index":false},{"name":"description","description":"Table entry description","type":"text","hidden":false,"required":false,"index":false},{"name":"handle","description":"Table entry handle","type":"integer","hidden":false,"required":false,"index":false},{"name":"header_size","description":"Header size in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"size","description":"Table entry size in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table entry","type":"text","hidden":false,"required":false,"index":false}]},{"name":"smc_keys","description":"Apple's system management controller keys.","platforms":["darwin"],"columns":[{"name":"key","description":"4-character key","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"SMC-reported type literal type","type":"text","hidden":false,"required":false,"index":false},{"name":"size","description":"Reported size of data in bytes","type":"integer","hidden":false,"required":false,"index":false},{"name":"value","description":"A type-encoded representation of the key value","type":"text","hidden":false,"required":false,"index":false},{"name":"hidden","description":"1 if this key is normally hidden, otherwise 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"socket_events","description":"Track network socket opens and closes.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"The socket action (bind, listen, close)","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"status","description":"Either 'succeeded', 'failed', 'in_progress' (connect() on non-blocking socket) or 'no_client' (null accept() on non-blocking socket)","type":"text","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","hidden":true,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","hidden":false,"required":false,"index":false},{"name":"socket","description":"The local path (UNIX domain socket only)","type":"text","hidden":true,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false},{"name":"success","description":"Deprecated. Use the 'status' column instead","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"ssh_configs","description":"A table of parsed ssh_configs.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"The local owner of the ssh_config file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"block","description":"The host or match block","type":"text","hidden":false,"required":false,"index":false},{"name":"option","description":"The option and value","type":"text","hidden":false,"required":false,"index":false},{"name":"ssh_config_file","description":"Path to the ssh_config file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"startup_items","description":"Applications and binaries set as user/login startup items.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"name","description":"Name of startup item","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of startup item","type":"text","hidden":false,"required":false,"index":false},{"name":"args","description":"Arguments provided to startup executable","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Startup Item or Login Item","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Directory or plist containing startup item","type":"text","hidden":false,"required":false,"index":false},{"name":"status","description":"Startup status; either enabled or disabled","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"The user associated with the startup item","type":"text","hidden":false,"required":false,"index":false}]},{"name":"sudoers","description":"Rules for running commands as other users via sudo.","platforms":["darwin","linux"],"columns":[{"name":"source","description":"Source file containing the given rule","type":"text","hidden":false,"required":false,"index":false},{"name":"header","description":"Symbol for given rule","type":"text","hidden":false,"required":false,"index":false},{"name":"rule_details","description":"Rule definition","type":"text","hidden":false,"required":false,"index":false}]},{"name":"suid_bin","description":"suid binaries in common locations.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Binary path","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Binary owner username","type":"text","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Binary owner group","type":"text","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Binary permissions","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"syslog_events","description":"","platforms":["linux"],"columns":[{"name":"time","description":"Current unix epoch time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Time known to syslog","type":"text","hidden":false,"required":false,"index":false},{"name":"host","description":"Hostname configured for syslog","type":"text","hidden":false,"required":false,"index":false},{"name":"severity","description":"Syslog severity","type":"integer","hidden":false,"required":false,"index":false},{"name":"facility","description":"Syslog facility","type":"text","hidden":false,"required":false,"index":false},{"name":"tag","description":"The syslog tag","type":"text","hidden":false,"required":false,"index":false},{"name":"message","description":"The syslog message","type":"text","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"system_controls","description":"sysctl names, values, and settings information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Full sysctl MIB name","type":"text","hidden":false,"required":false,"index":false},{"name":"oid","description":"Control MIB","type":"text","hidden":false,"required":false,"index":false},{"name":"subsystem","description":"Subsystem ID, control type","type":"text","hidden":false,"required":false,"index":false},{"name":"current_value","description":"Value of setting","type":"text","hidden":false,"required":false,"index":false},{"name":"config_value","description":"The MIB value set in /etc/sysctl.conf","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Data type","type":"text","hidden":false,"required":false,"index":false},{"name":"field_name","description":"Specific attribute of opaque type","type":"text","hidden":false,"required":false,"index":false}]},{"name":"system_extensions","description":"macOS (>= 10.15) system extension table.","platforms":["darwin"],"columns":[{"name":"path","description":"Original path of system extension","type":"text","hidden":false,"required":false,"index":false},{"name":"UUID","description":"Extension unique id","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"System extension state","type":"text","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Identifier name","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"System extension version","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"System extension category","type":"text","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"System extension bundle path","type":"text","hidden":false,"required":false,"index":false},{"name":"team","description":"Signing team ID","type":"text","hidden":false,"required":false,"index":false},{"name":"mdm_managed","description":"1 if managed by MDM system extension payload configuration, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"system_info","description":"System information for identification.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"hostname","description":"Network hostname including domain","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"CPU type","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"CPU subtype","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_brand","description":"CPU brand string, contains vendor and model","type":"text","hidden":false,"required":false,"index":false},{"name":"cpu_physical_cores","description":"Number of physical CPU cores in to the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_logical_cores","description":"Number of logical CPU cores available to the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_microcode","description":"Microcode version","type":"text","hidden":false,"required":false,"index":false},{"name":"physical_memory","description":"Total physical memory in bytes","type":"bigint","hidden":false,"required":false,"index":false},{"name":"hardware_vendor","description":"Hardware vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hardware model","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_version","description":"Hardware version","type":"text","hidden":false,"required":false,"index":false},{"name":"hardware_serial","description":"Device serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"board_vendor","description":"Board vendor","type":"text","hidden":false,"required":false,"index":false},{"name":"board_model","description":"Board model","type":"text","hidden":false,"required":false,"index":false},{"name":"board_version","description":"Board version","type":"text","hidden":false,"required":false,"index":false},{"name":"board_serial","description":"Board serial number","type":"text","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Friendly computer name (optional)","type":"text","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Local hostname (optional)","type":"text","hidden":false,"required":false,"index":false}]},{"name":"systemd_units","description":"Track systemd units.","platforms":["linux"],"columns":[{"name":"id","description":"Unique unit identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Unit description","type":"text","hidden":false,"required":false,"index":false},{"name":"load_state","description":"Reflects whether the unit definition was properly loaded","type":"text","hidden":false,"required":false,"index":false},{"name":"active_state","description":"The high-level unit activation state, i.e. generalization of SUB","type":"text","hidden":false,"required":false,"index":false},{"name":"sub_state","description":"The low-level unit activation state, values depend on unit type","type":"text","hidden":false,"required":false,"index":false},{"name":"following","description":"The name of another unit that this unit follows in state","type":"text","hidden":false,"required":false,"index":false},{"name":"object_path","description":"The object path for this unit","type":"text","hidden":false,"required":false,"index":false},{"name":"job_id","description":"Next queued job id","type":"bigint","hidden":false,"required":false,"index":false},{"name":"job_type","description":"Job type","type":"text","hidden":false,"required":false,"index":false},{"name":"job_path","description":"The object path for the job","type":"text","hidden":false,"required":false,"index":false},{"name":"fragment_path","description":"The unit file path this unit was read from, if there is any","type":"text","hidden":false,"required":false,"index":false},{"name":"user","description":"The configured user, if any","type":"text","hidden":false,"required":false,"index":false},{"name":"source_path","description":"Path to the (possibly generated) unit configuration file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"temperature_sensors","description":"Machine's temperature sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on OS X","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of temperature source","type":"text","hidden":false,"required":false,"index":false},{"name":"celsius","description":"Temperature in Celsius","type":"double","hidden":false,"required":false,"index":false},{"name":"fahrenheit","description":"Temperature in Fahrenheit","type":"double","hidden":false,"required":false,"index":false}]},{"name":"time","description":"Track current date and time in the system.","platforms":["darwin","linux","freebsd","windows"],"columns":[{"name":"weekday","description":"Current weekday in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"year","description":"Current year in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"month","description":"Current month in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"day","description":"Current day in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"hour","description":"Current hour in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Current minutes in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Current seconds in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"timezone","description":"Current timezone in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"local_time","description":"Current local UNIX time in the system","type":"integer","hidden":false,"required":false,"index":false},{"name":"local_timezone","description":"Current local timezone in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"unix_time","description":"Current UNIX time in the system, converted to UTC if --utc enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"timestamp","description":"Current timestamp (log format) in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Current date and time (ISO format) in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"iso_8601","description":"Current time (ISO format) in the system","type":"text","hidden":false,"required":false,"index":false},{"name":"win_timestamp","description":"Timestamp value in 100 nanosecond units.","type":"bigint","hidden":true,"required":false,"index":false}]},{"name":"time_machine_backups","description":"Backups to drives using TimeMachine.","platforms":["darwin"],"columns":[{"name":"destination_id","description":"Time Machine destination ID","type":"text","hidden":false,"required":false,"index":false},{"name":"backup_date","description":"Backup Date","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"time_machine_destinations","description":"Locations backed up to using Time Machine.","platforms":["darwin"],"columns":[{"name":"alias","description":"Human readable name of drive","type":"text","hidden":false,"required":false,"index":false},{"name":"destination_id","description":"Time Machine destination ID","type":"text","hidden":false,"required":false,"index":false},{"name":"consistency_scan_date","description":"Consistency scan date","type":"integer","hidden":false,"required":false,"index":false},{"name":"root_volume_uuid","description":"Root UUID of backup volume","type":"text","hidden":false,"required":false,"index":false},{"name":"bytes_available","description":"Bytes available on volume","type":"integer","hidden":false,"required":false,"index":false},{"name":"bytes_used","description":"Bytes used on volume","type":"integer","hidden":false,"required":false,"index":false},{"name":"encryption","description":"Last known encrypted state","type":"text","hidden":false,"required":false,"index":false}]},{"name":"tpm_info","description":"A table that lists the TPM related information.","platforms":["windows"],"columns":[{"name":"activated","description":"TPM is activated","type":"integer","hidden":false,"required":false,"index":false},{"name":"enabled","description":"TPM is enabled","type":"integer","hidden":false,"required":false,"index":false},{"name":"owned","description":"TPM is ownned","type":"integer","hidden":false,"required":false,"index":false},{"name":"manufacturer_version","description":"TPM version","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer_id","description":"TPM manufacturers ID","type":"integer","hidden":false,"required":false,"index":false},{"name":"manufacturer_name","description":"TPM manufacturers name","type":"text","hidden":false,"required":false,"index":false},{"name":"product_name","description":"Product name of the TPM","type":"text","hidden":false,"required":false,"index":false},{"name":"physical_presence_version","description":"Version of the Physical Presence Interface","type":"text","hidden":false,"required":false,"index":false},{"name":"spec_version","description":"Trusted Computing Group specification that the TPM supports","type":"text","hidden":false,"required":false,"index":false}]},{"name":"ulimit_info","description":"System resource usage limits.","platforms":["darwin","linux"],"columns":[{"name":"type","description":"System resource to be limited","type":"text","hidden":false,"required":false,"index":false},{"name":"soft_limit","description":"Current limit value","type":"text","hidden":false,"required":false,"index":false},{"name":"hard_limit","description":"Maximum limit value","type":"text","hidden":false,"required":false,"index":false}]},{"name":"uptime","description":"Track time passed since last boot. Some systems track this as calendar time, some as runtime.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"days","description":"Days of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"hours","description":"Hours of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Minutes of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Seconds of uptime","type":"integer","hidden":false,"required":false,"index":false},{"name":"total_seconds","description":"Total uptime seconds","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"usb_devices","description":"USB devices that are actively plugged into the host system.","platforms":["darwin","linux"],"columns":[{"name":"usb_address","description":"USB Device used address","type":"integer","hidden":false,"required":false,"index":false},{"name":"usb_port","description":"USB Device used port","type":"integer","hidden":false,"required":false,"index":false},{"name":"vendor","description":"USB Device vendor string","type":"text","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded USB Device vendor identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"version","description":"USB Device version number","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"USB Device model string","type":"text","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded USB Device model identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"serial","description":"USB Device serial connection","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"USB Device class","type":"text","hidden":false,"required":false,"index":false},{"name":"subclass","description":"USB Device subclass","type":"text","hidden":false,"required":false,"index":false},{"name":"protocol","description":"USB Device protocol","type":"text","hidden":false,"required":false,"index":false},{"name":"removable","description":"1 If USB device is removable else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"user_events","description":"Track user events from the audit framework.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the event","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"The file description for the process socket","type":"integer","hidden":false,"required":false,"index":false},{"name":"path","description":"Supplied path from event","type":"text","hidden":false,"required":false,"index":false},{"name":"address","description":"The Internet protocol address or family ID","type":"text","hidden":false,"required":false,"index":false},{"name":"terminal","description":"The network protocol ID","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"user_groups","description":"Local system user group relationships.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"user_interaction_events","description":"Track user interaction events from macOS' event tapping framework.","platforms":["darwin"],"columns":[{"name":"time","description":"Time","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"user_ssh_keys","description":"Returns the private keys in the users ~/.ssh directory and whether or not they are encrypted.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"The local user that owns the key file","type":"bigint","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to key file","type":"text","hidden":false,"required":false,"index":false},{"name":"encrypted","description":"1 if key is encrypted, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"key_type","description":"The type of the private key. One of [rsa, dsa, dh, ec, hmac, cmac], or the empty string.","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"userassist","description":"UserAssist Registry Key tracks when a user executes an application from Windows Explorer.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of times the application has been executed.","type":"integer","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","hidden":true,"required":false,"index":false},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"video_info","description":"Retrieve video card information of the machine.","platforms":["windows"],"columns":[{"name":"color_depth","description":"The amount of bits per pixel to represent color.","type":"integer","hidden":false,"required":false,"index":false},{"name":"driver","description":"The driver of the device.","type":"text","hidden":false,"required":false,"index":false},{"name":"driver_date","description":"The date listed on the installed driver.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"driver_version","description":"The version of the installed driver.","type":"text","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the gpu.","type":"text","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the gpu.","type":"text","hidden":false,"required":false,"index":false},{"name":"series","description":"The series of the gpu.","type":"text","hidden":false,"required":false,"index":false},{"name":"video_mode","description":"The current resolution of the display.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"virtual_memory_info","description":"Darwin Virtual Memory statistics.","platforms":["darwin"],"columns":[{"name":"free","description":"Total number of free pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"active","description":"Total number of active pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Total number of inactive pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"speculative","description":"Total number of speculative pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"throttled","description":"Total number of throttled pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"wired","description":"Total number of wired down pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"purgeable","description":"Total number of purgeable pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"faults","description":"Total number of calls to vm_faults.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"copy","description":"Total number of copy-on-write pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"zero_fill","description":"Total number of zero filled pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"reactivated","description":"Total number of reactivated pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"purged","description":"Total number of purged pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"file_backed","description":"Total number of file backed pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"anonymous","description":"Total number of anonymous pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uncompressed","description":"Total number of uncompressed pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"compressor","description":"The number of pages used to store compressed VM pages.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"decompressed","description":"The total number of pages that have been decompressed by the VM compressor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"compressed","description":"The total number of pages that have been compressed by the VM compressor.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"page_ins","description":"The total number of requests for pages from a pager.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"page_outs","description":"Total number of pages paged out.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_ins","description":"The total number of compressed pages that have been swapped out to disk.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"swap_outs","description":"The total number of compressed pages that have been swapped back in from disk.","type":"bigint","hidden":false,"required":false,"index":false}]},{"name":"wifi_networks","description":"OS X known/remembered Wi-Fi networks list.","platforms":["darwin"],"columns":[{"name":"ssid","description":"SSID octets of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","hidden":false,"required":false,"index":false},{"name":"last_connected","description":"Last time this netword was connected to as a unix_time","type":"integer","hidden":false,"required":false,"index":false},{"name":"passpoint","description":"1 if Passpoint is supported, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"possibly_hidden","description":"1 if network is possibly a hidden network, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"roaming","description":"1 if roaming is supported, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"roaming_profile","description":"Describe the roaming profile, usually one of Single, Dual or Multi","type":"text","hidden":false,"required":false,"index":false},{"name":"captive_portal","description":"1 if this network has a captive portal, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"auto_login","description":"1 if auto login is enabled, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"temporarily_disabled","description":"1 if this network is temporarily disabled, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 if this network is disabled, 0 otherwise","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"wifi_status","description":"OS X current WiFi status.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","hidden":false,"required":false,"index":false},{"name":"transmit_rate","description":"The current transmit rate","type":"text","hidden":false,"required":false,"index":false},{"name":"mode","description":"The current operating mode for the Wi-Fi interface","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wifi_survey","description":"Scan for nearby WiFi networks.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"winbaseobj","description":"Lists named Windows objects in the default object directories, across all terminal services sessions. Example Windows ojbect types include Mutexes, Events, Jobs and Semaphors.","platforms":["windows"],"columns":[{"name":"session_id","description":"Terminal Services Session Id","type":"integer","hidden":false,"required":false,"index":false},{"name":"object_name","description":"Object Name","type":"text","hidden":false,"required":false,"index":false},{"name":"object_type","description":"Object Type","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_crashes","description":"Extracted information from Windows crash logs (Minidumps).","platforms":["windows"],"columns":[{"name":"datetime","description":"Timestamp (log format) of the crash","type":"text","hidden":false,"required":false,"index":false},{"name":"module","description":"Path of the crashed module within the process","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the executable file for the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID of the crashed process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID of the crashed thread","type":"bigint","hidden":false,"required":false,"index":false},{"name":"version","description":"File version info of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"process_uptime","description":"Uptime of the process in seconds","type":"bigint","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Multiple stack frames from the stack trace","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_code","description":"The Windows exception code","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_message","description":"The NTSTATUS error message associated with the exception code","type":"text","hidden":false,"required":false,"index":false},{"name":"exception_address","description":"Address (in hex) where the exception occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"registers","description":"The values of the system registers","type":"text","hidden":false,"required":false,"index":false},{"name":"command_line","description":"Command-line string passed to the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"current_directory","description":"Current working directory of the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"username","description":"Username of the user who ran the crashed process","type":"text","hidden":false,"required":false,"index":false},{"name":"machine_name","description":"Name of the machine where the crash happened","type":"text","hidden":false,"required":false,"index":false},{"name":"major_version","description":"Windows major version of the machine","type":"integer","hidden":false,"required":false,"index":false},{"name":"minor_version","description":"Windows minor version of the machine","type":"integer","hidden":false,"required":false,"index":false},{"name":"build_number","description":"Windows build number of the crashing machine","type":"integer","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of crash log","type":"text","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Path of the log file","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_eventlog","description":"Table for querying all recorded Windows event logs.","platforms":["windows"],"columns":[{"name":"channel","description":"Source or channel of the event","type":"text","hidden":false,"required":true,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"level","description":"Severity level associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID which emitted the event record","type":"integer","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID which emitted the event record","type":"integer","hidden":false,"required":false,"index":false},{"name":"time_range","description":"System time to selectively filter the events","type":"text","hidden":true,"required":false,"index":false},{"name":"timestamp","description":"Timestamp to selectively filter the events","type":"text","hidden":true,"required":false,"index":false},{"name":"xpath","description":"The custom query to filter events","type":"text","hidden":true,"required":true,"index":false}]},{"name":"windows_events","description":"Windows Event logs.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received","type":"bigint","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","hidden":false,"required":false,"index":false},{"name":"source","description":"Source or channel of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"level","description":"The severity level associated with the event","type":"integer","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"windows_optional_features","description":"Lists names and installation states of windows features. Maps to Win32_OptionalFeature WMI class.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the feature","type":"text","hidden":false,"required":false,"index":false},{"name":"caption","description":"Caption of feature in settings UI","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Installation state value. 1 == Enabled, 2 == Disabled, 3 == Absent","type":"integer","hidden":false,"required":false,"index":false},{"name":"statename","description":"Installation state name. 'Enabled','Disabled','Absent'","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_security_center","description":"The health status of Window Security features. Health values can be \"Good\", \"Poor\". \"Snoozed\", \"Not Monitored\", and \"Error\".","platforms":["windows"],"columns":[{"name":"firewall","description":"The health of the monitored Firewall (see windows_security_products)","type":"text","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"The health of the Windows Autoupdate feature","type":"text","hidden":false,"required":false,"index":false},{"name":"antivirus","description":"The health of the monitored Antivirus solution (see windows_security_products)","type":"text","hidden":false,"required":false,"index":false},{"name":"antispyware","description":"The health of the monitored Antispyware solution (see windows_security_products)","type":"text","hidden":false,"required":false,"index":false},{"name":"internet_settings","description":"The health of the Internet Settings","type":"text","hidden":false,"required":false,"index":false},{"name":"windows_security_center_service","description":"The health of the Windows Security Center Service","type":"text","hidden":false,"required":false,"index":false},{"name":"user_account_control","description":"The health of the User Account Control (UAC) capability in Windows","type":"text","hidden":false,"required":false,"index":false}]},{"name":"windows_security_products","description":"Enumeration of registered Windows security products.","platforms":["windows"],"columns":[{"name":"type","description":"Type of security product","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of product","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"State of protection","type":"text","hidden":false,"required":false,"index":false},{"name":"state_timestamp","description":"Timestamp for the product state","type":"text","hidden":false,"required":false,"index":false},{"name":"remediation_path","description":"Remediation path","type":"text","hidden":false,"required":false,"index":false},{"name":"signatures_up_to_date","description":"1 if product signatures are up to date, else 0","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"wmi_bios_info","description":"Lists important information from the system bios.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the Bios setting","type":"text","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the Bios setting","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_cli_event_consumers","description":"WMI CommandLineEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique name of a consumer.","type":"text","hidden":false,"required":false,"index":false},{"name":"command_line_template","description":"Standard string template that specifies the process to be started. This property can be NULL, and the ExecutablePath property is used as the command line.","type":"text","hidden":false,"required":false,"index":false},{"name":"executable_path","description":"Module to execute. The string can specify the full path and file name of the module to execute, or it can specify a partial name. If a partial name is specified, the current drive and current directory are assumed.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_event_filters","description":"Lists WMI event filters.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier of an event filter.","type":"text","hidden":false,"required":false,"index":false},{"name":"query","description":"Windows Management Instrumentation Query Language (WQL) event query that specifies the set of events for consumer notification, and the specific conditions for notification.","type":"text","hidden":false,"required":false,"index":false},{"name":"query_language","description":"Query language that the query is written in.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_filter_consumer_binding","description":"Lists the relationship between event consumers and filters.","platforms":["windows"],"columns":[{"name":"consumer","description":"Reference to an instance of __EventConsumer that represents the object path to a logical consumer, the recipient of an event.","type":"text","hidden":false,"required":false,"index":false},{"name":"filter","description":"Reference to an instance of __EventFilter that represents the object path to an event filter which is a query that specifies the type of event to be received.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"wmi_script_event_consumers","description":"WMI ActiveScriptEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier for the event consumer. ","type":"text","hidden":false,"required":false,"index":false},{"name":"scripting_engine","description":"Name of the scripting engine to use, for example, 'VBScript'. This property cannot be NULL.","type":"text","hidden":false,"required":false,"index":false},{"name":"script_file_name","description":"Name of the file from which the script text is read, intended as an alternative to specifying the text of the script in the ScriptText property.","type":"text","hidden":false,"required":false,"index":false},{"name":"script_text","description":"Text of the script that is expressed in a language known to the scripting engine. This property must be NULL if the ScriptFileName property is not NULL.","type":"text","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"xprotect_entries","description":"Database of the machine's XProtect signatures.","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","hidden":false,"required":false,"index":false},{"name":"launch_type","description":"Launch services content type","type":"text","hidden":false,"required":false,"index":false},{"name":"identity","description":"XProtect identity (SHA1) of content","type":"text","hidden":false,"required":false,"index":false},{"name":"filename","description":"Use this file name to match","type":"text","hidden":false,"required":false,"index":false},{"name":"filetype","description":"Use this file type to match","type":"text","hidden":false,"required":false,"index":false},{"name":"optional","description":"Match any of the identities/patterns for this XProtect name","type":"integer","hidden":false,"required":false,"index":false},{"name":"uses_pattern","description":"Uses a match pattern instead of identity","type":"integer","hidden":false,"required":false,"index":false}]},{"name":"xprotect_meta","description":"Database of the machine's XProtect browser-related signatures.","platforms":["darwin"],"columns":[{"name":"identifier","description":"Browser plugin or extension identifier","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Either plugin or extension","type":"text","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Developer identity (SHA1) of extension","type":"text","hidden":false,"required":false,"index":false},{"name":"min_version","description":"The minimum allowed plugin version.","type":"text","hidden":false,"required":false,"index":false}]},{"name":"xprotect_reports","description":"Database of XProtect matches (if user generated/sent an XProtect report).","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","hidden":false,"required":false,"index":false},{"name":"user_action","description":"Action taken by user after prompted","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Quarantine alert time","type":"text","hidden":false,"required":false,"index":false}]},{"name":"yara","description":"Track YARA matches for files or PIDs.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"The path scanned","type":"text","hidden":false,"required":true,"index":false},{"name":"matches","description":"List of YARA matches","type":"text","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","hidden":false,"required":false,"index":false},{"name":"sig_group","description":"Signature group used","type":"text","hidden":false,"required":false,"index":false},{"name":"sigfile","description":"Signature file used","type":"text","hidden":false,"required":false,"index":false},{"name":"sigrule","description":"Signature strings used","type":"text","hidden":true,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","hidden":false,"required":false,"index":false},{"name":"sigurl","description":"Signature url","type":"text","hidden":true,"required":false,"index":false}]},{"name":"yara_events","description":"Track YARA matches for files specified in configuration data.","platforms":["darwin","linux","windows"],"columns":[{"name":"target_path","description":"The path scanned","type":"text","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file","type":"text","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","hidden":false,"required":false,"index":false},{"name":"matches","description":"List of YARA matches","type":"text","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","hidden":false,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of the scan","type":"bigint","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","hidden":true,"required":false,"index":false}]},{"name":"ycloud_instance_metadata","description":"Yandex.Cloud instance metadata.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"instance_id","description":"Unique identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"folder_id","description":"Folder identifier for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"hostname","description":"Hostname of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","hidden":false,"required":false,"index":false},{"name":"serial_port_enabled","description":"Indicates if serial port is enabled for the VM","type":"text","hidden":false,"required":false,"index":false},{"name":"metadata_endpoint","description":"Endpoint used to fetch VM metadata","type":"text","hidden":false,"required":false,"index":false}]},{"name":"yum_sources","description":"Current list of Yum repositories or software channels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Repository name","type":"text","hidden":false,"required":false,"index":false},{"name":"baseurl","description":"Repository base URL","type":"text","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether the repository is used","type":"text","hidden":false,"required":false,"index":false},{"name":"gpgcheck","description":"Whether packages are GPG checked","type":"text","hidden":false,"required":false,"index":false},{"name":"gpgkey","description":"URL to GPG key","type":"text","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"host_users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"uid","description":"User ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","hidden":false,"required":false,"index":false},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","hidden":true,"required":false,"index":false},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"host_groups","description":"Local system groups.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","hidden":true,"required":false,"index":false},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","hidden":true,"required":false,"index":false},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","hidden":true,"required":false,"index":false}]},{"name":"host_processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows","freebsd"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"protection_type","description":"The protection type of the process","type":"text","hidden":true,"required":false,"index":false},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","hidden":true,"required":false,"index":false},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","hidden":true,"required":false,"index":false},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","hidden":false,"required":false,"index":false}]}] \ No newline at end of file diff --git a/x-pack/plugins/osquery/public/components/beta_badge.tsx b/x-pack/plugins/osquery/public/components/beta_badge.tsx deleted file mode 100644 index f63c80168b487..0000000000000 --- a/x-pack/plugins/osquery/public/components/beta_badge.tsx +++ /dev/null @@ -1,37 +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 { EuiBetaBadge, EuiText } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import styled from 'styled-components'; - -export const BetaBadgeRowWrapper = styled(EuiText)` - display: flex; - align-items: center; -`; - -const Wrapper = styled.div` - padding-left: ${({ theme }) => theme.eui.paddingSizes.s}; -`; - -const betaBadgeLabel = i18n.translate('xpack.osquery.common.tabBetaBadgeLabel', { - defaultMessage: 'Beta', -}); - -const betaBadgeTooltipContent = i18n.translate('xpack.osquery.common.tabBetaBadgeTooltipContent', { - defaultMessage: - 'This feature is under active development. Extra functionality is coming, and some functionality may change.', -}); - -const BetaBadgeComponent = () => ( - - - -); - -export const BetaBadge = React.memo(BetaBadgeComponent); diff --git a/x-pack/plugins/osquery/public/fleet_integration/config_uploader.tsx b/x-pack/plugins/osquery/public/fleet_integration/config_uploader.tsx new file mode 100644 index 0000000000000..95ccc0e5cccf5 --- /dev/null +++ b/x-pack/plugins/osquery/public/fleet_integration/config_uploader.tsx @@ -0,0 +1,132 @@ +/* + * Copyright 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 { EuiLink, EuiFormRow, EuiFilePicker, EuiSpacer } from '@elastic/eui'; +import React, { useCallback, useState, useRef } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +const SUPPORTED_CONFIG_EXTENSIONS = ['application/json', 'text/plain']; + +const ExampleConfigLink = React.memo(() => ( + + + +)); + +ExampleConfigLink.displayName = 'ExampleOsqueryConfigLink'; + +interface ConfigUploaderProps { + onChange: (payload: Record) => void; +} + +const ConfigUploaderComponent: React.FC = ({ onChange }) => { + const filePickerRef = useRef(null); + const [isInvalid, setIsInvalid] = useState(null); + // @ts-expect-error update types + let fileReader; + + const handleFileRead = () => { + // @ts-expect-error update types + const content = fileReader.result; + + let parsedContent; + + try { + parsedContent = JSON.parse(content.replaceAll('\\\n', ''), (key, value) => { + if (key === 'query') { + // remove any multiple spaces from the query + return value.replaceAll(/\s(?=\s)/gm, ''); + } + return value; + }); + + setIsInvalid(null); + } catch (error) { + setIsInvalid(error); + // @ts-expect-error update types + filePickerRef.current?.removeFiles(new Event('fake')); + } + + onChange(parsedContent); + // @ts-expect-error update types + filePickerRef.current?.removeFiles(new Event('fake')); + }; + + // @ts-expect-error update types + // eslint-disable-next-line react-hooks/exhaustive-deps + const handleFileChosen = (file) => { + fileReader = new FileReader(); + fileReader.onloadend = handleFileRead; + fileReader.readAsText(file); + }; + + const handleInputChange = useCallback( + (inputFiles) => { + if (!inputFiles.length) { + return; + } + + if ( + inputFiles.length && + ((!!inputFiles[0].type.length && + !SUPPORTED_CONFIG_EXTENSIONS.includes(inputFiles[0].type)) ?? + !inputFiles[0].name.endsWith('.conf')) + ) { + setIsInvalid( + i18n.translate('xpack.osquery.configUploader.unsupportedFileTypeText', { + defaultMessage: + 'File type {fileType} is not supported, please upload {supportedFileTypes} config file', + values: { + fileType: inputFiles[0].type, + supportedFileTypes: SUPPORTED_CONFIG_EXTENSIONS.join(' or '), + }, + }) + ); + // @ts-expect-error update types + filePickerRef.current?.removeFiles(new Event('fake')); + return; + } + + handleFileChosen(inputFiles[0]); + }, + [handleFileChosen] + ); + + return ( + <> + + } + isInvalid={!!isInvalid} + error={<>{`${isInvalid}`}} + > + + + + ); +}; + +export const ConfigUploader = React.memo(ConfigUploaderComponent); diff --git a/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx b/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx index b6a90541d26c6..4bcc9d9ebf2a1 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/navigation_buttons.tsx @@ -14,13 +14,11 @@ import { useKibana, isModifiedEvent, isLeftClickEvent } from '../common/lib/kiba interface NavigationButtonsProps { isDisabled?: boolean; - integrationPolicyId?: string | undefined; agentPolicyId?: string | undefined; } const NavigationButtonsComponent: React.FC = ({ isDisabled = false, - integrationPolicyId, agentPolicyId, }) => { const { @@ -52,7 +50,7 @@ const NavigationButtonsComponent: React.FC = ({ ); const packsHref = getUrlForApp(PLUGIN_ID, { - path: integrationPolicyId ? `/packs/${integrationPolicyId}/edit` : `/packs`, + path: `/packs`, }); const packsClick = useCallback( @@ -60,11 +58,11 @@ const NavigationButtonsComponent: React.FC = ({ if (!isModifiedEvent(event) && isLeftClickEvent(event)) { event.preventDefault(); navigateToApp(PLUGIN_ID, { - path: integrationPolicyId ? `/packs/${integrationPolicyId}/edit` : `/packs`, + path: `/packs`, }); } }, - [navigateToApp, integrationPolicyId] + [navigateToApp] ); return ( diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx index 752e95b70efac..4ac20e6144c08 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { get, isEmpty, unset, set } from 'lodash'; +import { pickBy, get, isEmpty, isString, unset, set, intersection } from 'lodash'; import satisfies from 'semver/functions/satisfies'; import { EuiFlexGroup, @@ -15,7 +15,7 @@ import { EuiLink, EuiAccordion, } from '@elastic/eui'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { produce } from 'immer'; import { i18n } from '@kbn/i18n'; import useDebounce from 'react-use/lib/useDebounce'; @@ -35,7 +35,105 @@ import { import { useKibana } from '../common/lib/kibana'; import { NavigationButtons } from './navigation_buttons'; import { DisabledCallout } from './disabled_callout'; -import { Form, useForm, Field, getUseField, FIELD_TYPES, fieldValidators } from '../shared_imports'; +import { ConfigUploader } from './config_uploader'; +import { + Form, + useForm, + useFormData, + Field, + getUseField, + FIELD_TYPES, + fieldValidators, + ValidationFunc, +} from '../shared_imports'; + +// https://github.com/elastic/beats/blob/master/x-pack/osquerybeat/internal/osqd/args.go#L57 +const RESTRICTED_CONFIG_OPTIONS = [ + 'force', + 'disable_watchdog', + 'utc', + 'events_expiry', + 'extensions_socket', + 'extensions_interval', + 'extensions_timeout', + 'pidfile', + 'database_path', + 'extensions_autoload', + 'flagfile', + 'config_plugin', + 'logger_plugin', + 'pack_delimiter', + 'config_refresh', +]; + +export const configProtectedKeysValidator = ( + ...args: Parameters +): ReturnType => { + const [{ value }] = args; + + let configJSON; + try { + configJSON = JSON.parse(value as string); + } catch (e) { + return; + } + + const restrictedFlags = intersection( + Object.keys(configJSON?.options ?? {}), + RESTRICTED_CONFIG_OPTIONS + ); + + if (restrictedFlags.length) { + return { + code: 'ERR_RESTRICTED_OPTIONS', + message: i18n.translate( + 'xpack.osquery.fleetIntegration.osqueryConfig.restrictedOptionsErrorMessage', + { + defaultMessage: + 'The following osquery options are not supported and must be removed: {restrictedFlags}.', + values: { + restrictedFlags: restrictedFlags.join(', '), + }, + } + ), + }; + } + + return; +}; + +export const packConfigFilesValidator = ( + ...args: Parameters +): ReturnType => { + const [{ value }] = args; + + let configJSON; + try { + configJSON = JSON.parse(value as string); + } catch (e) { + return; + } + + const packsWithConfigPaths = Object.keys(pickBy(configJSON?.packs ?? {}, isString)); + + if (packsWithConfigPaths.length) { + return { + code: 'ERR_RESTRICTED_OPTIONS', + message: i18n.translate( + 'xpack.osquery.fleetIntegration.osqueryConfig.packConfigFilesErrorMessage', + { + defaultMessage: + 'Pack configuration files are not supported. These packs must be removed: {packNames}.', + values: { + packNames: packsWithConfigPaths.join(', '), + }, + } + ), + }; + } + + return; +}; const CommonUseField = getUseField({ component: Field }); @@ -67,6 +165,16 @@ export const OsqueryManagedPolicyCreateImportExtension = React.memo< defaultValue: { config: JSON.stringify(get(newPolicy, 'inputs[0].config.osquery.value', {}), null, 2), }, + serializer: (formData) => { + let config; + try { + // @ts-expect-error update types + config = JSON.parse(formData.config); + } catch (e) { + config = {}; + } + return { config }; + }, schema: { config: { label: i18n.translate('xpack.osquery.fleetIntegration.osqueryConfig.configFieldLabel', { @@ -82,35 +190,63 @@ export const OsqueryManagedPolicyCreateImportExtension = React.memo< { allowEmptyString: true } ), }, + { validator: packConfigFilesValidator }, + { + validator: configProtectedKeysValidator, + }, ], }, }, }); - const { isValid, getFormData } = configForm; + const [{ config }] = useFormData({ form: configForm, watch: 'config' }); + const { isValid, setFieldValue } = configForm; const agentsLinkHref = useMemo(() => { if (!policy?.policy_id) return '#'; return getUrlForApp(PLUGIN_ID, { - path: - `#` + - pagePathGetters.policy_details({ policyId: policy?.policy_id })[1] + - '?openEnrollmentFlyout=true', + path: pagePathGetters.policy_details({ policyId: policy?.policy_id })[1], }); }, [getUrlForApp, policy?.policy_id]); + const handleConfigUpload = useCallback( + (newConfig) => { + let currentPacks = {}; + try { + currentPacks = JSON.parse(config)?.packs; + // eslint-disable-next-line no-empty + } catch (e) {} + + if (newConfig) { + setFieldValue( + 'config', + JSON.stringify( + { + ...newConfig, + ...(currentPacks || newConfig.packs + ? { packs: { ...newConfig.packs, ...currentPacks } } + : {}), + }, + null, + 2 + ) + ); + } + }, + [config, setFieldValue] + ); + useDebounce( () => { // if undefined it means that config was not modified if (isValid === undefined) return; - const configData = getFormData().config; const updatedPolicy = produce(newPolicy, (draft) => { - if (isEmpty(configData)) { + if (isEmpty(config)) { unset(draft, 'inputs[0].config'); } else { - set(draft, 'inputs[0].config.osquery.value', configData); + set(draft, 'inputs[0].config.osquery.value', config); } return draft; }); @@ -118,7 +254,7 @@ export const OsqueryManagedPolicyCreateImportExtension = React.memo< onChange({ isValid: !!isValid, updatedPolicy: isValid ? updatedPolicy : newPolicy }); }, 500, - [isValid] + [isValid, config] ); useEffect(() => { @@ -220,11 +356,7 @@ export const OsqueryManagedPolicyCreateImportExtension = React.memo< ) : null} - +
+
diff --git a/x-pack/plugins/osquery/public/live_queries/index.tsx b/x-pack/plugins/osquery/public/live_queries/index.tsx index 93459260a7333..81d3a6592a3c9 100644 --- a/x-pack/plugins/osquery/public/live_queries/index.tsx +++ b/x-pack/plugins/osquery/public/live_queries/index.tsx @@ -48,14 +48,19 @@ const LiveQueryComponent: React.FC = ({ const { data: hasActionResultsPrivileges, isFetched } = useActionResultsPrivileges(); const defaultValue = useMemo(() => { - if (agentId || agentPolicyIds || query) { + if (agentId || agentPolicyIds?.length || query?.length) { + const agentSelection = + agentId || agentPolicyIds?.length + ? { + allAgentsSelected: false, + agents: castArray(agentId ?? agentIds ?? []), + platformsSelected: [], + policiesSelected: agentPolicyIds ?? [], + } + : null; + return { - agentSelection: { - allAgentsSelected: false, - agents: castArray(agentId ?? agentIds ?? []), - platformsSelected: [], - policiesSelected: agentPolicyIds ?? [], - }, + ...(agentSelection ? { agentSelection } : {}), query, savedQueryId, ecs_mapping, diff --git a/x-pack/plugins/osquery/public/packs/packs_table.tsx b/x-pack/plugins/osquery/public/packs/packs_table.tsx index 75a006e9743f6..3d4efd88b789f 100644 --- a/x-pack/plugins/osquery/public/packs/packs_table.tsx +++ b/x-pack/plugins/osquery/public/packs/packs_table.tsx @@ -5,9 +5,17 @@ * 2.0. */ -import { EuiInMemoryTable, EuiBasicTableColumn, EuiLink, EuiToolTip } from '@elastic/eui'; +import { + EuiButtonEmpty, + EuiText, + EuiPopover, + EuiInMemoryTable, + EuiBasicTableColumn, + EuiLink, + EuiToolTip, +} from '@elastic/eui'; import moment from 'moment-timezone'; -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; @@ -15,6 +23,7 @@ import { PackagePolicy } from '../../../fleet/common'; import { useRouterNavigate } from '../common/lib/kibana'; import { usePacks } from './use_packs'; import { ActiveStateSwitch } from './active_state_switch'; +import { AgentsPolicyLink } from '../agent_policies/agents_policy_link'; const UpdatedBy = styled.span` white-space: nowrap; @@ -32,10 +41,53 @@ const renderName = (_: unknown, item: { id: string; attributes: { name: string } ); +export const AgentPoliciesPopover = ({ agentPolicyIds }: { agentPolicyIds: string[] }) => { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const onButtonClick = useCallback( + () => setIsPopoverOpen((currentIsPopoverOpen) => !currentIsPopoverOpen), + [] + ); + const closePopover = useCallback(() => setIsPopoverOpen(false), []); + + const button = useMemo( + () => ( + + <>{agentPolicyIds?.length ?? 0} + + ), + [agentPolicyIds?.length, onButtonClick] + ); + + if (!agentPolicyIds?.length) { + return <>{agentPolicyIds?.length ?? 0}; + } + + return ( + + + {agentPolicyIds?.map((policyId) => ( +
+ +
+ ))} +
+
+ ); +}; + const PacksTableComponent = () => { const { data } = usePacks({}); - const renderAgentPolicy = useCallback((policyIds) => <>{policyIds?.length ?? 0}, []); + const renderAgentPolicy = useCallback( + (agentPolicyIds) => , + [] + ); const renderQueries = useCallback( (queries) => <>{(queries && Object.keys(queries).length) ?? 0}, diff --git a/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx b/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx index 4d7776bdb2954..f6967f26cfbc2 100644 --- a/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx +++ b/x-pack/plugins/osquery/public/packs/queries/ecs_mapping_editor_field.tsx @@ -93,6 +93,7 @@ const StyledFieldSpan = styled.span` // align the icon to the inputs const StyledButtonWrapper = styled.div` margin-top: 11px; + width: 24px; `; const ECSFieldWrapper = styled(EuiFlexItem)` @@ -476,12 +477,19 @@ export const ECSMappingEditorForm = forwardRef { + if (onAdd && !deepEqual(formData, currentFormData.current)) { + currentFormData.current = formData; + handleSubmit(); + } + }, [handleSubmit, formData, onAdd]); + useEffect(() => { if (onChange && !deepEqual(formData, currentFormData.current)) { currentFormData.current = formData; onChange(formData); } - }, [defaultValue, formData, onChange]); + }, [defaultValue, formData, handleDeleteClick, onChange]); useEffect(() => { if (defaultValue) { @@ -497,18 +505,15 @@ export const ECSMappingEditorForm = forwardRef - +
@@ -517,16 +522,19 @@ export const ECSMappingEditorForm = forwardRef {!isDisabled && ( - {defaultValue ? ( + {defaultValue && ( - ) : ( - )} @@ -768,7 +764,7 @@ export const ECSMappingEditorField = ({ LIMIT 5; */ - if (selectItem.type === 'FunctionCall' && selectItem.hasAs) { + if (selectItem.hasAs && selectItem.alias) { return [ { label: selectItem.alias, @@ -873,16 +869,16 @@ export const ECSMappingEditorField = ({ diff --git a/x-pack/plugins/osquery/public/results/results_table.tsx b/x-pack/plugins/osquery/public/results/results_table.tsx index e0dfb208e0ebc..5b8143c874e2b 100644 --- a/x-pack/plugins/osquery/public/results/results_table.tsx +++ b/x-pack/plugins/osquery/public/results/results_table.tsx @@ -77,7 +77,7 @@ const ResultsTableComponent: React.FC = ({ const getFleetAppUrl = useCallback( (agentId) => getUrlForApp('fleet', { - path: `#` + pagePathGetters.agent_details({ agentId })[1], + path: pagePathGetters.agent_details({ agentId })[1], }), [getUrlForApp] ); diff --git a/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx index 02f5c8b6fb2a5..116430d026a79 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx @@ -6,7 +6,14 @@ */ import { get } from 'lodash'; -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiCodeBlock, EuiSpacer } from '@elastic/eui'; +import { + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiCodeBlock, + EuiSpacer, + EuiText, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; import { useParams } from 'react-router-dom'; @@ -16,7 +23,6 @@ import { WithHeaderLayout } from '../../../components/layouts'; import { useActionDetails } from '../../../actions/use_action_details'; import { ResultTabs } from '../../saved_queries/edit/tabs'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const LiveQueryDetailsPageComponent = () => { const { actionId } = useParams<{ actionId: string }>(); @@ -37,15 +43,14 @@ const LiveQueryDetailsPageComponent = () => {
- +

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx index 23bc44b455405..ccf9b655a96d7 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/list/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; @@ -13,7 +13,6 @@ import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; import { ActionsTable } from '../../../actions/actions_table'; import { WithHeaderLayout } from '../../../components/layouts'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const LiveQueriesPageComponent = () => { const permissions = useKibana().services.application.capabilities.osquery; @@ -24,15 +23,14 @@ const LiveQueriesPageComponent = () => { () => ( - +

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx index 28db39ac1805f..2d2f6bac55144 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useEffect, useMemo, useState } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; @@ -15,7 +15,6 @@ import { WithHeaderLayout } from '../../../components/layouts'; import { useRouterNavigate } from '../../../common/lib/kibana'; import { LiveQuery } from '../../../live_queries'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const NewLiveQueryPageComponent = () => { useBreadcrumbs('live_query_new'); @@ -49,15 +48,14 @@ const NewLiveQueryPageComponent = () => { - +

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/packs/add/index.tsx b/x-pack/plugins/osquery/public/routes/packs/add/index.tsx index b34550d07f811..bd9abd7ff2625 100644 --- a/x-pack/plugins/osquery/public/routes/packs/add/index.tsx +++ b/x-pack/plugins/osquery/public/routes/packs/add/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; @@ -13,7 +13,6 @@ import { WithHeaderLayout } from '../../../components/layouts'; import { useRouterNavigate } from '../../../common/lib/kibana'; import { PackForm } from '../../../packs/form'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const AddPackPageComponent = () => { useBreadcrumbs('pack_add'); @@ -31,12 +30,11 @@ const AddPackPageComponent = () => { - +

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/packs/details/index.tsx b/x-pack/plugins/osquery/public/routes/packs/details/index.tsx index 063cc75db2572..f81150468d018 100644 --- a/x-pack/plugins/osquery/public/routes/packs/details/index.tsx +++ b/x-pack/plugins/osquery/public/routes/packs/details/index.tsx @@ -26,8 +26,8 @@ import { WithHeaderLayout } from '../../../components/layouts'; import { usePack } from '../../../packs/use_pack'; import { PackQueriesStatusTable } from '../../../packs/pack_queries_status_table'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; import { useAgentPolicyAgentIds } from '../../../agents/use_agent_policy_agent_ids'; +import { AgentPoliciesPopover } from '../../../packs/packs_table'; const Divider = styled.div` width: 0; @@ -69,7 +69,7 @@ const PackDetailsPageComponent = () => { - +

{ }} />

- -
+
{data?.description && ( @@ -111,7 +110,7 @@ const PackDetailsPageComponent = () => { { // @ts-expect-error update types - data?.policy_ids?.length + } diff --git a/x-pack/plugins/osquery/public/routes/packs/edit/index.tsx b/x-pack/plugins/osquery/public/routes/packs/edit/index.tsx index bd1d7a5e0875c..a5935243d763e 100644 --- a/x-pack/plugins/osquery/public/routes/packs/edit/index.tsx +++ b/x-pack/plugins/osquery/public/routes/packs/edit/index.tsx @@ -12,6 +12,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingContent, + EuiText, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useMemo, useState } from 'react'; @@ -24,7 +25,6 @@ import { usePack } from '../../../packs/use_pack'; import { useDeletePack } from '../../../packs/use_delete_pack'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const EditPackPageComponent = () => { const { packId } = useParams<{ packId: string }>(); @@ -67,7 +67,7 @@ const EditPackPageComponent = () => { - +

{ }} />

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/packs/list/index.tsx b/x-pack/plugins/osquery/public/routes/packs/list/index.tsx index 12f646e230ff6..945677cade577 100644 --- a/x-pack/plugins/osquery/public/routes/packs/list/index.tsx +++ b/x-pack/plugins/osquery/public/routes/packs/list/index.tsx @@ -5,14 +5,13 @@ * 2.0. */ -import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; import { WithHeaderLayout } from '../../../components/layouts'; import { PacksTable } from '../../../packs/packs_table'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; const PacksPageComponent = () => { const permissions = useKibana().services.application.capabilities.osquery; @@ -22,12 +21,11 @@ const PacksPageComponent = () => { () => ( - +

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx index 71d0c886aac56..df9576c0070a8 100644 --- a/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx +++ b/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx @@ -11,6 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiConfirmModal, + EuiText, } from '@elastic/eui'; import { isEmpty } from 'lodash/fp'; import React, { useCallback, useMemo, useState } from 'react'; @@ -20,7 +21,6 @@ import { useParams } from 'react-router-dom'; import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; import { WithHeaderLayout } from '../../../components/layouts'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; import { EditSavedQueryForm } from './form'; import { useDeleteSavedQuery, useUpdateSavedQuery, useSavedQuery } from '../../../saved_queries'; @@ -65,7 +65,7 @@ const EditSavedQueryPageComponent = () => { - +

{viewMode ? ( { /> )}

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx index 9f6ec176faac2..f59a07763f0fa 100644 --- a/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx +++ b/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx @@ -12,6 +12,7 @@ import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, + EuiText, } from '@elastic/eui'; import React, { useCallback, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; @@ -23,7 +24,6 @@ import { ECSMapping } from '../../../../common/schemas/common'; import { WithHeaderLayout } from '../../../components/layouts'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; import { useKibana, useRouterNavigate } from '../../../common/lib/kibana'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; import { useSavedQueries } from '../../../saved_queries/use_saved_queries'; type SavedQuerySO = SavedObject<{ @@ -218,15 +218,14 @@ const SavedQueriesPageComponent = () => { () => ( - +

- -
+
), diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx index 3dc42aabe7a94..2a09a4c4ee556 100644 --- a/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx +++ b/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx @@ -5,14 +5,13 @@ * 2.0. */ -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { useRouterNavigate } from '../../../common/lib/kibana'; import { WithHeaderLayout } from '../../../components/layouts'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; -import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; import { NewSavedQueryForm } from './form'; import { useCreateSavedQuery } from '../../../saved_queries/use_create_saved_query'; @@ -34,15 +33,14 @@ const NewSavedQueryPageComponent = () => { - +

- -
+
), diff --git a/x-pack/plugins/osquery/public/saved_queries/form/index.tsx b/x-pack/plugins/osquery/public/saved_queries/form/index.tsx index 1d3677e96298e..314c5e07b0b2a 100644 --- a/x-pack/plugins/osquery/public/saved_queries/form/index.tsx +++ b/x-pack/plugins/osquery/public/saved_queries/form/index.tsx @@ -156,7 +156,12 @@ const SavedQueryFormComponent = forwardRef - {playgroundVisible && } + {playgroundVisible && ( + + )} ); } diff --git a/x-pack/plugins/osquery/scripts/schema_formatter/osquery_formatter.ts b/x-pack/plugins/osquery/scripts/schema_formatter/osquery_formatter.ts index 53d48f45ea92b..157f4ab0a5936 100644 --- a/x-pack/plugins/osquery/scripts/schema_formatter/osquery_formatter.ts +++ b/x-pack/plugins/osquery/scripts/schema_formatter/osquery_formatter.ts @@ -5,13 +5,14 @@ * 2.0. */ -import { map, partialRight, pick } from 'lodash'; +import { find, map, partialRight, pick } from 'lodash'; import { promises as fs } from 'fs'; import path from 'path'; import { run } from '@kbn/dev-utils'; const OSQUERY_COLUMN_SCHEMA_FIELDS = ['name', 'description', 'platforms', 'columns']; +const ELASTIC_OSQUERY_HOSTFS_TABLES = ['users', 'groups', 'processes']; run( async ({ flags }) => { @@ -20,9 +21,14 @@ run( const schemaData = await require(schemaFile); const formattedSchema = map(schemaData, partialRight(pick, OSQUERY_COLUMN_SCHEMA_FIELDS)); + const elasticTables = map(ELASTIC_OSQUERY_HOSTFS_TABLES, (tableName) => ({ + ...find(formattedSchema, { name: tableName }), + name: `host_${tableName}`, + })); + formattedSchema.push(...elasticTables); await fs.writeFile( - path.join(schemaPath, `v${flags.schema_version}-formatted.json`), + path.join(schemaPath, `${flags.schema_version}`), JSON.stringify(formattedSchema) ); }, diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts index d45cb26e0d199..f129e95fd9508 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts @@ -22,10 +22,15 @@ export const getAgentsRoute = (router: IRouter, osqueryContext: OsqueryAppContex async (context, request, response) => { const esClient = context.core.elasticsearch.client.asInternalUser; - const agents = await osqueryContext.service - .getAgentService() - // @ts-expect-error update types - ?.listAgents(esClient, request.query); + let agents; + try { + agents = await osqueryContext.service + .getAgentService() + // @ts-expect-error update types + ?.listAgents(esClient, request.query); + } catch (error) { + return response.badRequest({ body: error }); + } return response.ok({ body: agents }); } diff --git a/x-pack/plugins/osquery/server/routes/status/create_status_route.ts b/x-pack/plugins/osquery/server/routes/status/create_status_route.ts index aa4e3cb36b4c9..630ec8b3743c8 100644 --- a/x-pack/plugins/osquery/server/routes/status/create_status_route.ts +++ b/x-pack/plugins/osquery/server/routes/status/create_status_route.ts @@ -17,6 +17,7 @@ import { PLUGIN_ID, OSQUERY_INTEGRATION_NAME } from '../../../common'; import { IRouter } from '../../../../../../src/core/server'; import { OsqueryAppContext } from '../../lib/osquery_app_context_services'; import { convertPackQueriesToSO } from '../pack/utils'; +import { getInternalSavedObjectsClient } from '../../usage/collector'; export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppContext) => { router.get( @@ -27,18 +28,21 @@ export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppCon }, async (context, request, response) => { const esClient = context.core.elasticsearch.client.asInternalUser; - const soClient = context.core.savedObjects.client; + const internalSavedObjectsClient = await getInternalSavedObjectsClient( + osqueryContext.getStartServices + ); const packageService = osqueryContext.service.getPackageService(); const packagePolicyService = osqueryContext.service.getPackagePolicyService(); const agentPolicyService = osqueryContext.service.getAgentPolicyService(); - const packageInfo = await osqueryContext.service - .getPackageService() - ?.getInstallation({ savedObjectsClient: soClient, pkgName: OSQUERY_INTEGRATION_NAME }); + const packageInfo = await osqueryContext.service.getPackageService()?.getInstallation({ + savedObjectsClient: internalSavedObjectsClient, + pkgName: OSQUERY_INTEGRATION_NAME, + }); if (packageInfo?.install_version && satisfies(packageInfo?.install_version, '<0.6.0')) { try { - const policyPackages = await packagePolicyService?.list(soClient, { + const policyPackages = await packagePolicyService?.list(internalSavedObjectsClient, { kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${OSQUERY_INTEGRATION_NAME}`, perPage: 10000, page: 1, @@ -99,7 +103,7 @@ export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppCon await packageService?.ensureInstalledPackage({ esClient, - savedObjectsClient: soClient, + savedObjectsClient: internalSavedObjectsClient, pkgName: OSQUERY_INTEGRATION_NAME, }); @@ -110,12 +114,15 @@ export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppCon // @ts-expect-error update types pack.policy_ids.includes(key) ); - await packagePolicyService?.upgrade(soClient, esClient, [value]); - const packagePolicy = await packagePolicyService?.get(soClient, value); + await packagePolicyService?.upgrade(internalSavedObjectsClient, esClient, [value]); + const packagePolicy = await packagePolicyService?.get( + internalSavedObjectsClient, + value + ); if (packagePolicy) { return packagePolicyService?.update( - soClient, + internalSavedObjectsClient, esClient, packagePolicy.id, produce(packagePolicy, (draft) => { @@ -147,13 +154,13 @@ export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppCon const agentPolicyIds = uniq(map(policyPackages?.items, 'policy_id')); const agentPolicies = mapKeys( - await agentPolicyService?.getByIds(soClient, agentPolicyIds), + await agentPolicyService?.getByIds(internalSavedObjectsClient, agentPolicyIds), 'id' ); await Promise.all( map(migrationObject.packs, async (packObject) => { - await soClient.create( + await internalSavedObjectsClient.create( packSavedObjectType, { // @ts-expect-error update types @@ -183,7 +190,7 @@ export const createStatusRoute = (router: IRouter, osqueryContext: OsqueryAppCon ); await packagePolicyService?.delete( - soClient, + internalSavedObjectsClient, esClient, migrationObject.packagePoliciesToDelete ); diff --git a/x-pack/plugins/painless_lab/public/application/components/output_pane/context_tab.tsx b/x-pack/plugins/painless_lab/public/application/components/output_pane/context_tab.tsx index a8ee5bc90c72e..386565008b8ec 100644 --- a/x-pack/plugins/painless_lab/public/application/components/output_pane/context_tab.tsx +++ b/x-pack/plugins/painless_lab/public/application/components/output_pane/context_tab.tsx @@ -9,7 +9,6 @@ import React, { FunctionComponent } from 'react'; import { EuiFieldText, EuiFormRow, - EuiPanel, EuiSpacer, EuiIcon, EuiToolTip, @@ -140,24 +139,22 @@ export const ContextTab: FunctionComponent = () => { } fullWidth > - - updatePayload({ query: nextQuery })} - options={{ - fontSize: 12, - minimap: { - enabled: false, - }, - scrollBeyondLastLine: false, - wordWrap: 'on', - wrappingIndent: 'indent', - automaticLayout: true, - }} - /> - + updatePayload({ query: nextQuery })} + options={{ + fontSize: 12, + minimap: { + enabled: false, + }, + scrollBeyondLastLine: false, + wordWrap: 'on', + wrappingIndent: 'indent', + automaticLayout: true, + }} + /> )} {['filter', 'score'].indexOf(context) !== -1 && ( @@ -179,24 +176,22 @@ export const ContextTab: FunctionComponent = () => { } fullWidth > - - updatePayload({ document: nextDocument })} - options={{ - fontSize: 12, - minimap: { - enabled: false, - }, - scrollBeyondLastLine: false, - wordWrap: 'on', - wrappingIndent: 'indent', - automaticLayout: true, - }} - /> - + updatePayload({ document: nextDocument })} + options={{ + fontSize: 12, + minimap: { + enabled: false, + }, + scrollBeyondLastLine: false, + wordWrap: 'on', + wrappingIndent: 'indent', + automaticLayout: true, + }} + /> )} diff --git a/x-pack/plugins/painless_lab/public/application/components/output_pane/output_pane.tsx b/x-pack/plugins/painless_lab/public/application/components/output_pane/output_pane.tsx index e7a0bc560dac9..258c6bcdb1beb 100644 --- a/x-pack/plugins/painless_lab/public/application/components/output_pane/output_pane.tsx +++ b/x-pack/plugins/painless_lab/public/application/components/output_pane/output_pane.tsx @@ -11,7 +11,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, - EuiPanel, EuiTabbedContent, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -48,7 +47,7 @@ export const OutputPane: FunctionComponent = ({ isLoading, response }) => ); return ( - +
= ({ isLoading, response }) => }, ]} /> - +
); }; diff --git a/x-pack/plugins/painless_lab/public/application/components/output_pane/parameters_tab.tsx b/x-pack/plugins/painless_lab/public/application/components/output_pane/parameters_tab.tsx index b749e3aa9b63d..370d542665977 100644 --- a/x-pack/plugins/painless_lab/public/application/components/output_pane/parameters_tab.tsx +++ b/x-pack/plugins/painless_lab/public/application/components/output_pane/parameters_tab.tsx @@ -6,15 +6,7 @@ */ import React, { FunctionComponent } from 'react'; -import { - EuiFormRow, - EuiPanel, - EuiSpacer, - EuiIcon, - EuiToolTip, - EuiLink, - EuiText, -} from '@elastic/eui'; +import { EuiFormRow, EuiSpacer, EuiIcon, EuiToolTip, EuiLink, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { monaco } from '@kbn/monaco'; import { i18n } from '@kbn/i18n'; @@ -58,31 +50,29 @@ export const ParametersTab: FunctionComponent = () => { } > - - updatePayload({ parameters: nextParams })} - options={{ - fontSize: 12, - minimap: { - enabled: false, - }, - scrollBeyondLastLine: false, - wordWrap: 'on', - wrappingIndent: 'indent', - automaticLayout: true, - }} - editorDidMount={(editor: monaco.editor.IStandaloneCodeEditor) => { - // Updating tab size for the editor - const model = editor.getModel(); - if (model) { - model.updateOptions({ tabSize: 2 }); - } - }} - /> - + updatePayload({ parameters: nextParams })} + options={{ + fontSize: 12, + minimap: { + enabled: false, + }, + scrollBeyondLastLine: false, + wordWrap: 'on', + wrappingIndent: 'indent', + automaticLayout: true, + }} + editorDidMount={(editor: monaco.editor.IStandaloneCodeEditor) => { + // Updating tab size for the editor + const model = editor.getModel(); + if (model) { + model.updateOptions({ tabSize: 2 }); + } + }} + /> ); diff --git a/x-pack/plugins/painless_lab/public/styles/_index.scss b/x-pack/plugins/painless_lab/public/styles/_index.scss index 00197e744e95c..78182787a63b6 100644 --- a/x-pack/plugins/painless_lab/public/styles/_index.scss +++ b/x-pack/plugins/painless_lab/public/styles/_index.scss @@ -17,11 +17,9 @@ $bottomBarHeight: $euiSize * 3; } .painlessLabRightPane { - border-right: none; - border-top: none; - border-bottom: none; - border-radius: 0; - padding-top: 0; + background-color: $euiColorEmptyShade; + padding: $euiSizeS; + border-left: $euiBorderThin; height: 100%; } diff --git a/x-pack/plugins/reporting/public/share_context_menu/__snapshots__/screen_capture_panel_content.test.tsx.snap b/x-pack/plugins/reporting/public/share_context_menu/__snapshots__/screen_capture_panel_content.test.tsx.snap index e655e9c3d7f06..c5d87410f596f 100644 --- a/x-pack/plugins/reporting/public/share_context_menu/__snapshots__/screen_capture_panel_content.test.tsx.snap +++ b/x-pack/plugins/reporting/public/share_context_menu/__snapshots__/screen_capture_panel_content.test.tsx.snap @@ -346,88 +346,88 @@ exports[`ScreenCapturePanelContent properly renders a view with "canvas" layout className="euiSpacer euiSpacer--s" /> - - + - - + + + Unsaved work + +
+ - - - - - - - +

+ + + Save your work before copying this URL. + + +

+
+ + +
+ +
+ +
+ +
+ +
@@ -784,88 +784,88 @@ exports[`ScreenCapturePanelContent properly renders a view with "print" layout o className="euiSpacer euiSpacer--s" /> - - + - - + + + Unsaved work + +

+ - - - -
- - - +

+ + + Save your work before copying this URL. + + +

+
+ + +
+ +
+ +
+ +
+ + @@ -1094,88 +1094,88 @@ exports[`ScreenCapturePanelContent renders the default view properly 1`] = ` className="euiSpacer euiSpacer--s" /> - - + - - - - - - - +

+ + + Save your work before copying this URL. + + +

+ + + +
+ +
+ + + + + + diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/error_unsaved_work_panel.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/error_unsaved_work_panel.tsx new file mode 100644 index 0000000000000..348c6d42cddb8 --- /dev/null +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/error_unsaved_work_panel.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { i18n } from '@kbn/i18n'; +import type { FunctionComponent } from 'react'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiCallOut, EuiText, EuiSpacer } from '@elastic/eui'; + +const i18nTexts = { + title: i18n.translate('xpack.reporting.panelContent.unsavedStateErrorTitle', { + defaultMessage: 'Unsaved work', + }), +}; + +export const ErrorUnsavedWorkPanel: FunctionComponent = () => { + return ( + + +

+ +

+
+ +
+ ); +}; diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/error_url_too_long_panel.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/error_url_too_long_panel.tsx new file mode 100644 index 0000000000000..9c925fe03fee2 --- /dev/null +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/error_url_too_long_panel.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FunctionComponent } from 'react'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiCallOut, EuiText } from '@elastic/eui'; + +interface Props { + isUnsaved?: boolean; +} + +const i18nTexts = { + title: i18n.translate('xpack.reporting.panelContent.unsavedStateAndExceedsMaxLengthTitle', { + defaultMessage: 'URL too long', + }), +}; + +export const ErrorUrlTooLongPanel: FunctionComponent = ({ isUnsaved }) => ( + + +

+ {isUnsaved ? ( + + + + ) : ( + // Reaching this state is essentially just an error and should result in a user contacting us. + + + + )} +

+
+
+); diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/index.ts b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/index.ts new file mode 100644 index 0000000000000..b7da9d6d12573 --- /dev/null +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/components/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { ErrorUnsavedWorkPanel } from './error_unsaved_work_panel'; +export { ErrorUrlTooLongPanel } from './error_url_too_long_panel'; diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/constants.ts b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/constants.ts new file mode 100644 index 0000000000000..fe7faf48d6106 --- /dev/null +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/constants.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Based on {@link URL_MAX_LENGTH} exported from core/public. + */ +const CHROMIUM_MAX_URL_LENGTH = 25 * 1000; + +export const getMaxUrlLength = () => CHROMIUM_MAX_URL_LENGTH; diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/index.ts b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/index.ts new file mode 100644 index 0000000000000..843a0b6747e4c --- /dev/null +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { ReportingPanelContent, Props, ReportingPanelProps } from './reporting_panel_content'; diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.test.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.test.tsx similarity index 67% rename from x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.test.tsx rename to x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.test.tsx index 6ad894bf3ac2f..e9dd584e51f82 100644 --- a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.test.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.test.tsx @@ -12,8 +12,14 @@ import { notificationServiceMock, uiSettingsServiceMock, } from 'src/core/public/mocks'; -import { ReportingAPIClient } from '../lib/reporting_api_client'; -import { ReportingPanelContent, ReportingPanelProps as Props } from './reporting_panel_content'; +import { ReportingAPIClient } from '../../lib/reporting_api_client'; +import { ReportingPanelContent, ReportingPanelProps as Props } from '.'; +import { ErrorUnsavedWorkPanel } from './components'; + +jest.mock('./constants', () => ({ + getMaxUrlLength: jest.fn(() => 9999999), +})); +import * as constants from './constants'; describe('ReportingPanelContent', () => { const props: Partial = { @@ -83,7 +89,7 @@ describe('ReportingPanelContent', () => { }); it('changing the layout triggers refreshing the state with the latest job params', () => { - const wrapper = mountComponent({ requiresSavedState: false }); + const wrapper = mountComponent({ requiresSavedState: false, isDirty: false }); wrapper.update(); expect(wrapper.find('EuiCopy').prop('textToCopy')).toMatchInlineSnapshot( `"http://localhost/api/reporting/generate/test?jobParams=%28appState%3Avery_cool_app_state_X%2CbrowserTimezone%3AMars%2CobjectType%3Anoice_object%2Ctitle%3Aultimate_title%2Cversion%3A%277.15.0-test%27%29"` @@ -97,4 +103,35 @@ describe('ReportingPanelContent', () => { ); }); }); + + describe('copy post URL', () => { + it('shows the copy button without warnings', () => { + const wrapper = mountComponent({ requiresSavedState: false, isDirty: false }); + wrapper.update(); + expect(wrapper.exists('EuiCopy')).toBe(true); + expect(wrapper.exists(ErrorUnsavedWorkPanel)).toBe(false); + }); + + it('does not show the copy button when there is unsaved state', () => { + const wrapper = mountComponent({ requiresSavedState: false, isDirty: true }); + wrapper.update(); + expect(wrapper.exists('EuiCopy')).toBe(false); + expect(wrapper.exists(ErrorUnsavedWorkPanel)).toBe(true); + }); + + it('does not show the copy button when the URL is too long', () => { + (constants.getMaxUrlLength as jest.Mock).mockReturnValue(1); + const wrapper = mountComponent({ requiresSavedState: false, isDirty: true }); + wrapper.update(); + + expect(wrapper.exists('EuiCopy')).toBe(false); + expect(wrapper.exists('[data-test-subj="urlTooLongTrySavingMessage"]')).toBe(true); + expect(wrapper.exists('[data-test-subj="urlTooLongErrorMessage"]')).toBe(false); + + wrapper.setProps({ isDirty: false }); + expect(wrapper.exists('EuiCopy')).toBe(false); + expect(wrapper.exists('[data-test-subj="urlTooLongTrySavingMessage"]')).toBe(false); + expect(wrapper.exists('[data-test-subj="urlTooLongErrorMessage"]')).toBe(true); + }); + }); }); diff --git a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.tsx similarity index 84% rename from x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.tsx rename to x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.tsx index 6ed6f2d0c5f49..4e05dc5637bfb 100644 --- a/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content/reporting_panel_content.tsx @@ -20,16 +20,18 @@ import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import React, { Component, ReactElement } from 'react'; import { IUiSettingsClient, ToastsSetup } from 'src/core/public'; import url from 'url'; -import { toMountPoint } from '../../../../../src/plugins/kibana_react/public'; +import { toMountPoint } from '../../../../../../src/plugins/kibana_react/public'; import { CSV_REPORT_TYPE, PDF_REPORT_TYPE, PDF_REPORT_TYPE_V2, PNG_REPORT_TYPE, PNG_REPORT_TYPE_V2, -} from '../../common/constants'; -import { BaseParams } from '../../common/types'; -import { ReportingAPIClient } from '../lib/reporting_api_client'; +} from '../../../common/constants'; +import { BaseParams } from '../../../common/types'; +import { ReportingAPIClient } from '../../lib/reporting_api_client'; +import { ErrorUnsavedWorkPanel, ErrorUrlTooLongPanel } from './components'; +import { getMaxUrlLength } from './constants'; export interface ReportingPanelProps { apiClient: ReportingAPIClient; @@ -108,11 +110,39 @@ class ReportingPanelContentUi extends Component { return this.props.objectId === undefined || this.props.objectId === ''; }; + private renderCopyURLButton({ + isUnsaved, + exceedsMaxLength, + }: { + isUnsaved: boolean; + exceedsMaxLength: boolean; + }) { + if (isUnsaved) { + if (exceedsMaxLength) { + return ; + } + return ; + } else if (exceedsMaxLength) { + return ; + } + return ( + + {(copy) => ( + + + + )} + + ); + } + public render() { - if ( - this.props.requiresSavedState && - (this.isNotSaved() || this.props.isDirty || this.state.isStale) - ) { + const isUnsaved: boolean = this.isNotSaved() || this.props.isDirty || this.state.isStale; + + if (this.props.requiresSavedState && isUnsaved) { return ( { ); } + const exceedsMaxLength = this.state.absoluteUrl.length >= getMaxUrlLength(); + return ( @@ -172,17 +204,7 @@ class ReportingPanelContentUi extends Component {

- - - {(copy) => ( - - - - )} - + {this.renderCopyURLButton({ isUnsaved, exceedsMaxLength })}
); diff --git a/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.test.tsx b/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.test.tsx index b64052228eb41..f37aaea114cfa 100644 --- a/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.test.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.test.tsx @@ -85,8 +85,10 @@ test('ScreenCapturePanelContent decorated job params are visible in the POST URL const component = mount( ; -} - type BrowserConfig = CaptureConfig['browser']['chromium']; export class HeadlessChromiumDriverFactory { diff --git a/x-pack/plugins/reporting/server/browsers/chromium/paths.ts b/x-pack/plugins/reporting/server/browsers/chromium/paths.ts index ed06bba527c43..033ddce8d9ebd 100644 --- a/x-pack/plugins/reporting/server/browsers/chromium/paths.ts +++ b/x-pack/plugins/reporting/server/browsers/chromium/paths.ts @@ -14,6 +14,7 @@ interface PackageInfo { archiveChecksum: string; binaryChecksum: string; binaryRelativePath: string; + revision: number; } enum BaseUrl { @@ -32,8 +33,6 @@ interface CommonPackageInfo extends PackageInfo { } export class ChromiumArchivePaths { - public readonly revision = '856583'; - public readonly packages: Array = [ { platform: 'darwin', @@ -43,34 +42,38 @@ export class ChromiumArchivePaths { binaryChecksum: 'dfcd6e007214175997663c50c8d871ea', binaryRelativePath: 'headless_shell-darwin_x64/headless_shell', location: 'custom', + revision: 856583, }, { platform: 'linux', architecture: 'x64', - archiveFilename: 'chromium-d163fd7-linux_x64.zip', - archiveChecksum: 'fba0a240d409228a3494aef415c300fc', - binaryChecksum: '99cfab472d516038b94ef86649e52871', + archiveFilename: 'chromium-70f5d88-linux_x64.zip', + archiveChecksum: '7b1c9c2fb613444fbdf004a3b75a58df', + binaryChecksum: '82e80f9727a88ba3836ce230134bd126', binaryRelativePath: 'headless_shell-linux_x64/headless_shell', location: 'custom', + revision: 901912, }, { platform: 'linux', architecture: 'arm64', - archiveFilename: 'chromium-d163fd7-linux_arm64.zip', - archiveChecksum: '29834735bc2f0e0d9134c33bc0580fb6', - binaryChecksum: '13baccf2e5c8385cb9d9588db6a9e2c2', + archiveFilename: 'chromium-70f5d88-linux_arm64.zip', + archiveChecksum: '4a0217cfe7da86ad1e3d0e9e5895ddb5', + binaryChecksum: '29e943fbee6d87a217abd6cb6747058e', binaryRelativePath: 'headless_shell-linux_arm64/headless_shell', location: 'custom', + revision: 901912, }, { platform: 'win32', architecture: 'x64', archiveFilename: 'chrome-win.zip', - archiveChecksum: '64999a384bfb6c96c50c4cb6810dbc05', - binaryChecksum: '13b8bbb4a12f9036b8cc3b57b3a71fec', + archiveChecksum: '861bb8b7b8406a6934a87d3cbbce61d9', + binaryChecksum: 'ffa0949471e1b9a57bc8f8633fca9c7b', binaryRelativePath: 'chrome-win\\chrome.exe', location: 'common', archivePath: 'Win', + revision: 901912, }, ]; @@ -82,7 +85,8 @@ export class ChromiumArchivePaths { } public resolvePath(p: PackageInfo) { - return path.resolve(this.archivesPath, p.archiveFilename); + // adding architecture to the path allows it to download two binaries that have the same name, but are different architecture + return path.resolve(this.archivesPath, p.architecture, p.archiveFilename); } public getAllArchiveFilenames(): string[] { @@ -91,9 +95,9 @@ export class ChromiumArchivePaths { public getDownloadUrl(p: CustomPackageInfo | CommonPackageInfo) { if (p.location === 'common') { - return `${BaseUrl.common}/${p.archivePath}/${this.revision}/${p.archiveFilename}`; + return `${BaseUrl.common}/${p.archivePath}/${p.revision}/${p.archiveFilename}`; } - return BaseUrl.custom + '/' + p.archiveFilename; + return BaseUrl.custom + '/' + p.archiveFilename; // revision is not used for URL if package is a custom build } public getBinaryPath(p: PackageInfo) { diff --git a/x-pack/plugins/reporting/server/browsers/download/download.ts b/x-pack/plugins/reporting/server/browsers/download/download.ts index 77efc75ae1aaa..528395fe1afb2 100644 --- a/x-pack/plugins/reporting/server/browsers/download/download.ts +++ b/x-pack/plugins/reporting/server/browsers/download/download.ts @@ -49,6 +49,8 @@ export async function download( resolve(); }); }); + } catch (err) { + throw new Error(`Unable to download ${url}: ${err}`); } finally { closeSync(handle); } diff --git a/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.test.ts b/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.test.ts index 344735d6180b6..955e8214af8fa 100644 --- a/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.test.ts +++ b/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import path from 'path'; import mockFs from 'mock-fs'; import { existsSync, readdirSync } from 'fs'; import { chromium } from '../chromium'; @@ -27,16 +28,16 @@ describe('ensureBrowserDownloaded', () => { } as unknown as typeof logger; (md5 as jest.MockedFunction).mockImplementation( - async (path) => + async (packagePath) => chromium.paths.packages.find( - (packageInfo) => chromium.paths.resolvePath(packageInfo) === path + (packageInfo) => chromium.paths.resolvePath(packageInfo) === packagePath )?.archiveChecksum ?? 'some-md5' ); (download as jest.MockedFunction).mockImplementation( - async (_url, path) => + async (_url, packagePath) => chromium.paths.packages.find( - (packageInfo) => chromium.paths.resolvePath(packageInfo) === path + (packageInfo) => chromium.paths.resolvePath(packageInfo) === packagePath )?.archiveChecksum ?? 'some-md5' ); @@ -93,11 +94,19 @@ describe('ensureBrowserDownloaded', () => { await ensureBrowserDownloaded(logger); expect(download).not.toHaveBeenCalled(); - expect(readdirSync(chromium.paths.archivesPath)).toEqual( - expect.arrayContaining( - chromium.paths.packages.map(({ archiveFilename }) => archiveFilename) - ) - ); + const paths = [ + readdirSync(path.resolve(chromium.paths.archivesPath + '/x64')), + readdirSync(path.resolve(chromium.paths.archivesPath + '/arm64')), + ]; + + expect(paths).toEqual([ + expect.arrayContaining([ + 'chrome-win.zip', + 'chromium-70f5d88-linux_x64.zip', + 'chromium-d163fd7-darwin_x64.zip', + ]), + expect.arrayContaining(['chromium-70f5d88-linux_arm64.zip']), + ]); }); it('should download again if md5 hash different', async () => { diff --git a/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.ts b/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.ts index 55d6395b1bd3d..2766b404f1dd1 100644 --- a/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.ts +++ b/x-pack/plugins/reporting/server/browsers/download/ensure_downloaded.ts @@ -15,7 +15,6 @@ import { download } from './download'; /** * Check for the downloaded archive of each requested browser type and * download them if they are missing or their checksum is invalid - * @return {Promise} */ export async function ensureBrowserDownloaded(logger: GenericLevelLogger) { await ensureDownloaded([chromium], logger); @@ -25,18 +24,19 @@ export async function ensureBrowserDownloaded(logger: GenericLevelLogger) { * Clears the unexpected files in the browsers archivesPath * and ensures that all packages/archives are downloaded and * that their checksums match the declared value - * @param {BrowserSpec} browsers - * @return {Promise} */ async function ensureDownloaded(browsers: BrowserDownload[], logger: GenericLevelLogger) { await Promise.all( browsers.map(async ({ paths: pSet }) => { - ( - await del(`${pSet.archivesPath}/**/*`, { - force: true, - ignore: pSet.getAllArchiveFilenames(), - }) - ).forEach((path) => logger.warning(`Deleting unexpected file ${path}`)); + const removedFiles = await del(`${pSet.archivesPath}/**/*`, { + force: true, + onlyFiles: true, + ignore: pSet.getAllArchiveFilenames(), + }); + + removedFiles.forEach((path) => { + logger.warning(`Deleting unexpected file ${path}`); + }); const invalidChecksums: string[] = []; await Promise.all( @@ -44,22 +44,44 @@ async function ensureDownloaded(browsers: BrowserDownload[], logger: GenericLeve const { archiveFilename, archiveChecksum } = p; if (archiveFilename && archiveChecksum) { const path = pSet.resolvePath(p); + const pathExists = existsSync(path); + + let foundChecksum: string; + try { + foundChecksum = await md5(path).catch(); + } catch { + foundChecksum = 'MISSING'; + } - if (existsSync(path) && (await md5(path)) === archiveChecksum) { - logger.debug(`Browser archive exists in ${path}`); + if (pathExists && foundChecksum === archiveChecksum) { + logger.debug(`Browser archive for ${p.platform}/${p.architecture} found in ${path} `); return; } + if (!pathExists) { + logger.warning( + `Browser archive for ${p.platform}/${p.architecture} not found in ${path}.` + ); + } + if (foundChecksum !== archiveChecksum) { + logger.warning( + `Browser archive checksum for ${p.platform}/${p.architecture} ` + + `is ${foundChecksum} but ${archiveChecksum} was expected.` + ); + } + const url = pSet.getDownloadUrl(p); try { const downloadedChecksum = await download(url, path, logger); if (downloadedChecksum !== archiveChecksum) { + logger.warning( + `Invalid checksum for ${p.platform}/${p.architecture}: ` + + `expected ${archiveChecksum} got ${downloadedChecksum}` + ); invalidChecksums.push(`${url} => ${path}`); } } catch (err) { - const message = new Error(`Failed to download ${url}`); - logger.error(err); - throw message; + throw new Error(`Failed to download ${url}: ${err}`); } } }) diff --git a/x-pack/plugins/reporting/server/browsers/index.ts b/x-pack/plugins/reporting/server/browsers/index.ts index c47514960bb09..be5c85a6e9581 100644 --- a/x-pack/plugins/reporting/server/browsers/index.ts +++ b/x-pack/plugins/reporting/server/browsers/index.ts @@ -28,7 +28,8 @@ export interface BrowserDownload { } export const initializeBrowserDriverFactory = async (core: ReportingCore, logger: LevelLogger) => { - const { binaryPath$ } = installBrowser(logger); + const chromiumLogger = logger.clone(['chromium']); + const { binaryPath$ } = installBrowser(chromiumLogger); const binaryPath = await binaryPath$.pipe(first()).toPromise(); - return chromium.createDriverFactory(core, binaryPath, logger); + return chromium.createDriverFactory(core, binaryPath, chromiumLogger); }; diff --git a/x-pack/plugins/reporting/server/browsers/install.ts b/x-pack/plugins/reporting/server/browsers/install.ts index 51045c4ef038f..0441bbcfb5306 100644 --- a/x-pack/plugins/reporting/server/browsers/install.ts +++ b/x-pack/plugins/reporting/server/browsers/install.ts @@ -39,15 +39,28 @@ export function installBrowser( const binaryChecksum = await md5(binaryPath).catch(() => ''); if (binaryChecksum !== pkg.binaryChecksum) { - await ensureBrowserDownloaded(logger); - await del(chromiumPath); + logger.warning( + `Found browser binary checksum for ${pkg.platform}/${pkg.architecture} ` + + `is ${binaryChecksum} but ${pkg.binaryChecksum} was expected. Re-installing...` + ); + try { + await del(chromiumPath); + } catch (err) { + logger.error(err); + } - const archive = path.join(paths.archivesPath, pkg.archiveFilename); - logger.info(`Extracting [${archive}] to [${chromiumPath}]`); - await extract(archive, chromiumPath); + try { + await ensureBrowserDownloaded(logger); + const archive = path.join(paths.archivesPath, pkg.architecture, pkg.archiveFilename); + logger.info(`Extracting [${archive}] to [${chromiumPath}]`); + await extract(archive, chromiumPath); + } catch (err) { + logger.error(err); + } } logger.info(`Browser executable: ${binaryPath}`); + binaryPath$.next(binaryPath); // subscribers wait for download and extract to complete }; diff --git a/x-pack/plugins/reporting/server/config/index.test.ts b/x-pack/plugins/reporting/server/config/index.test.ts index 1a75f6dfec3bd..f77713551592b 100644 --- a/x-pack/plugins/reporting/server/config/index.test.ts +++ b/x-pack/plugins/reporting/server/config/index.test.ts @@ -49,7 +49,7 @@ describe('deprecations', () => { const { messages } = applyReportingDeprecations({ roles: { enabled: true } }); expect(messages).toMatchInlineSnapshot(` Array [ - "Use Kibana application privileges to grant reporting privileges. Using \\"xpack.reporting.roles.allow\\" to grant reporting privileges prevents users from using API Keys to create reports. The \\"xpack.reporting.roles.enabled\\" setting will default to false in a future release.", + "Use Kibana application privileges to grant reporting privileges. Using \\"xpack.reporting.roles.allow\\" to grant reporting privileges is deprecated. The \\"xpack.reporting.roles.enabled\\" setting will default to false in a future release.", ] `); }); diff --git a/x-pack/plugins/reporting/server/config/index.ts b/x-pack/plugins/reporting/server/config/index.ts index 1eeafb4e0c513..244a4577813da 100644 --- a/x-pack/plugins/reporting/server/config/index.ts +++ b/x-pack/plugins/reporting/server/config/index.ts @@ -64,7 +64,7 @@ export const config: PluginConfigDescriptor = { defaultMessage: `Use Kibana application privileges to grant reporting privileges.` + ` Using "{fromPath}.roles.allow" to grant reporting privileges` + - ` prevents users from using API Keys to create reports.` + + ` is deprecated.` + ` The "{fromPath}.roles.enabled" setting will default to false` + ` in a future release.`, values: { fromPath }, @@ -74,6 +74,9 @@ export const config: PluginConfigDescriptor = { i18n.translate('xpack.reporting.deprecations.reportingRoles.manualStepOne', { defaultMessage: `Set "xpack.reporting.roles.enabled" to "false" in kibana.yml.`, }), + i18n.translate('xpack.reporting.deprecations.reportingRoles.manualStepOnePartOne', { + defaultMessage: `Remove "xpack.reporting.roles.allow" to "false" in kibana.yml, if present.`, + }), i18n.translate('xpack.reporting.deprecations.reportingRoles.manualStepTwo', { defaultMessage: `Create one or more roles that grant the Kibana application` + diff --git a/x-pack/plugins/reporting/server/core.ts b/x-pack/plugins/reporting/server/core.ts index e09cee8c3c7c2..6b00e08c58685 100644 --- a/x-pack/plugins/reporting/server/core.ts +++ b/x-pack/plugins/reporting/server/core.ts @@ -13,6 +13,7 @@ import { BasePath, IClusterClient, KibanaRequest, + PackageInfo, PluginInitializerContext, SavedObjectsClientContract, SavedObjectsServiceStart, @@ -57,7 +58,7 @@ export interface ReportingInternalStart { } export class ReportingCore { - private kibanaVersion: string; + private packageInfo: PackageInfo; private pluginSetupDeps?: ReportingInternalSetup; private pluginStartDeps?: ReportingInternalStart; private readonly pluginSetup$ = new Rx.ReplaySubject(); // observe async background setupDeps and config each are done @@ -72,7 +73,7 @@ export class ReportingCore { public getContract: () => ReportingSetup; constructor(private logger: LevelLogger, context: PluginInitializerContext) { - this.kibanaVersion = context.env.packageInfo.version; + this.packageInfo = context.env.packageInfo; const syncConfig = context.config.get(); this.deprecatedAllowedRoles = syncConfig.roles.enabled ? syncConfig.roles.allow : false; this.executeTask = new ExecuteReportTask(this, syncConfig, this.logger); @@ -85,8 +86,8 @@ export class ReportingCore { this.executing = new Set(); } - public getKibanaVersion() { - return this.kibanaVersion; + public getKibanaPackageInfo() { + return this.packageInfo; } /* diff --git a/x-pack/plugins/reporting/server/deprecations/__snapshots__/reporting_role.test.ts.snap b/x-pack/plugins/reporting/server/deprecations/__snapshots__/reporting_role.test.ts.snap new file mode 100644 index 0000000000000..00a2a63280c9e --- /dev/null +++ b/x-pack/plugins/reporting/server/deprecations/__snapshots__/reporting_role.test.ts.snap @@ -0,0 +1,113 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`roles mapped to a deprecated role includes steps to remove the incompatible config, when applicable 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Set \\"xpack.reporting.roles.enabled: false\\" in kibana.yml.", + "Remove \\"xpack.reporting.roles.allow\\" in kibana.yml, if present.", + "Create a custom role with Kibana privileges to grant access to Reporting.", + "Remove the \\"reporting_user\\" role from all users and add the custom role. The affected users are: reportron[reporting_user].", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/branch/kibana-privileges.html", + "level": "warning", + "message": "Existing users have their Reporting privilege granted by a deprecated setting.", + "title": "The \\"reporting_user\\" role is deprecated: check user roles", + }, +] +`; + +exports[`roles mapped to a deprecated role logs a deprecation when a role was found that maps to a deprecated custom role from the roles.allow setting 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Create a custom role with Kibana privileges to grant access to Reporting.", + "Remove the \\"reporting_user\\" role from all role mappings and add the custom role. The affected role mappings are: dungeon_master[my_test_reporting_user].", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/branch/kibana-privileges.html", + "level": "warning", + "message": "Existing roles are mapped to a deprecated role for Reporting privileges", + "title": "The \\"reporting_user\\" role is deprecated: check role mappings", + }, +] +`; + +exports[`roles mapped to a deprecated role logs a deprecation when a role was found that maps to the deprecated reporting_user role 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Create a custom role with Kibana privileges to grant access to Reporting.", + "Remove the \\"reporting_user\\" role from all role mappings and add the custom role. The affected role mappings are: dungeon_master[reporting_user].", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/branch/kibana-privileges.html", + "level": "warning", + "message": "Existing roles are mapped to a deprecated role for Reporting privileges", + "title": "The \\"reporting_user\\" role is deprecated: check role mappings", + }, +] +`; + +exports[`users assigned to a deprecated role includes steps to remove the incompatible config, when applicable 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Set \\"xpack.reporting.roles.enabled: false\\" in kibana.yml.", + "Remove \\"xpack.reporting.roles.allow\\" in kibana.yml, if present.", + "Create a custom role with Kibana privileges to grant access to Reporting.", + "Remove the \\"reporting_user\\" role from all users and add the custom role. The affected users are: reportron[reporting_user].", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/branch/kibana-privileges.html", + "level": "warning", + "message": "Existing users have their Reporting privilege granted by a deprecated setting.", + "title": "The \\"reporting_user\\" role is deprecated: check user roles", + }, +] +`; + +exports[`users assigned to a deprecated role logs a deprecation when a user was found with a deprecated custom role from the roles.allow setting 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Create a custom role with Kibana privileges to grant access to Reporting.", + "Remove the \\"reporting_user\\" role from all users and add the custom role. The affected users are: reportron[my_test_reporting_user].", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/branch/kibana-privileges.html", + "level": "warning", + "message": "Existing users have their Reporting privilege granted by a deprecated setting.", + "title": "The \\"reporting_user\\" role is deprecated: check user roles", + }, +] +`; + +exports[`users assigned to a deprecated role logs a deprecation when a user was found with a deprecated reporting_user role 1`] = ` +Array [ + Object { + "correctiveActions": Object { + "manualSteps": Array [ + "Create a custom role with Kibana privileges to grant access to Reporting.", + "Remove the \\"reporting_user\\" role from all users and add the custom role. The affected users are: reportron[reporting_user].", + ], + }, + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/branch/kibana-privileges.html", + "level": "warning", + "message": "Existing users have their Reporting privilege granted by a deprecated setting.", + "title": "The \\"reporting_user\\" role is deprecated: check user roles", + }, +] +`; diff --git a/x-pack/plugins/reporting/server/deprecations/reporting_role.test.ts b/x-pack/plugins/reporting/server/deprecations/reporting_role.test.ts index 5b0719bf6e6b6..2286a9767f000 100644 --- a/x-pack/plugins/reporting/server/deprecations/reporting_role.test.ts +++ b/x-pack/plugins/reporting/server/deprecations/reporting_role.test.ts @@ -5,19 +5,25 @@ * 2.0. */ +import { GetDeprecationsContext, IScopedClusterClient } from 'kibana/server'; +import { elasticsearchServiceMock } from 'src/core/server/mocks'; import { ReportingCore } from '..'; +import { + createMockConfigSchema, + createMockPluginSetup, + createMockReportingCore, +} from '../test_helpers'; import { getDeprecationsInfo } from './reporting_role'; -import { createMockConfigSchema, createMockReportingCore } from '../test_helpers'; -import { elasticsearchServiceMock } from 'src/core/server/mocks'; -import { GetDeprecationsContext, IScopedClusterClient } from 'kibana/server'; let reportingCore: ReportingCore; let context: GetDeprecationsContext; let esClient: jest.Mocked; beforeEach(async () => { - const mockReportingConfig = createMockConfigSchema({ roles: { enabled: false } }); - reportingCore = await createMockReportingCore(mockReportingConfig); + reportingCore = await createMockReportingCore( + createMockConfigSchema({ roles: { enabled: false } }) + ); + esClient = elasticsearchServiceMock.createScopedClusterClient(); esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ body: { xyz: { username: 'normal_user', roles: ['data_analyst'] } }, @@ -26,95 +32,132 @@ beforeEach(async () => { }); test('logs no deprecations when setup has no issues', async () => { - expect( - await getDeprecationsInfo(context, { - reportingCore, - }) - ).toMatchInlineSnapshot(`Array []`); + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchInlineSnapshot(`Array []`); }); -test('logs a plain message when only a reporting_user role issue is found', async () => { - esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ - body: { reportron: { username: 'reportron', roles: ['kibana_admin', 'reporting_user'] } }, +describe('users assigned to a deprecated role', () => { + test('logs a deprecation when a user was found with a deprecated reporting_user role', async () => { + esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ + body: { reportron: { username: 'reportron', roles: ['kibana_admin', 'reporting_user'] } }, + }); + + reportingCore = await createMockReportingCore(createMockConfigSchema()); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchSnapshot(); }); - expect( - await getDeprecationsInfo(context, { - reportingCore, - }) - ).toMatchInlineSnapshot(` - Array [ - Object { - "correctiveActions": Object { - "manualSteps": Array [ - "Create one or more custom roles that provide Kibana application privileges to reporting features in **Management > Security > Roles**.", - "Assign the custom role(s) as desired, and remove the \\"reporting_user\\" role from the user(s).", - ], - }, - "documentationUrl": "https://www.elastic.co/guide/en/kibana/current/secure-reporting.html", - "level": "critical", - "message": "The deprecated \\"reporting_user\\" role has been found for 1 user(s): \\"reportron\\"", - "title": "Found deprecated reporting role", + + test('logs a deprecation when a user was found with a deprecated custom role from the roles.allow setting', async () => { + reportingCore = await createMockReportingCore( + createMockConfigSchema({ roles: { allow: ['my_test_reporting_user'] } }) + ); + esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ + body: { + reportron: { username: 'reportron', roles: ['kibana_admin', 'my_test_reporting_user'] }, }, - ] - `); + }); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchSnapshot(); + }); + + test('includes steps to remove the incompatible config, when applicable', async () => { + esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ + body: { reportron: { username: 'reportron', roles: ['kibana_admin', 'reporting_user'] } }, + }); + + reportingCore = await createMockReportingCore( + createMockConfigSchema({ roles: { enabled: true } }) + ); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchSnapshot(); + }); }); -test('logs multiple entries when multiple reporting_user role issues are found', async () => { - esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ - body: { - reportron: { username: 'reportron', roles: ['kibana_admin', 'reporting_user'] }, - supercooluser: { username: 'supercooluser', roles: ['kibana_admin', 'reporting_user'] }, - }, +describe('roles mapped to a deprecated role', () => { + test('logs a deprecation when a role was found that maps to the deprecated reporting_user role', async () => { + esClient.asCurrentUser.security.getRoleMapping = jest.fn().mockResolvedValue({ + body: { dungeon_master: { roles: ['reporting_user'] } }, + }); + + reportingCore = await createMockReportingCore(createMockConfigSchema()); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchSnapshot(); + }); + + test('logs a deprecation when a role was found that maps to a deprecated custom role from the roles.allow setting', async () => { + reportingCore = await createMockReportingCore( + createMockConfigSchema({ roles: { allow: ['my_test_reporting_user'] } }) + ); + esClient.asCurrentUser.security.getRoleMapping = jest.fn().mockResolvedValue({ + body: { dungeon_master: { roles: ['my_test_reporting_user'] } }, + }); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchSnapshot(); }); - expect( - await getDeprecationsInfo(context, { - reportingCore, - }) - ).toMatchInlineSnapshot(` + test('includes steps to remove the incompatible config, when applicable', async () => { + esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ + body: { reportron: { username: 'reportron', roles: ['kibana_admin', 'reporting_user'] } }, + }); + + reportingCore = await createMockReportingCore( + createMockConfigSchema({ roles: { enabled: true } }) + ); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchSnapshot(); + }); +}); + +describe('check deprecations when security is disabled', () => { + test('logs no deprecations: roles not enabled', async () => { + reportingCore = await createMockReportingCore( + createMockConfigSchema({ roles: { enabled: false } }), + createMockPluginSetup({ security: null }) + ); + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchInlineSnapshot(`Array []`); + }); + + test('logs no deprecations: roles enabled', async () => { + const mockReportingConfig = createMockConfigSchema(); // roles.enabled: true is default in 7.x / 8.0 + reportingCore = await createMockReportingCore( + mockReportingConfig, + createMockPluginSetup({ security: null }) + ); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchInlineSnapshot(`Array []`); + }); +}); + +it('insufficient permissions', async () => { + const permissionsError = new Error('you shall not pass'); + (permissionsError as unknown as { statusCode: number }).statusCode = 403; + esClient.asCurrentUser.security.getUser = jest.fn().mockRejectedValue(permissionsError); + esClient.asCurrentUser.security.getRoleMapping = jest.fn().mockRejectedValue(permissionsError); + + expect(await getDeprecationsInfo(context, { reportingCore })).toMatchInlineSnapshot(` Array [ Object { "correctiveActions": Object { "manualSteps": Array [ - "Create one or more custom roles that provide Kibana application privileges to reporting features in **Management > Security > Roles**.", - "Assign the custom role(s) as desired, and remove the \\"reporting_user\\" role from the user(s).", + "Make sure you have a \\"manage_security\\" cluster privilege assigned.", ], }, - "documentationUrl": "https://www.elastic.co/guide/en/kibana/current/secure-reporting.html", - "level": "critical", - "message": "The deprecated \\"reporting_user\\" role has been found for 2 user(s): \\"reportron\\", \\"supercooluser\\"", - "title": "Found deprecated reporting role", + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/current/xpack-security.html#_required_permissions_7", + "level": "fetch_error", + "message": "You do not have enough permissions to fix this deprecation.", + "title": "The \\"reporting_user\\" role is deprecated: check user roles", }, - ] - `); -}); - -test('logs an expanded message when a config issue and a reporting_user role issue is found', async () => { - esClient.asCurrentUser.security.getUser = jest.fn().mockResolvedValue({ - body: { reportron: { username: 'reportron', roles: ['kibana_admin', 'reporting_user'] } }, - }); - - const mockReportingConfig = createMockConfigSchema({ roles: { enabled: true } }); - reportingCore = await createMockReportingCore(mockReportingConfig); - - expect( - await getDeprecationsInfo(context, { - reportingCore, - }) - ).toMatchInlineSnapshot(` - Array [ Object { "correctiveActions": Object { "manualSteps": Array [ - "Set \\"xpack.reporting.roles.enabled: false\\" in kibana.yml", - "Create one or more custom roles that provide Kibana application privileges to reporting features in **Management > Security > Roles**.", - "Assign the custom role(s) as desired, and remove the \\"reporting_user\\" role from the user(s).", + "Make sure you have a \\"manage_security\\" cluster privilege assigned.", ], }, - "documentationUrl": "https://www.elastic.co/guide/en/kibana/current/secure-reporting.html", - "level": "critical", - "message": "The deprecated \\"reporting_user\\" role has been found for 1 user(s): \\"reportron\\"", - "title": "Found deprecated reporting role", + "deprecationType": "feature", + "documentationUrl": "https://www.elastic.co/guide/en/kibana/current/xpack-security.html#_required_permissions_7", + "level": "fetch_error", + "message": "You do not have enough permissions to fix this deprecation.", + "title": "The \\"reporting_user\\" role is deprecated: check role mappings", }, ] `); diff --git a/x-pack/plugins/reporting/server/deprecations/reporting_role.ts b/x-pack/plugins/reporting/server/deprecations/reporting_role.ts index 6e08169727d1b..a2a7e9c78726d 100644 --- a/x-pack/plugins/reporting/server/deprecations/reporting_role.ts +++ b/x-pack/plugins/reporting/server/deprecations/reporting_role.ts @@ -5,65 +5,206 @@ * 2.0. */ -import type { GetDeprecationsContext, DeprecationsDetails } from 'src/core/server'; +import { + SecurityGetRoleMappingResponse, + SecurityGetUserResponse, +} from '@elastic/elasticsearch/api/types'; import { i18n } from '@kbn/i18n'; -import { ReportingCore } from '..'; +import type { + DeprecationsDetails, + ElasticsearchClient, + GetDeprecationsContext, +} from 'src/core/server'; +import { ReportingCore } from '../'; +import { deprecations } from '../lib/deprecations'; -const deprecatedRole = 'reporting_user'; -const upgradableConfig = 'xpack.reporting.roles.enabled: false'; +const REPORTING_USER_ROLE_NAME = 'reporting_user'; +const getDocumentationUrl = (branch: string) => + `https://www.elastic.co/guide/en/kibana/${branch}/kibana-privileges.html`; interface ExtraDependencies { reportingCore: ReportingCore; } -export const getDeprecationsInfo = async ( +export async function getDeprecationsInfo( { esClient }: GetDeprecationsContext, { reportingCore }: ExtraDependencies -): Promise => { +): Promise { + const client = esClient.asCurrentUser; + const { security } = reportingCore.getPluginSetupDeps(); + + // Nothing to do if security is disabled + if (!security?.license.isEnabled()) { + return []; + } + + const config = reportingCore.getConfig(); + const deprecatedRoles = config.get('roles', 'allow') || ['reporting_user']; + + return [ + ...(await getUsersDeprecations(client, reportingCore, deprecatedRoles)), + ...(await getRoleMappingsDeprecations(client, reportingCore, deprecatedRoles)), + ]; +} + +async function getUsersDeprecations( + client: ElasticsearchClient, + reportingCore: ReportingCore, + deprecatedRoles: string[] +): Promise { const usingDeprecatedConfig = !reportingCore.getContract().usesUiCapabilities(); - const deprecations: DeprecationsDetails[] = []; - const { body: users } = await esClient.asCurrentUser.security.getUser(); + const strings = { + title: i18n.translate('xpack.reporting.deprecations.reportingRoleUsersTitle', { + defaultMessage: 'The "{reportingUserRoleName}" role is deprecated: check user roles', + values: { reportingUserRoleName: REPORTING_USER_ROLE_NAME }, + }), + message: i18n.translate('xpack.reporting.deprecations.reportingRoleUsersMessage', { + defaultMessage: + 'Existing users have their Reporting privilege granted by a deprecated setting.', + }), + manualSteps: (usersRoles: string) => [ + ...(usingDeprecatedConfig + ? [ + i18n.translate('xpack.reporting.deprecations.reportingRoleUsers.manualStepOne', { + defaultMessage: 'Set "xpack.reporting.roles.enabled: false" in kibana.yml.', + }), + i18n.translate('xpack.reporting.deprecations.reportingRoleUsers.manualStepTwo', { + defaultMessage: 'Remove "xpack.reporting.roles.allow" in kibana.yml, if present.', + }), + ] + : []), + + i18n.translate('xpack.reporting.deprecations.reportingRoleUsers.manualStepThree', { + defaultMessage: 'Create a custom role with Kibana privileges to grant access to Reporting.', + }), + i18n.translate('xpack.reporting.deprecations.reportingRoleUsers.manualStepFour', { + defaultMessage: + 'Remove the "reporting_user" role from all users and add the custom role. The affected users are: {usersRoles}.', + values: { usersRoles }, + }), + ], + }; + + let users: SecurityGetUserResponse; + try { + users = (await client.security.getUser()).body; + } catch (err) { + const { logger } = reportingCore.getPluginSetupDeps(); + if (deprecations.getErrorStatusCode(err) === 403) { + logger.warn( + `Failed to retrieve users when checking for deprecations:` + + ` the "manage_security" cluster privilege is required.` + ); + } else { + logger.error( + `Failed to retrieve users when checking for deprecations,` + + ` unexpected error: ${deprecations.getDetailedErrorMessage(err)}.` + ); + } + return deprecations.deprecationError(strings.title, err); + } + + const reportingUsers = Object.entries(users).reduce((userSet, current) => { + const [userName, user] = current; + const foundRole = user.roles.find((role) => deprecatedRoles.includes(role)); + return foundRole ? [...userSet, `${userName}[${foundRole}]`] : userSet; + }, [] as string[]); - const reportingUsers = Object.entries(users) - .filter(([, user]) => user.roles.includes(deprecatedRole)) - .map(([, user]) => user.username); + if (reportingUsers.length === 0) { + return []; + } + + return [ + { + title: strings.title, + message: strings.message, + correctiveActions: { manualSteps: strings.manualSteps(reportingUsers.join(', ')) }, + level: 'warning', + deprecationType: 'feature', + documentationUrl: getDocumentationUrl(reportingCore.getKibanaPackageInfo().branch), + }, + ]; +} - const numReportingUsers = reportingUsers.length; +async function getRoleMappingsDeprecations( + client: ElasticsearchClient, + reportingCore: ReportingCore, + deprecatedRoles: string[] +): Promise { + const usingDeprecatedConfig = !reportingCore.getContract().usesUiCapabilities(); + const strings = { + title: i18n.translate('xpack.reporting.deprecations.reportingRoleMappingsTitle', { + defaultMessage: 'The "{reportingUserRoleName}" role is deprecated: check role mappings', + values: { reportingUserRoleName: REPORTING_USER_ROLE_NAME }, + }), + message: i18n.translate('xpack.reporting.deprecations.reportingRoleMappingsMessage', { + defaultMessage: 'Existing roles are mapped to a deprecated role for Reporting privileges', + }), + manualSteps: (roleMappings: string) => [ + ...(usingDeprecatedConfig + ? [ + i18n.translate('xpack.reporting.deprecations.reportingRoleMappings.manualStepOne', { + defaultMessage: 'Set "xpack.reporting.roles.enabled: false" in kibana.yml.', + }), + i18n.translate('xpack.reporting.deprecations.reportingRoleMappings.manualStepTwo', { + defaultMessage: 'Remove "xpack.reporting.roles.allow" in kibana.yml, if present.', + }), + ] + : []), - if (numReportingUsers > 0) { - deprecations.push({ - title: i18n.translate('xpack.reporting.deprecations.reportingRoleTitle', { - defaultMessage: 'Found deprecated reporting role', + i18n.translate('xpack.reporting.deprecations.reportingRoleMappings.manualStepThree', { + defaultMessage: 'Create a custom role with Kibana privileges to grant access to Reporting.', }), - message: i18n.translate('xpack.reporting.deprecations.reportingRoleMessage', { + i18n.translate('xpack.reporting.deprecations.reportingRoleMappings.manualStepFour', { defaultMessage: - 'The deprecated "{deprecatedRole}" role has been found for {numReportingUsers} user(s): "{usernames}"', - values: { deprecatedRole, numReportingUsers, usernames: reportingUsers.join('", "') }, + 'Remove the "reporting_user" role from all role mappings and add the custom role. The affected role mappings are: {roleMappings}.', + values: { roleMappings }, }), - documentationUrl: 'https://www.elastic.co/guide/en/kibana/current/secure-reporting.html', - level: 'critical', - correctiveActions: { - manualSteps: [ - ...(usingDeprecatedConfig - ? [ - i18n.translate('xpack.reporting.deprecations.reportingRole.manualStepOneMessage', { - defaultMessage: 'Set "{upgradableConfig}" in kibana.yml', - values: { upgradableConfig }, - }), - ] - : []), - i18n.translate('xpack.reporting.deprecations.reportingRole.manualStepTwoMessage', { - defaultMessage: `Create one or more custom roles that provide Kibana application privileges to reporting features in **Management > Security > Roles**.`, - }), - i18n.translate('xpack.reporting.deprecations.reportingRole.manualStepThreeMessage', { - defaultMessage: - 'Assign the custom role(s) as desired, and remove the "{deprecatedRole}" role from the user(s).', - values: { deprecatedRole }, - }), - ], - }, - }); + ], + }; + + let roleMappings: SecurityGetRoleMappingResponse; + try { + roleMappings = (await client.security.getRoleMapping()).body; + } catch (err) { + const { logger } = reportingCore.getPluginSetupDeps(); + if (deprecations.getErrorStatusCode(err) === 403) { + logger.warn( + `Failed to retrieve role mappings when checking for deprecations:` + + ` the "manage_security" cluster privilege is required.` + ); + } else { + logger.error( + `Failed to retrieve role mappings when checking for deprecations,` + + ` unexpected error: ${deprecations.getDetailedErrorMessage(err)}.` + ); + } + return deprecations.deprecationError(strings.title, err); } - return deprecations; -}; + const roleMappingsWithReportingRole: string[] = Object.entries(roleMappings).reduce( + (roleSet, current) => { + const [roleName, role] = current; + const foundMapping = role.roles.find((roll) => deprecatedRoles.includes(roll)); + return foundMapping ? [...roleSet, `${roleName}[${foundMapping}]`] : roleSet; + }, + [] as string[] + ); + + if (roleMappingsWithReportingRole.length === 0) { + return []; + } + + return [ + { + title: strings.title, + message: strings.message, + correctiveActions: { + manualSteps: strings.manualSteps(roleMappingsWithReportingRole.join(', ')), + }, + level: 'warning', + deprecationType: 'feature', + documentationUrl: getDocumentationUrl(reportingCore.getKibanaPackageInfo().branch), + }, + ]; +} diff --git a/x-pack/plugins/reporting/server/export_types/common/generate_png.ts b/x-pack/plugins/reporting/server/export_types/common/generate_png.ts index 85e9513c4a618..5ad39a3f91303 100644 --- a/x-pack/plugins/reporting/server/export_types/common/generate_png.ts +++ b/x-pack/plugins/reporting/server/export_types/common/generate_png.ts @@ -11,7 +11,7 @@ import { finalize, map, tap } from 'rxjs/operators'; import { ReportingCore } from '../../'; import { UrlOrUrlLocatorTuple } from '../../../common/types'; import { LevelLogger } from '../../lib'; -import { LayoutParams, PreserveLayout } from '../../lib/layouts'; +import { LayoutParams, LayoutSelectorDictionary, PreserveLayout } from '../../lib/layouts'; import { getScreenshots$, ScreenshotResults } from '../../lib/screenshots'; import { ConditionalHeaders } from '../common'; @@ -25,14 +25,15 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { urlOrUrlLocatorTuple: UrlOrUrlLocatorTuple, browserTimezone: string | undefined, conditionalHeaders: ConditionalHeaders, - layoutParams: LayoutParams + layoutParams: LayoutParams & { selectors?: Partial } ): Rx.Observable<{ buffer: Buffer; warnings: string[] }> { const apmTrans = apm.startTransaction('reporting generate_png', 'reporting'); const apmLayout = apmTrans?.startSpan('create_layout', 'setup'); if (!layoutParams || !layoutParams.dimensions) { throw new Error(`LayoutParams.Dimensions is undefined.`); } - const layout = new PreserveLayout(layoutParams.dimensions); + const layout = new PreserveLayout(layoutParams.dimensions, layoutParams.selectors); + if (apmLayout) apmLayout.end(); const apmScreenshots = apmTrans?.startSpan('screenshots_pipeline', 'setup'); diff --git a/x-pack/plugins/reporting/server/lib/deprecations/index.ts b/x-pack/plugins/reporting/server/lib/deprecations/index.ts index 95594940e07e2..2d55c3b4c22d8 100644 --- a/x-pack/plugins/reporting/server/lib/deprecations/index.ts +++ b/x-pack/plugins/reporting/server/lib/deprecations/index.ts @@ -5,8 +5,82 @@ * 2.0. */ +import { errors } from '@elastic/elasticsearch'; +import Boom from '@hapi/boom'; +import { i18n } from '@kbn/i18n'; +import { DeprecationsDetails } from 'kibana/server'; import { checkIlmMigrationStatus } from './check_ilm_migration_status'; +function deprecationError(title: string, error: Error): DeprecationsDetails[] { + if (getErrorStatusCode(error) === 403) { + return [ + { + title, + level: 'fetch_error', // NOTE: is fetch_error not shown in the Upgrade Assistant UI? + deprecationType: 'feature', + message: i18n.translate( + 'xpack.reporting.deprecations.reportingRole.forbiddenErrorMessage', + { defaultMessage: 'You do not have enough permissions to fix this deprecation.' } + ), + documentationUrl: `https://www.elastic.co/guide/en/kibana/current/xpack-security.html#_required_permissions_7`, + correctiveActions: { + manualSteps: [ + i18n.translate( + 'xpack.reporting.deprecations.reportingRole.forbiddenErrorCorrectiveAction', + { + defaultMessage: + 'Make sure you have a "manage_security" cluster privilege assigned.', + } + ), + ], + }, + }, + ]; + } + + return [ + { + title, + level: 'fetch_error', // NOTE: is fetch_error not shown in the Upgrade Assistant UI? + deprecationType: 'feature', + message: i18n.translate('xpack.reporting.deprecations.reportingRole.unknownErrorMessage', { + defaultMessage: 'Failed to perform deprecation check. Check Kibana logs for more details.', + }), + correctiveActions: { + manualSteps: [ + i18n.translate( + 'xpack.reporting.deprecations.reportingRole.unknownErrorCorrectiveAction', + { defaultMessage: 'Check Kibana logs for more details.' } + ), + ], + }, + }, + ]; +} + +function getErrorStatusCode(error: any): number { + if (error instanceof errors.ResponseError) { + return error.statusCode; + } + + return Boom.isBoom(error) ? error.output.statusCode : error.statusCode || error.status; +} + +function getDetailedErrorMessage(error: any): string { + if (error instanceof errors.ResponseError) { + return JSON.stringify(error.body); + } + + if (Boom.isBoom(error)) { + return JSON.stringify(error.output.payload); + } + + return error.message; +} + export const deprecations = { checkIlmMigrationStatus, + deprecationError, + getDetailedErrorMessage, + getErrorStatusCode, }; diff --git a/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.test.ts b/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.test.ts new file mode 100644 index 0000000000000..d78e877e526f5 --- /dev/null +++ b/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.test.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PreserveLayout } from './preserve_layout'; + +it('preserve layout uses default layout selectors', () => { + const testPreserveLayout = new PreserveLayout({ width: 16, height: 16 }); + + expect(testPreserveLayout.getCssOverridesPath()).toMatch(`layouts/preserve_layout.css`); + expect(testPreserveLayout.getBrowserViewport()).toMatchObject({ height: 32, width: 32 }); + expect(testPreserveLayout.getBrowserZoom()).toBe(2); + expect(testPreserveLayout.getPdfImageSize()).toMatchObject({ height: 16, width: 16 }); + expect(testPreserveLayout.getPdfPageOrientation()).toBe(undefined); + expect( + testPreserveLayout.getPdfPageSize({ + pageMarginTop: 27, + pageMarginBottom: 27, + pageMarginWidth: 13, + tableBorderWidth: 67, + headingHeight: 82, + subheadingHeight: 96, + }) + ).toMatchObject({ height: 382, width: 176 }); + expect(testPreserveLayout.selectors).toMatchInlineSnapshot(` + Object { + "itemsCountAttribute": "data-shared-items-count", + "renderComplete": "[data-shared-item]", + "renderError": "[data-render-error]", + "renderErrorAttribute": "data-render-error", + "screenshot": "[data-shared-items-container]", + "timefilterDurationAttribute": "data-shared-timefilter-duration", + } + `); + expect(testPreserveLayout.groupCount).toBe(1); + expect(testPreserveLayout.height).toBe(16); + expect(testPreserveLayout.width).toBe(16); +}); + +it('preserve layout allows customizable selectors', () => { + const testPreserveLayout = new PreserveLayout( + { width: 16, height: 16 }, + { renderComplete: '[great-test-selectors]' } + ); + + expect(testPreserveLayout.selectors).toMatchInlineSnapshot(` + Object { + "itemsCountAttribute": "data-shared-items-count", + "renderComplete": "[great-test-selectors]", + "renderError": "[data-render-error]", + "renderErrorAttribute": "data-render-error", + "screenshot": "[data-shared-items-container]", + "timefilterDurationAttribute": "data-shared-timefilter-duration", + } + `); +}); diff --git a/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.ts b/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.ts index 9833f340d47f3..424e85327c22b 100644 --- a/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.ts +++ b/x-pack/plugins/reporting/server/lib/layouts/preserve_layout.ts @@ -9,26 +9,31 @@ import path from 'path'; import { CustomPageSize } from 'pdfmake/interfaces'; import { LAYOUT_TYPES } from '../../../common/constants'; import { PageSizeParams, Size } from '../../../common/types'; -import { getDefaultLayoutSelectors, LayoutInstance } from './'; +import { getDefaultLayoutSelectors, LayoutInstance, LayoutSelectorDictionary } from './'; import { Layout } from './layout'; // We use a zoom of two to bump up the resolution of the screenshot a bit. const ZOOM: number = 2; export class PreserveLayout extends Layout implements LayoutInstance { - public readonly selectors = getDefaultLayoutSelectors(); + public readonly selectors: LayoutSelectorDictionary; public readonly groupCount = 1; public readonly height: number; public readonly width: number; private readonly scaledHeight: number; private readonly scaledWidth: number; - constructor(size: Size) { + constructor(size: Size, selectors?: Partial) { super(LAYOUT_TYPES.PRESERVE_LAYOUT); this.height = size.height; this.width = size.width; this.scaledHeight = size.height * ZOOM; this.scaledWidth = size.width * ZOOM; + + this.selectors = { + ...getDefaultLayoutSelectors(), + ...selectors, + }; } public getCssOverridesPath() { diff --git a/x-pack/plugins/reporting/server/routes/diagnostic/browser.test.ts b/x-pack/plugins/reporting/server/routes/diagnostic/browser.test.ts index f32e1b437bc33..7b4cc2008a676 100644 --- a/x-pack/plugins/reporting/server/routes/diagnostic/browser.test.ts +++ b/x-pack/plugins/reporting/server/routes/diagnostic/browser.test.ts @@ -28,7 +28,8 @@ type SetupServerReturn = UnwrapPromise>; const devtoolMessage = 'DevTools listening on (ws://localhost:4000)'; const fontNotFoundMessage = 'Could not find the default font'; -describe('POST /diagnose/browser', () => { +// FLAKY: https://github.com/elastic/kibana/issues/89369 +describe.skip('POST /diagnose/browser', () => { jest.setTimeout(6000); const reportingSymbol = Symbol('reporting'); const mockLogger = createMockLevelLogger(); @@ -52,11 +53,13 @@ describe('POST /diagnose/browser', () => { () => ({ usesUiCapabilities: () => false }) ); - const mockSetupDeps = createMockPluginSetup({ - router: httpSetup.createRouter(''), - }); - - core = await createMockReportingCore(config, mockSetupDeps); + core = await createMockReportingCore( + config, + createMockPluginSetup({ + router: httpSetup.createRouter(''), + security: null, + }) + ); mockedSpawn.mockImplementation(() => ({ removeAllListeners: jest.fn(), diff --git a/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.test.ts b/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.test.ts index 6d844f9637a0b..dd543707fe66a 100644 --- a/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.test.ts +++ b/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.test.ts @@ -50,11 +50,13 @@ describe('POST /diagnose/screenshot', () => { () => ({ usesUiCapabilities: () => false }) ); - const mockSetupDeps = createMockPluginSetup({ - router: httpSetup.createRouter(''), - }); - - core = await createMockReportingCore(config, mockSetupDeps); + core = await createMockReportingCore( + config, + createMockPluginSetup({ + router: httpSetup.createRouter(''), + security: null, + }) + ); }); afterEach(async () => { diff --git a/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.ts b/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.ts index 3a89c869542b4..f2002dd945882 100644 --- a/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.ts +++ b/x-pack/plugins/reporting/server/routes/diagnostic/screenshot.ts @@ -67,6 +67,7 @@ export const registerDiagnoseScreenshot = (reporting: ReportingCore, logger: Log .pipe() .toPromise() .then((screenshot) => { + // NOTE: the screenshot could be returned as a string using `data:image/png;base64,` + results.buffer.toString('base64') if (screenshot.warnings.length) { return res.ok({ body: { diff --git a/x-pack/plugins/reporting/server/routes/generate/legacy.ts b/x-pack/plugins/reporting/server/routes/generate/legacy.ts index 92f1784dc8eca..f262d186d5531 100644 --- a/x-pack/plugins/reporting/server/routes/generate/legacy.ts +++ b/x-pack/plugins/reporting/server/routes/generate/legacy.ts @@ -53,7 +53,7 @@ export function registerLegacy(reporting: ReportingCore, logger: LevelLogger) { savedObjectId, browserTimezone, queryString, - version: reporting.getKibanaVersion(), + version: reporting.getKibanaPackageInfo().version, }); } catch (err) { throw requestHandler.handleError(err); diff --git a/x-pack/plugins/reporting/server/routes/lib/request_handler.ts b/x-pack/plugins/reporting/server/routes/lib/request_handler.ts index a87f5c2913031..2100c4c3c43ac 100644 --- a/x-pack/plugins/reporting/server/routes/lib/request_handler.ts +++ b/x-pack/plugins/reporting/server/routes/lib/request_handler.ts @@ -6,6 +6,7 @@ */ import Boom from '@hapi/boom'; +import { i18n } from '@kbn/i18n'; import { KibanaRequest, KibanaResponseFactory } from 'kibana/server'; import { ReportingCore } from '../..'; import { API_BASE_URL } from '../../../common/constants'; @@ -153,7 +154,13 @@ export class RequestHandler { }); } - // unknown error, can't convert to 4xx - throw err; + return this.res.customError({ + statusCode: 500, + body: + err?.message || + i18n.translate('xpack.reporting.errorHandler.unknownError', { + defaultMessage: 'Unknown error', + }), + }); } } diff --git a/x-pack/plugins/reporting/server/routes/management/jobs.test.ts b/x-pack/plugins/reporting/server/routes/management/jobs.test.ts index 02a0ddc94a043..a54be44258ed3 100644 --- a/x-pack/plugins/reporting/server/routes/management/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/management/jobs.test.ts @@ -178,6 +178,36 @@ describe('GET /api/reporting/jobs/download', () => { await supertest(httpSetup.server.listener).get('/api/reporting/jobs/download/poo').expect(401); }); + it(`returns job's info`, async () => { + mockEsClient.search.mockResolvedValueOnce({ + body: getHits({ + jobtype: 'base64EncodedJobType', + payload: {}, // payload is irrelevant + }), + } as any); + + registerJobInfoRoutes(core); + + await server.start(); + + await supertest(httpSetup.server.listener).get('/api/reporting/jobs/info/test').expect(200); + }); + + it(`returns 403 if a user cannot view a job's info`, async () => { + mockEsClient.search.mockResolvedValueOnce({ + body: getHits({ + jobtype: 'customForbiddenJobType', + payload: {}, // payload is irrelevant + }), + } as any); + + registerJobInfoRoutes(core); + + await server.start(); + + await supertest(httpSetup.server.listener).get('/api/reporting/jobs/info/test').expect(403); + }); + it('when a job is incomplete', async () => { mockEsClient.search.mockResolvedValueOnce({ body: getHits({ diff --git a/x-pack/plugins/reporting/server/routes/management/jobs.ts b/x-pack/plugins/reporting/server/routes/management/jobs.ts index 99c317453ca0f..54fc13ffbb613 100644 --- a/x-pack/plugins/reporting/server/routes/management/jobs.ts +++ b/x-pack/plugins/reporting/server/routes/management/jobs.ts @@ -5,8 +5,8 @@ * 2.0. */ -import Boom from '@hapi/boom'; import { schema } from '@kbn/config-schema'; +import { i18n } from '@kbn/i18n'; import { ReportingCore } from '../../'; import { ROUTE_TAG_CAN_REDIRECT } from '../../../../security/server'; import { API_BASE_URL } from '../../../common/constants'; @@ -115,7 +115,12 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { const { jobtype: jobType } = result; if (!jobTypes.includes(jobType)) { - throw Boom.unauthorized(`Sorry, you are not authorized to view ${jobType} info`); + return res.forbidden({ + body: i18n.translate('xpack.reporting.jobsQuery.infoError.unauthorizedErrorMessage', { + defaultMessage: 'Sorry, you are not authorized to view {jobType} info', + values: { jobType }, + }), + }); } return res.ok({ diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_levellogger.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_levellogger.ts index cf0081431f7c7..1a8bfe7b70208 100644 --- a/x-pack/plugins/reporting/server/test_helpers/create_mock_levellogger.ts +++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_levellogger.ts @@ -17,7 +17,7 @@ export function createMockLevelLogger() { const logger = new LevelLogger(loggingSystemMock.create()) as jest.Mocked; logger.clone.mockImplementation(createMockLevelLogger); - logger.debug.mockImplementation(consoleLogger('debug')); + // logger.debug.mockImplementation(consoleLogger('debug')); // uncomment this to see debug logs in jest tests logger.info.mockImplementation(consoleLogger('info')); logger.warn.mockImplementation(consoleLogger('warn')); logger.warning = jest.fn().mockImplementation(consoleLogger('warn')); diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts index 9e58d6d4efa41..d62cc750ccfcc 100644 --- a/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts +++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts @@ -12,11 +12,13 @@ jest.mock('../browsers'); import _ from 'lodash'; import * as Rx from 'rxjs'; import { coreMock, elasticsearchServiceMock } from 'src/core/server/mocks'; -import { FieldFormatsRegistry } from 'src/plugins/field_formats/common'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { dataPluginMock } from 'src/plugins/data/server/mocks'; +import { FieldFormatsRegistry } from 'src/plugins/field_formats/common'; import { ReportingConfig, ReportingCore } from '../'; import { featuresPluginMock } from '../../../features/server/mocks'; +import { securityMock } from '../../../security/server/mocks'; +import { taskManagerMock } from '../../../task_manager/server/mocks'; import { chromium, HeadlessChromiumDriverFactory, @@ -39,9 +41,9 @@ export const createMockPluginSetup = (setupMock?: any): ReportingInternalSetup = features: featuresPluginMock.createSetup(), basePath: { set: jest.fn() }, router: setupMock.router, - security: setupMock.security, + security: securityMock.createSetup(), licensing: { license$: Rx.of({ isAvailable: true, isActive: true, type: 'basic' }) } as any, - taskManager: { registerTaskDefinitions: jest.fn() } as any, + taskManager: taskManagerMock.createSetup(), logger: createMockLevelLogger(), ...setupMock, }; diff --git a/x-pack/plugins/rule_registry/server/config.ts b/x-pack/plugins/rule_registry/server/config.ts index f112a99e59eaa..41cc8737fdd46 100644 --- a/x-pack/plugins/rule_registry/server/config.ts +++ b/x-pack/plugins/rule_registry/server/config.ts @@ -16,7 +16,7 @@ export const config: PluginConfigDescriptor = { schema: schema.object({ enabled: schema.boolean({ defaultValue: true }), write: schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), }), unsafe: schema.object({ legacyMultiTenancy: schema.object({ diff --git a/x-pack/plugins/searchprofiler/public/application/components/percentage_badge/_percentage_badge.scss b/x-pack/plugins/searchprofiler/public/application/components/percentage_badge/_percentage_badge.scss index 8c9f5d8ff6253..f0dfb46cff0a0 100644 --- a/x-pack/plugins/searchprofiler/public/application/components/percentage_badge/_percentage_badge.scss +++ b/x-pack/plugins/searchprofiler/public/application/components/percentage_badge/_percentage_badge.scss @@ -3,7 +3,7 @@ display: block; background-image: linear-gradient( - to left, + to right, $color 0%, $color var(--prfDevToolProgressPercentage, auto), $euiColorLightestShade var(--prfDevToolProgressPercentage, auto), diff --git a/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.test.tsx b/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.test.tsx index 5b5e74cb2c618..f61b2ac2f8056 100644 --- a/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.test.tsx +++ b/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.test.tsx @@ -5,13 +5,7 @@ * 2.0. */ -import { - fireEvent, - render, - waitFor, - waitForElementToBeRemoved, - within, -} from '@testing-library/react'; +import { fireEvent, render, waitFor, within } from '@testing-library/react'; import { createMemoryHistory } from 'history'; import React from 'react'; @@ -34,13 +28,22 @@ const userMock = { roles: ['superuser'], }; -// Failing: See https://github.com/elastic/kibana/issues/115473 -describe.skip('EditUserPage', () => { - it('warns when viewing deactivated user', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; +describe('EditUserPage', () => { + const coreStart = coreMock.createStart(); + let history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); + const authc = securityMock.createSetup().authc; + + beforeEach(() => { + history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); + authc.getCurrentUser.mockClear(); + coreStart.http.delete.mockClear(); + coreStart.http.get.mockClear(); + coreStart.http.post.mockClear(); + coreStart.notifications.toasts.addDanger.mockClear(); + coreStart.notifications.toasts.addSuccess.mockClear(); + }); + it('warns when viewing deactivated user', async () => { coreStart.http.get.mockResolvedValueOnce({ ...userMock, enabled: false, @@ -57,10 +60,6 @@ describe.skip('EditUserPage', () => { }); it('warns when viewing deprecated user', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce({ ...userMock, metadata: { @@ -82,14 +81,10 @@ describe.skip('EditUserPage', () => { fireEvent.click(await findByRole('button', { name: 'Back to users' })); - await waitFor(() => expect(history.location.pathname).toBe('/')); + expect(history.location.pathname).toBe('/'); }); it('warns when viewing built-in user', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce({ ...userMock, metadata: { _reserved: true, _deprecated: false }, @@ -106,14 +101,10 @@ describe.skip('EditUserPage', () => { fireEvent.click(await findByRole('button', { name: 'Back to users' })); - await waitFor(() => expect(history.location.pathname).toBe('/')); + expect(history.location.pathname).toBe('/'); }); it('warns when selecting deprecated role', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce({ ...userMock, enabled: false, @@ -140,10 +131,6 @@ describe.skip('EditUserPage', () => { }); it('updates user when submitting form and redirects back', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); coreStart.http.post.mockResolvedValueOnce({}); @@ -175,10 +162,6 @@ describe.skip('EditUserPage', () => { }); it('warns when user form submission fails', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); coreStart.http.post.mockRejectedValueOnce(new Error('Error message')); @@ -214,10 +197,6 @@ describe.skip('EditUserPage', () => { }); it('changes password of other user when submitting form and closes dialog', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); authc.getCurrentUser.mockResolvedValueOnce( @@ -225,24 +204,23 @@ describe.skip('EditUserPage', () => { ); coreStart.http.post.mockResolvedValueOnce({}); - const { getByRole, findByRole } = render( + const { findByRole } = render( ); fireEvent.click(await findByRole('button', { name: 'Change password' })); - - const dialog = getByRole('dialog'); + const dialog = await findByRole('dialog'); fireEvent.change(await within(dialog).findByLabelText('New password'), { target: { value: 'changeme' }, }); - fireEvent.change(within(dialog).getByLabelText('Confirm password'), { + fireEvent.change(await within(dialog).findByLabelText('Confirm password'), { target: { value: 'changeme' }, }); - fireEvent.click(within(dialog).getByRole('button', { name: 'Change password' })); + fireEvent.click(await within(dialog).findByRole('button', { name: 'Change password' })); - await waitForElementToBeRemoved(() => getByRole('dialog')); + expect(await findByRole('dialog')).not.toBeInTheDocument(); expect(coreStart.http.post).toHaveBeenLastCalledWith('/internal/security/users/jdoe/password', { body: JSON.stringify({ newPassword: 'changeme', @@ -251,23 +229,18 @@ describe.skip('EditUserPage', () => { }); it('changes password of current user when submitting form and closes dialog', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); authc.getCurrentUser.mockResolvedValueOnce(mockAuthenticatedUser(userMock)); coreStart.http.post.mockResolvedValueOnce({}); - const { getByRole, findByRole } = render( + const { findByRole } = render( ); fireEvent.click(await findByRole('button', { name: 'Change password' })); - const dialog = await findByRole('dialog'); fireEvent.change(await within(dialog).findByLabelText('Current password'), { target: { value: '123456' }, @@ -280,7 +253,7 @@ describe.skip('EditUserPage', () => { }); fireEvent.click(await within(dialog).findByRole('button', { name: 'Change password' })); - await waitForElementToBeRemoved(() => getByRole('dialog')); + expect(await findByRole('dialog')).not.toBeInTheDocument(); expect(coreStart.http.post).toHaveBeenLastCalledWith('/internal/security/users/jdoe/password', { body: JSON.stringify({ newPassword: 'changeme', @@ -290,10 +263,6 @@ describe.skip('EditUserPage', () => { }); it('warns when change password form submission fails', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); authc.getCurrentUser.mockResolvedValueOnce( @@ -308,7 +277,6 @@ describe.skip('EditUserPage', () => { ); fireEvent.click(await findByRole('button', { name: 'Change password' })); - const dialog = await findByRole('dialog'); fireEvent.change(await within(dialog).findByLabelText('New password'), { target: { value: 'changeme' }, @@ -327,10 +295,6 @@ describe.skip('EditUserPage', () => { }); it('validates change password form', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); authc.getCurrentUser.mockResolvedValueOnce(mockAuthenticatedUser(userMock)); @@ -343,21 +307,17 @@ describe.skip('EditUserPage', () => { ); fireEvent.click(await findByRole('button', { name: 'Change password' })); - const dialog = await findByRole('dialog'); fireEvent.click(await within(dialog).findByRole('button', { name: 'Change password' })); - await within(dialog).findByText(/Enter your current password/i); await within(dialog).findByText(/Enter a new password/i); fireEvent.change(await within(dialog).findByLabelText('Current password'), { target: { value: 'changeme' }, }); - fireEvent.change(await within(dialog).findByLabelText('New password'), { target: { value: '111' }, }); - await within(dialog).findAllByText(/Password must be at least 6 characters/i); fireEvent.change(await within(dialog).findByLabelText('New password'), { @@ -366,44 +326,34 @@ describe.skip('EditUserPage', () => { fireEvent.change(await within(dialog).findByLabelText('Confirm password'), { target: { value: '111' }, }); - await within(dialog).findAllByText(/Passwords do not match/i); }); it('deactivates user when confirming and closes dialog', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); coreStart.http.post.mockResolvedValueOnce({}); - const { getByRole, findByRole } = render( + const { findByRole } = render( ); fireEvent.click(await findByRole('button', { name: 'Deactivate user' })); + const dialog = await findByRole('dialog'); + fireEvent.click(await within(dialog).findByRole('button', { name: 'Deactivate user' })); - const dialog = getByRole('dialog'); - fireEvent.click(within(dialog).getByRole('button', { name: 'Deactivate user' })); - - await waitForElementToBeRemoved(() => getByRole('dialog')); + expect(await findByRole('dialog')).not.toBeInTheDocument(); expect(coreStart.http.post).toHaveBeenLastCalledWith('/internal/security/users/jdoe/_disable'); }); it('activates user when confirming and closes dialog', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce({ ...userMock, enabled: false }); coreStart.http.get.mockResolvedValueOnce([]); coreStart.http.post.mockResolvedValueOnce({}); - const { getByRole, findAllByRole } = render( + const { findByRole, findAllByRole } = render( @@ -411,36 +361,30 @@ describe.skip('EditUserPage', () => { const [enableButton] = await findAllByRole('button', { name: 'Activate user' }); fireEvent.click(enableButton); + const dialog = await findByRole('dialog'); + fireEvent.click(await within(dialog).findByRole('button', { name: 'Activate user' })); - const dialog = getByRole('dialog'); - fireEvent.click(within(dialog).getByRole('button', { name: 'Activate user' })); - - await waitForElementToBeRemoved(() => getByRole('dialog')); + expect(await findByRole('dialog')).not.toBeInTheDocument(); expect(coreStart.http.post).toHaveBeenLastCalledWith('/internal/security/users/jdoe/_enable'); }); it('deletes user when confirming and redirects back', async () => { - const coreStart = coreMock.createStart(); - const history = createMemoryHistory({ initialEntries: ['/edit/jdoe'] }); - const authc = securityMock.createSetup().authc; - coreStart.http.get.mockResolvedValueOnce(userMock); coreStart.http.get.mockResolvedValueOnce([]); coreStart.http.delete.mockResolvedValueOnce({}); - const { getByRole, findByRole } = render( + const { findByRole } = render( ); fireEvent.click(await findByRole('button', { name: 'Delete user' })); + const dialog = await findByRole('dialog'); + fireEvent.click(await within(dialog).findByRole('button', { name: 'Delete user' })); - const dialog = getByRole('dialog'); - fireEvent.click(within(dialog).getByRole('button', { name: 'Delete user' })); - - expect(coreStart.http.delete).toHaveBeenLastCalledWith('/internal/security/users/jdoe'); await waitFor(() => { + expect(coreStart.http.delete).toHaveBeenLastCalledWith('/internal/security/users/jdoe'); expect(history.location.pathname).toBe('/'); }); }); diff --git a/x-pack/plugins/security/server/config_deprecations.ts b/x-pack/plugins/security/server/config_deprecations.ts index b867c50f589e0..de4a6daf2f80e 100644 --- a/x-pack/plugins/security/server/config_deprecations.ts +++ b/x-pack/plugins/security/server/config_deprecations.ts @@ -225,7 +225,7 @@ export const securityConfigDeprecationProvider: ConfigDeprecationProvider = ({ } }, // Default values for session expiration timeouts. - (settings, fromPath, addDeprecation) => { + (settings, fromPath, addDeprecation, { branch }) => { if (settings?.xpack?.security?.session?.idleTimeout === undefined) { addDeprecation({ configPath: 'xpack.security.session.idleTimeout', @@ -237,6 +237,7 @@ export const securityConfigDeprecationProvider: ConfigDeprecationProvider = ({ defaultMessage: 'User sessions will automatically time out after 8 hours of inactivity starting in 8.0. Override this value to change the timeout.', }), + documentationUrl: `https://www.elastic.co/guide/en/kibana/${branch}/xpack-security-session-management.html#session-idle-timeout`, correctiveActions: { manualSteps: [ i18n.translate('xpack.security.deprecations.idleTimeout.manualStepOneMessage', { @@ -261,6 +262,7 @@ export const securityConfigDeprecationProvider: ConfigDeprecationProvider = ({ defaultMessage: 'Users are automatically required to log in again after 30 days starting in 8.0. Override this value to change the timeout.', }), + documentationUrl: `https://www.elastic.co/guide/en/kibana/${branch}/xpack-security-session-management.html#session-lifespan`, correctiveActions: { manualSteps: [ i18n.translate('xpack.security.deprecations.lifespan.manualStepOneMessage', { diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 442718e0975ee..3ebba007f6b01 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -63,10 +63,10 @@ export const DEFAULT_SPACE_ID = 'default'; // Document path where threat indicator fields are expected. Fields are used // to enrich signals, and are copied to threat.enrichments. -export const DEFAULT_INDICATOR_SOURCE_PATH = 'threat.indicator'; +export const DEFAULT_INDICATOR_SOURCE_PATH = 'threatintel.indicator'; export const ENRICHMENT_DESTINATION_PATH = 'threat.enrichments'; export const DEFAULT_THREAT_INDEX_KEY = 'securitySolution:defaultThreatIndex'; -export const DEFAULT_THREAT_INDEX_VALUE = ['logs-ti_*']; +export const DEFAULT_THREAT_INDEX_VALUE = ['filebeat-*']; export const DEFAULT_THREAT_MATCH_QUERY = '@timestamp >= "now-30d"'; export enum SecurityPageName { @@ -236,6 +236,11 @@ export const INTERNAL_RULE_ID_KEY = `${INTERNAL_IDENTIFIER}_rule_id`; export const INTERNAL_RULE_ALERT_ID_KEY = `${INTERNAL_IDENTIFIER}_rule_alert_id`; export const INTERNAL_IMMUTABLE_KEY = `${INTERNAL_IDENTIFIER}_immutable`; +/** + * Internal actions route + */ +export const UPDATE_OR_CREATE_LEGACY_ACTIONS = '/internal/api/detection/legacy/notifications'; + /** * Detection engine routes */ diff --git a/x-pack/plugins/security_solution/common/cti/constants.ts b/x-pack/plugins/security_solution/common/cti/constants.ts index e63385a15062f..2c50c8e0d12ad 100644 --- a/x-pack/plugins/security_solution/common/cti/constants.ts +++ b/x-pack/plugins/security_solution/common/cti/constants.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ENRICHMENT_DESTINATION_PATH, DEFAULT_INDICATOR_SOURCE_PATH } from '../constants'; +import { ENRICHMENT_DESTINATION_PATH } from '../constants'; export const MATCHED_ATOMIC = 'matched.atomic'; export const MATCHED_FIELD = 'matched.field'; @@ -43,27 +43,27 @@ export enum ENRICHMENT_TYPES { } export const EVENT_ENRICHMENT_INDICATOR_FIELD_MAP = { - 'file.hash.md5': `${DEFAULT_INDICATOR_SOURCE_PATH}.file.hash.md5`, - 'file.hash.sha1': `${DEFAULT_INDICATOR_SOURCE_PATH}.file.hash.sha1`, - 'file.hash.sha256': `${DEFAULT_INDICATOR_SOURCE_PATH}.file.hash.sha256`, - 'file.pe.imphash': `${DEFAULT_INDICATOR_SOURCE_PATH}.file.pe.imphash`, - 'file.elf.telfhash': `${DEFAULT_INDICATOR_SOURCE_PATH}.file.elf.telfhash`, - 'file.hash.ssdeep': `${DEFAULT_INDICATOR_SOURCE_PATH}.file.hash.ssdeep`, - 'source.ip': `${DEFAULT_INDICATOR_SOURCE_PATH}.ip`, - 'destination.ip': `${DEFAULT_INDICATOR_SOURCE_PATH}.ip`, - 'url.full': `${DEFAULT_INDICATOR_SOURCE_PATH}.url.full`, - 'registry.path': `${DEFAULT_INDICATOR_SOURCE_PATH}.registry.path`, + 'file.hash.md5': 'threatintel.indicator.file.hash.md5', + 'file.hash.sha1': 'threatintel.indicator.file.hash.sha1', + 'file.hash.sha256': 'threatintel.indicator.file.hash.sha256', + 'file.pe.imphash': 'threatintel.indicator.file.pe.imphash', + 'file.elf.telfhash': 'threatintel.indicator.file.elf.telfhash', + 'file.hash.ssdeep': 'threatintel.indicator.file.hash.ssdeep', + 'source.ip': 'threatintel.indicator.ip', + 'destination.ip': 'threatintel.indicator.ip', + 'url.full': 'threatintel.indicator.url.full', + 'registry.path': 'threatintel.indicator.registry.path', }; export const DEFAULT_EVENT_ENRICHMENT_FROM = 'now-30d'; export const DEFAULT_EVENT_ENRICHMENT_TO = 'now'; export const CTI_DATASET_KEY_MAP: { [key: string]: string } = { - 'Abuse URL': 'ti_abusech.url', - 'Abuse Malware': 'ti_abusech.malware', - 'Malware Bazaar': 'ti_abusech.malwarebazaar', - 'AlienVault OTX': 'ti_otx.threat', - 'Anomali Limo': 'ti_anomali.limo', - 'Anomali ThreatStream': 'ti_anomali.threatstream', - MISP: 'ti_misp.threat', + 'Abuse URL': 'threatintel.abuseurl', + 'Abuse Malware': 'threatintel.abusemalware', + 'AlienVault OTX': 'threatintel.otx', + Anomali: 'threatintel.anomali', + 'Malware Bazaar': 'threatintel.malwarebazaar', + MISP: 'threatintel.misp', + 'Recorded Future': 'threatintel.recordedfuture', }; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_actions.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_actions.ts index 5cc564ee3d41d..b4cc8e953c49d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_actions.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_actions.ts @@ -66,10 +66,11 @@ export const indexFleetActionsForHost = async ( const actionResponse = fleetActionGenerator.generateResponse({ action_id: action.action_id, agent_id: agentId, - action_data: { - ...action.data, - // add ack to 4/5th of fleet response - ack: fleetActionGenerator.randomFloat() < 0.8 ? true : undefined, + action_response: { + endpoint: { + // add ack to 4/5th of fleet response + ack: fleetActionGenerator.randomFloat() < 0.8 ? true : undefined, + }, }, }); diff --git a/x-pack/plugins/security_solution/common/endpoint/types/actions.ts b/x-pack/plugins/security_solution/common/endpoint/types/actions.ts index d7ad417fc7d3f..2ac4c9e772ded 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/actions.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/actions.ts @@ -64,7 +64,12 @@ export interface LogsEndpointActionResponse { export interface EndpointActionData { command: ISOLATION_ACTIONS; comment?: string; - ack?: boolean; +} + +export interface FleetActionResponseData { + endpoint?: { + ack?: boolean; + }; } export interface EndpointAction { @@ -93,6 +98,8 @@ export interface EndpointActionResponse { completed_at: string; error?: string; action_data: EndpointActionData; + /* Response data from the Endpoint process -- only present in 7.16+ */ + action_response?: FleetActionResponseData; } export interface EndpointActivityLogAction { diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.mock.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.mock.ts index 4656a200ccac6..7898962b1a72d 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.mock.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.mock.ts @@ -52,29 +52,29 @@ export const buildEventEnrichmentRawResponseMock = (): IEsSearchResponse => ({ _score: 6.0637846, fields: { 'event.category': ['threat'], - 'threat.indicator.file.type': ['html'], + 'threatintel.indicator.file.type': ['html'], 'related.hash': [ '5529de7b60601aeb36f57824ed0e1ae8', '15b012e6f626d0f88c2926d2bf4ca394d7b8ee07cc06d2ec05ea76bed3e8a05e', '768:NXSFGJ/ooP6FawrB7Bo1MWnF/jRmhJImp:1SFXIqBo1Mwj2p', ], - 'threat.indicator.first_seen': ['2021-05-28T18:33:29.000Z'], - 'threat.indicator.file.hash.tlsh': [ + 'threatintel.indicator.first_seen': ['2021-05-28T18:33:29.000Z'], + 'threatintel.indicator.file.hash.tlsh': [ 'FFB20B82F6617061C32784E2712F7A46B179B04FD1EA54A0F28CD8E9CFE4CAA1617F1C', ], 'service.type': ['threatintel'], - 'threat.indicator.file.hash.ssdeep': [ + 'threatintel.indicator.file.hash.ssdeep': [ '768:NXSFGJ/ooP6FawrB7Bo1MWnF/jRmhJImp:1SFXIqBo1Mwj2p', ], 'agent.type': ['filebeat'], 'event.module': ['threatintel'], - 'threat.indicator.type': ['file'], + 'threatintel.indicator.type': ['file'], 'agent.name': ['rylastic.local'], - 'threat.indicator.file.hash.sha256': [ + 'threatintel.indicator.file.hash.sha256': [ '15b012e6f626d0f88c2926d2bf4ca394d7b8ee07cc06d2ec05ea76bed3e8a05e', ], 'event.kind': ['enrichment'], - 'threat.indicator.file.hash.md5': ['5529de7b60601aeb36f57824ed0e1ae8'], + 'threatintel.indicator.file.hash.md5': ['5529de7b60601aeb36f57824ed0e1ae8'], 'fileset.name': ['abusemalware'], 'input.type': ['httpjson'], 'agent.hostname': ['rylastic.local'], @@ -89,9 +89,9 @@ export const buildEventEnrichmentRawResponseMock = (): IEsSearchResponse => ({ 'event.type': ['indicator'], 'event.created': ['2021-05-28T18:33:52.993Z'], 'agent.ephemeral_id': ['d6b14f65-5bf3-430d-8315-7b5613685979'], - 'threat.indicator.file.size': [24738], + 'threatintel.indicator.file.size': [24738], 'agent.version': ['8.0.0'], - 'event.dataset': ['ti_abusech.malware'], + 'event.dataset': ['threatintel.abusemalware'], }, matched_queries: ['file.hash.md5'], }, @@ -113,7 +113,7 @@ export const buildEventEnrichmentMock = ( 'ecs.version': ['1.6.0'], 'event.category': ['threat'], 'event.created': ['2021-05-28T18:33:52.993Z'], - 'event.dataset': ['ti_abusech.malware'], + 'event.dataset': ['threatintel.abusemalware'], 'event.ingested': ['2021-05-28T18:33:55.086Z'], 'event.kind': ['enrichment'], 'event.module': ['threatintel'], @@ -135,18 +135,20 @@ export const buildEventEnrichmentMock = ( ], 'service.type': ['threatintel'], tags: ['threatintel-abusemalware', 'forwarded'], - 'threat.indicator.file.hash.md5': ['5529de7b60601aeb36f57824ed0e1ae8'], - 'threat.indicator.file.hash.sha256': [ + 'threatintel.indicator.file.hash.md5': ['5529de7b60601aeb36f57824ed0e1ae8'], + 'threatintel.indicator.file.hash.sha256': [ '15b012e6f626d0f88c2926d2bf4ca394d7b8ee07cc06d2ec05ea76bed3e8a05e', ], - 'threat.indicator.file.hash.ssdeep': ['768:NXSFGJ/ooP6FawrB7Bo1MWnF/jRmhJImp:1SFXIqBo1Mwj2p'], - 'threat.indicator.file.hash.tlsh': [ + 'threatintel.indicator.file.hash.ssdeep': [ + '768:NXSFGJ/ooP6FawrB7Bo1MWnF/jRmhJImp:1SFXIqBo1Mwj2p', + ], + 'threatintel.indicator.file.hash.tlsh': [ 'FFB20B82F6617061C32784E2712F7A46B179B04FD1EA54A0F28CD8E9CFE4CAA1617F1C', ], - 'threat.indicator.file.size': [24738], - 'threat.indicator.file.type': ['html'], - 'threat.indicator.first_seen': ['2021-05-28T18:33:29.000Z'], - 'threat.indicator.type': ['file'], + 'threatintel.indicator.file.size': [24738], + 'threatintel.indicator.file.type': ['html'], + 'threatintel.indicator.first_seen': ['2021-05-28T18:33:29.000Z'], + 'threatintel.indicator.type': ['file'], ...overrides, }); diff --git a/x-pack/plugins/security_solution/cypress/README.md b/x-pack/plugins/security_solution/cypress/README.md index b500091aacc2d..4d9f5d40ffe3e 100644 --- a/x-pack/plugins/security_solution/cypress/README.md +++ b/x-pack/plugins/security_solution/cypress/README.md @@ -357,7 +357,7 @@ Note that the command will create the folder if it does not exist. ### Using an archive from within the Cypress tests -Task [cypress/tasks/es_archiver.ts](https://github.com/elastic/kibana/blob/master/x-pack/plugins/security_solution/cypress/tasks/es_archiver.ts) provides helpers such as `esArchiverLoad` and `esArchiverUnload` by means of `es_archiver`'s CLI. +Task [cypress/tasks/es_archiver.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/cypress/tasks/es_archiver.ts) provides helpers such as `esArchiverLoad` and `esArchiverUnload` by means of `es_archiver`'s CLI. Because of `cy.exec`, used to invoke `es_archiver`, it's necessary to override its environment with `NODE_TLS_REJECT_UNAUTHORIZED=1`. It indeed would inject `NODE_TLS_REJECT_UNAUTHORIZED=0` and make `es_archive` otherwise abort with the following warning if used over https: @@ -374,7 +374,7 @@ Incorrect handling of the above points might result in false positives, in that #### Remote data loading -Helpers `esArchiverCCSLoad` and `esArchiverCCSUnload` are provided by [cypress/tasks/es_archiver.ts](https://github.com/elastic/kibana/blob/master/x-pack/plugins/security_solution/cypress/tasks/es_archiver.ts): +Helpers `esArchiverCCSLoad` and `esArchiverCCSUnload` are provided by [cypress/tasks/es_archiver.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/cypress/tasks/es_archiver.ts): ```javascript import { esArchiverCCSLoad, esArchiverCCSUnload } from '../../tasks/es_archiver'; diff --git a/x-pack/plugins/security_solution/cypress/fixtures/7_15_timeline.ndjson b/x-pack/plugins/security_solution/cypress/fixtures/7_15_timeline.ndjson new file mode 100644 index 0000000000000..7366889fb1082 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/fixtures/7_15_timeline.ndjson @@ -0,0 +1 @@ +{"savedObjectId":"53f99cf0-2b48-11ec-abd7-4702b60533ad","version":"WzExNDEyMSwxXQ==","columns":[{"columnHeaderType":"not-filtered","id":"@timestamp","type":"number"},{"columnHeaderType":"not-filtered","id":"message"},{"columnHeaderType":"not-filtered","id":"event.category"},{"columnHeaderType":"not-filtered","id":"event.action"},{"columnHeaderType":"not-filtered","id":"host.name"},{"columnHeaderType":"not-filtered","id":"source.ip"},{"columnHeaderType":"not-filtered","id":"destination.ip"},{"columnHeaderType":"not-filtered","id":"user.name"}],"dataProviders":[{"excluded":false,"and":[],"kqlQuery":"","name":"source.ip: 127.0.0.1","queryMatch":{"field":"source.ip","value":"127.0.0.1","operator":":"},"id":"formatted-ip-data-provider-plain-column-renderer-formatted-field-value-timeline-1-query-source_ip-127_0_0_1-df246068f5258a4168f6dd37eecf8c8575d4821ce459d7060ab7be66e6768d52","enabled":true}],"description":"This a timeline created on 7.15 version","eventType":"all","filters":[],"kqlMode":"filter","timelineType":"default","kqlQuery":{"filterQuery":{"serializedQuery":"{\"bool\":{\"should\":[{\"match_phrase\":{\"host.name\":\"security-solution.local\"}}],\"minimum_should_match\":1}}","kuery":{"expression":"host.name:\"security-solution.local\" ","kind":"kuery"}}},"title":"7.15 Timeline","sort":[{"columnType":"number","sortDirection":"desc","columnId":"@timestamp"}],"templateTimelineId":null,"templateTimelineVersion":null,"dateRange":{"start":"2020-10-10T22:00:00.000Z","end":"2030-10-11T15:13:15.851Z"},"indexNames":["auditbeat-*",".siem-signals-default"],"eqlOptions":{"tiebreakerField":"","size":100,"query":"","eventCategoryField":"event.category","timestampField":"@timestamp"},"savedQueryId":null,"favorite":[{"favoriteDate":1633965242498,"keySearch":"MTY3Mzk5OTM3OQ==","fullName":"glo@email.com","userName":"1673999379"}],"created":1634035018815,"createdBy":"elastic","updated":1634035018815,"updatedBy":"elastic","eventNotes":[],"globalNotes":[{"noteId":"7aa03750-2b49-11ec-abd7-4702b60533ad","version":"WzExNDI3NiwxXQ==","note":"This is a note","timelineId":"53f99cf0-2b48-11ec-abd7-4702b60533ad","created":1634035513157,"createdBy":"1673999379","updated":1634035513157,"updatedBy":"1673999379"}],"pinnedEventIds":["df246068f5258a4168f6dd37eecf8c8575d4821ce459d7060ab7be66e6768d52"]} diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/cti_enrichments.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/cti_enrichments.spec.ts index f15e7adbbca44..e7fbc82c5a485 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/cti_enrichments.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/cti_enrichments.spec.ts @@ -93,7 +93,7 @@ describe('CTI Enrichment', () => { atomic: 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', field: 'myhash.mysha256', id: '84cf452c1e0375c3d4412cb550bd1783358468a3b3b777da4829d72c7d6fb74f', - index: 'logs-ti_abusech.malware', + index: 'filebeat-7.12.0-2021.03.10-000001', type: 'indicator_match_rule', }, }, @@ -136,7 +136,7 @@ describe('CTI Enrichment', () => { field: 'matched.id', value: '84cf452c1e0375c3d4412cb550bd1783358468a3b3b777da4829d72c7d6fb74f', }, - { field: 'matched.index', value: 'logs-ti_abusech.malware' }, + { field: 'matched.index', value: 'filebeat-7.12.0-2021.03.10-000001' }, { field: 'matched.type', value: 'indicator_match_rule' }, ]; diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts index 002aa0bbc2b1e..84ad93fa08943 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts @@ -8,7 +8,7 @@ import { getException } from '../../objects/exception'; import { getNewRule } from '../../objects/rule'; -import { ALERTS_COUNT, NUMBER_OF_ALERTS } from '../../screens/alerts'; +import { ALERTS_COUNT, EMPTY_ALERT_TABLE, NUMBER_OF_ALERTS } from '../../screens/alerts'; import { RULE_STATUS } from '../../screens/create_new_rule'; import { @@ -31,13 +31,12 @@ import { removeException, waitForTheRuleToBeExecuted, } from '../../tasks/rule_details'; -import { refreshPage } from '../../tasks/security_header'; import { ALERTS_URL } from '../../urls/navigation'; import { cleanKibana } from '../../tasks/common'; describe('From alert', () => { - const NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS = '1'; + const NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS = '1 alert'; beforeEach(() => { cleanKibana(); @@ -53,7 +52,6 @@ describe('From alert', () => { activatesRule(); waitForTheRuleToBeExecuted(); waitForAlertsToPopulate(); - refreshPage(); cy.get(ALERTS_COUNT).should('exist'); cy.get(NUMBER_OF_ALERTS).should('have.text', NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS); @@ -64,36 +62,30 @@ describe('From alert', () => { esArchiverUnload('auditbeat_for_exceptions2'); }); - // TODO: Unskip the test when `https://github.com/elastic/kibana/issues/108244` it is fixed - it.skip('Creates an exception and deletes it', () => { + it('Creates an exception and deletes it', () => { addExceptionFromFirstAlert(); addsException(getException()); esArchiverLoad('auditbeat_for_exceptions2'); - cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', '0 alerts'); + cy.get(EMPTY_ALERT_TABLE).should('exist'); goToClosedAlerts(); - refreshPage(); cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alerts`); + cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS}`); goToOpenedAlerts(); waitForTheRuleToBeExecuted(); - refreshPage(); - cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', '0 alerts'); + cy.get(EMPTY_ALERT_TABLE).should('exist'); goToExceptionsTab(); removeException(); goToAlertsTab(); waitForTheRuleToBeExecuted(); waitForAlertsToPopulate(); - refreshPage(); cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alerts`); + cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS}`); }); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts index c4e1d882d1853..ea6b6cf0186b4 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts @@ -8,7 +8,7 @@ import { getException } from '../../objects/exception'; import { getNewRule } from '../../objects/rule'; -import { ALERTS_COUNT, NUMBER_OF_ALERTS } from '../../screens/alerts'; +import { ALERTS_COUNT, EMPTY_ALERT_TABLE, NUMBER_OF_ALERTS } from '../../screens/alerts'; import { RULE_STATUS } from '../../screens/create_new_rule'; import { @@ -54,7 +54,7 @@ describe('From rule', () => { refreshPage(); cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alerts`); + cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alert`); }); afterEach(() => { @@ -62,40 +62,32 @@ describe('From rule', () => { esArchiverUnload('auditbeat_for_exceptions2'); }); - // TODO: Unskip the test when `https://github.com/elastic/kibana/issues/108244` it is fixed - it.skip('Creates an exception and deletes it', () => { + it('Creates an exception and deletes it', () => { goToExceptionsTab(); addsExceptionFromRuleSettings(getException()); esArchiverLoad('auditbeat_for_exceptions2'); waitForTheRuleToBeExecuted(); goToAlertsTab(); - refreshPage(); - cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', '0 alerts'); + cy.get(EMPTY_ALERT_TABLE).should('exist'); goToClosedAlerts(); - refreshPage(); cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alerts`); + cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alert`); goToOpenedAlerts(); waitForTheRuleToBeExecuted(); - refreshPage(); - cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', '0 alerts'); + cy.get(EMPTY_ALERT_TABLE).should('exist'); goToExceptionsTab(); removeException(); - refreshPage(); goToAlertsTab(); waitForTheRuleToBeExecuted(); waitForAlertsToPopulate(); - refreshPage(); cy.get(ALERTS_COUNT).should('exist'); - cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alerts`); + cy.get(NUMBER_OF_ALERTS).should('have.text', `${NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS} alert`); }); }); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index ae04e20dfe86e..5be1b69f148b4 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -109,7 +109,7 @@ export const getIndexPatterns = (): string[] => [ 'winlogbeat-*', ]; -export const getThreatIndexPatterns = (): string[] => ['logs-ti_*']; +export const getThreatIndexPatterns = (): string[] => ['filebeat-*']; const getMitre1 = (): Mitre => ({ tactic: `${getMockThreatData().tactic.name} (${getMockThreatData().tactic.id})`, @@ -400,7 +400,7 @@ export const getNewThreatIndicatorRule = (): ThreatIndicatorRule => ({ lookBack: getLookBack(), indicatorIndexPattern: ['filebeat-*'], indicatorMappingField: 'myhash.mysha256', - indicatorIndexField: 'threat.indicator.file.hash.sha256', + indicatorIndexField: 'threatintel.indicator.file.hash.sha256', type: 'file', atomic: 'a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3', timeline: getIndicatorMatchTimelineTemplate(), diff --git a/x-pack/plugins/security_solution/cypress/screens/alerts.ts b/x-pack/plugins/security_solution/cypress/screens/alerts.ts index c9660668f488b..b77e64e64a3f3 100644 --- a/x-pack/plugins/security_solution/cypress/screens/alerts.ts +++ b/x-pack/plugins/security_solution/cypress/screens/alerts.ts @@ -33,6 +33,8 @@ export const CLOSE_SELECTED_ALERTS_BTN = '[data-test-subj="close-alert-status"]' export const CLOSED_ALERTS_FILTER_BTN = '[data-test-subj="closedAlerts"]'; +export const EMPTY_ALERT_TABLE = '[data-test-subj="tGridEmptyState"]'; + export const EXPAND_ALERT_BTN = '[data-test-subj="expand-event"]'; export const ACKNOWLEDGED_ALERTS_FILTER_BTN = '[data-test-subj="acknowledgedAlerts"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/timeline.ts b/x-pack/plugins/security_solution/cypress/screens/timeline.ts index bc3a4282df1c9..f7495f3730dc4 100644 --- a/x-pack/plugins/security_solution/cypress/screens/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/screens/timeline.ts @@ -24,6 +24,8 @@ export const CASE = (id: string) => { return `[data-test-subj="cases-table-row-${id}"]`; }; +export const CELL = '[data-test-subj="statefulCell"]'; + export const CLOSE_TIMELINE_BTN = '[data-test-subj="close-timeline"]'; export const COMBO_BOX = '.euiComboBoxOption__content'; @@ -34,13 +36,29 @@ export const CREATE_NEW_TIMELINE = '[data-test-subj="timeline-new"]'; export const CREATE_NEW_TIMELINE_TEMPLATE = '[data-test-subj="template-timeline-new"]'; +export const DATA_PROVIDERS = '.field-value'; + export const DATAGRID_HEADERS = '[data-test-subj="events-viewer-panel"] [data-test-subj^="dataGridHeaderCell-"]'; +export const DATE_PICKER_END = '[data-test-subj="superDatePickerendDatePopoverButton"]'; + +export const DATE_PICKER_START = '[data-test-subj="superDatePickerstartDatePopoverButton"]'; + +export const DELETE_TIMELINE_BTN = '[data-test-subj="delete-timeline"]'; + +export const DELETION_CONFIRMATION = '[data-test-subj="confirmModalConfirmButton"]'; + +export const DESTINATION_IP_KPI = '[data-test-subj="siem-timeline-destination-ip-kpi"]'; + export const FAVORITE_TIMELINE = '[data-test-subj="timeline-favorite-filled-star"]'; export const FIELD_BROWSER = '[data-test-subj="show-field-browser"]'; +export const GRAPH_TAB_BUTTON = '[data-test-subj="timelineTabs-graph"]'; + +export const HOST_KPI = '[data-test-subj="siem-timeline-host-kpi"]'; + export const ID_HEADER_FIELD = '[data-test-subj="timeline"] [data-test-subj="header-text-_id"]'; export const ID_TOGGLE_FIELD = '[data-test-subj="toggle-field-_id"]'; @@ -57,6 +75,10 @@ export const NOTE_CARD_CONTENT = '[data-test-subj="notes"]'; export const EVENT_NOTE = '[data-test-subj="timeline-notes-button-small"]'; +export const NOTE_DESCRIPTION = '[data-test-subj="note-preview-description"]'; + +export const NOTE_PREVIEW = '[data-test-subj^="note-preview"]'; + export const NOTES_TEXT_AREA = '[data-test-subj="add-a-note"] textarea'; export const NOTES_TAB_BUTTON = '[data-test-subj="timelineTabs-notes"]'; @@ -82,6 +104,10 @@ export const OPEN_TIMELINE_TEMPLATE_ICON = export const PIN_EVENT = '[data-test-subj="pin"]'; +export const PINNED_TAB_BUTTON = '[data-test-subj="timelineTabs-pinned"]'; + +export const PROCESS_KPI = '[data-test-subj="siem-timeline-process-kpi"'; + export const PROVIDER_BADGE = '[data-test-subj="providerBadge"]'; export const RESET_FIELDS = @@ -98,6 +124,8 @@ export const QUERY_TAB_BUTTON = '[data-test-subj="timelineTabs-query"]'; export const SERVER_SIDE_EVENT_COUNT = '[data-test-subj="server-side-event-count"]'; +export const SOURCE_IP_KPI = '[data-test-subj="siem-timeline-source-ip-kpi"]'; + export const STAR_ICON = '[data-test-subj="timeline-favorite-empty-star"]'; export const TIMELINE_CHANGES_IN_PROGRESS = '[data-test-subj="timeline"] .euiProgress'; @@ -227,3 +255,5 @@ export const TIMELINE_TAB_CONTENT_GRAPHS_NOTES = '[data-test-subj="timeline-tab-content-graph-notes"]'; export const TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN = '[data-test-subj="more-actions-@timestamp"]'; + +export const USER_KPI = '[data-test-subj="siem-timeline-user-kpi"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/timelines.ts b/x-pack/plugins/security_solution/cypress/screens/timelines.ts index 92522c44dd8e4..5e64e4fbb5ece 100644 --- a/x-pack/plugins/security_solution/cypress/screens/timelines.ts +++ b/x-pack/plugins/security_solution/cypress/screens/timelines.ts @@ -7,8 +7,20 @@ export const BULK_ACTIONS = '[data-test-subj="utility-bar-action-button"]'; +export const EXPAND_NOTES_BTN = '[data-test-subj="expand-notes"]'; + export const EXPORT_TIMELINE_ACTION = '[data-test-subj="export-timeline-action"]'; +export const IMPORT_BTN = '.euiButton__text'; + +export const IMPORT_BTN_POSITION = 8; + +export const IMPORT_TIMELINE_BTN = '[data-test-subj="open-import-data-modal-btn"]'; + +export const INPUT_FILE = 'input[type=file]'; + +export const NOTE = '[data-test-subj^="note-preview-"]'; + export const TIMELINE = (id: string | undefined) => { if (id == null) { throw new TypeError('id should never be null or undefined'); @@ -20,6 +32,8 @@ export const TIMELINE_CHECKBOX = (id: string) => { return `[data-test-subj="checkboxSelectRow-${id}"]`; }; +export const TIMELINE_NAME = '[data-test-subj^=title]'; + export const TIMELINES_FAVORITE = '[data-test-subj="favorite-starFilled-star"]'; export const TIMELINES_DESCRIPTION = '[data-test-subj="description"]'; @@ -30,4 +44,6 @@ export const TIMELINES_PINNED_EVENT_COUNT = '[data-test-subj="pinned-event-count export const TIMELINES_TABLE = '[data-test-subj="timelines-table"]'; +export const TIMELINES_USERNAME = '[data-test-subj="username"]'; + export const REFRESH_BUTTON = '[data-test-subj="refreshButton-linkIcon"]'; diff --git a/x-pack/plugins/security_solution/cypress/support/commands.js b/x-pack/plugins/security_solution/cypress/support/commands.js index f0bfad033cbba..eee6d2a147994 100644 --- a/x-pack/plugins/security_solution/cypress/support/commands.js +++ b/x-pack/plugins/security_solution/cypress/support/commands.js @@ -31,6 +31,8 @@ // -- This is will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) +import 'cypress-file-upload'; + Cypress.Commands.add( 'attachFile', { diff --git a/x-pack/plugins/security_solution/cypress/tasks/alerts.ts b/x-pack/plugins/security_solution/cypress/tasks/alerts.ts index 067c9957189b9..220c0fbdaa4cf 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/alerts.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/alerts.ts @@ -34,7 +34,7 @@ import { } from '../screens/alerts_details'; export const addExceptionFromFirstAlert = () => { - cy.get(TIMELINE_CONTEXT_MENU_BTN).first().click(); + cy.get(TIMELINE_CONTEXT_MENU_BTN).first().click({ force: true }); cy.get(ADD_EXCEPTION_BTN).click(); }; diff --git a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts index c7cb56c89e9df..6841a9afdc42b 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/timeline.ts @@ -22,6 +22,8 @@ import { COMBO_BOX, COMBO_BOX_INPUT, CREATE_NEW_TIMELINE, + DELETE_TIMELINE_BTN, + DELETION_CONFIRMATION, FIELD_BROWSER, ID_HEADER_FIELD, ID_TOGGLE_FIELD, @@ -66,6 +68,7 @@ import { TIMELINE_COLLAPSED_ITEMS_BTN, TIMELINE_TAB_CONTENT_EQL, TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN, + PINNED_TAB_BUTTON, } from '../screens/timeline'; import { REFRESH_BUTTON, TIMELINE } from '../screens/timelines'; @@ -128,6 +131,15 @@ export const goToQueryTab = () => { .should('have.class', 'euiTab-isSelected'); }; +export const goToPinnedTab = () => { + cy.root() + .pipe(($el) => { + $el.find(PINNED_TAB_BUTTON).trigger('click'); + return $el.find(PINNED_TAB_BUTTON); + }) + .should('have.class', 'euiTab-isSelected'); +}; + export const addNotesToTimeline = (notes: string) => { goToNotesTab().then(() => { cy.get(NOTES_TAB_BUTTON) @@ -243,6 +255,12 @@ export const expandFirstTimelineEventDetails = () => { cy.get(TOGGLE_TIMELINE_EXPAND_EVENT).first().click({ force: true }); }; +export const deleteTimeline = () => { + cy.get(TIMELINE_COLLAPSED_ITEMS_BTN).click(); + cy.get(DELETE_TIMELINE_BTN).click(); + cy.get(DELETION_CONFIRMATION).click(); +}; + export const markAsFavorite = () => { const click = ($el: Cypress.ObjectLike) => cy.wrap($el).click(); cy.get(STAR_ICON).should('be.visible').pipe(click); diff --git a/x-pack/plugins/security_solution/cypress/tasks/timelines.ts b/x-pack/plugins/security_solution/cypress/tasks/timelines.ts index a135ce8c90510..07c752a191968 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/timelines.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/timelines.ts @@ -9,20 +9,42 @@ import { LOADING_INDICATOR } from '../screens/security_header'; import { TIMELINE_CHECKBOX, BULK_ACTIONS, + EXPAND_NOTES_BTN, EXPORT_TIMELINE_ACTION, + IMPORT_BTN, + IMPORT_BTN_POSITION, + IMPORT_TIMELINE_BTN, + INPUT_FILE, TIMELINES_TABLE, TIMELINE, + TIMELINE_NAME, } from '../screens/timelines'; +export const expandNotes = () => { + cy.get(EXPAND_NOTES_BTN).click(); +}; + export const exportTimeline = (timelineId: string) => { cy.get(TIMELINE_CHECKBOX(timelineId)).click({ force: true }); cy.get(BULK_ACTIONS).click({ force: true }); cy.get(EXPORT_TIMELINE_ACTION).click(); }; -export const openTimeline = (id: string) => { +export const importTimeline = (timeline: string) => { + cy.get(IMPORT_TIMELINE_BTN).click(); + cy.get(INPUT_FILE).should('exist'); + cy.get(INPUT_FILE).trigger('click', { force: true }).attachFile(timeline).trigger('change'); + cy.get(IMPORT_BTN).eq(IMPORT_BTN_POSITION).click({ force: true }); + cy.get(INPUT_FILE).should('not.exist'); +}; + +export const openTimeline = (id?: string) => { const click = ($el: Cypress.ObjectLike) => cy.wrap($el).click(); - cy.get(TIMELINE(id)).should('be.visible').pipe(click); + if (id) { + cy.get(TIMELINE(id)).should('be.visible').pipe(click); + } else { + cy.get(TIMELINE_NAME).should('be.visible').pipe(click); + } }; export const waitForTimelinesPanelToBeLoaded = () => { diff --git a/x-pack/plugins/security_solution/cypress/tsconfig.json b/x-pack/plugins/security_solution/cypress/tsconfig.json index a779c3f48d346..6fdc868429138 100644 --- a/x-pack/plugins/security_solution/cypress/tsconfig.json +++ b/x-pack/plugins/security_solution/cypress/tsconfig.json @@ -12,6 +12,7 @@ "outDir": "target/types", "types": [ "cypress", + "cypress-file-upload", "cypress-pipe", "node", "resize-observer-polyfill", diff --git a/x-pack/plugins/security_solution/cypress/upgrade_integration/import_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/upgrade_integration/import_timeline.spec.ts new file mode 100644 index 0000000000000..3ce3937b3e4b2 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/upgrade_integration/import_timeline.spec.ts @@ -0,0 +1,205 @@ +/* + * Copyright 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 { + CELL, + DATA_PROVIDERS, + DATE_PICKER_END, + DATE_PICKER_START, + DESTINATION_IP_KPI, + GRAPH_TAB_BUTTON, + HOST_KPI, + QUERY_TAB_BUTTON, + NOTE_DESCRIPTION, + NOTE_PREVIEW, + NOTES_TAB_BUTTON, + PINNED_TAB_BUTTON, + PROCESS_KPI, + SOURCE_IP_KPI, + TIMELINE_CORRELATION_TAB, + TIMELINE_CORRELATION_INPUT, + TIMELINE_DESCRIPTION, + TIMELINE_QUERY, + TIMELINE_TITLE, + USER_KPI, +} from '../screens/timeline'; +import { + NOTE, + TIMELINES_USERNAME, + TIMELINE_NAME, + TIMELINES_DESCRIPTION, + TIMELINES_NOTES_COUNT, + TIMELINES_PINNED_EVENT_COUNT, +} from '../screens/timelines'; + +import { loginAndWaitForPageWithoutDateRange } from '../tasks/login'; +import { + closeTimeline, + deleteTimeline, + goToCorrelationTab, + goToNotesTab, + goToPinnedTab, +} from '../tasks/timeline'; +import { expandNotes, importTimeline, openTimeline } from '../tasks/timelines'; + +import { TIMELINES_URL } from '../urls/navigation'; + +const timeline = '7_15_timeline.ndjson'; +const username = 'elastic'; + +const timelineDetails = { + dateStart: 'Oct 11, 2020 @ 00:00:00.000', + dateEnd: 'Oct 11, 2030 @ 17:13:15.851', + queryTab: 'Query2', + correlationTab: 'Correlation', + analyzerTab: 'Analyzer', + notesTab: 'Notes2', + pinnedTab: 'Pinned1', +}; + +const detectionAlert = { + timestamp: 'Oct 7, 2021 @ 11:14:10.888', + message: '—', + eventCategory: 'file', + eventAction: 'initial_scan', + hostName: 'security-solution.local', + sourceIp: '127.0.0.1', + destinationIp: '127.0.0.2', + userName: 'Security Solution', +}; + +const event = { + timestamp: 'Oct 6, 2021 @ 17:09:29.438', + message: '—', + eventCategory: 'file', + eventAction: 'initial_scan', + hostName: 'security-solution.local', + sourceIp: '127.0.0.1', + destinationIp: '127.0.0.2', + userName: 'Security Solution', +}; + +describe('Import timeline after upgrade', () => { + before(() => { + loginAndWaitForPageWithoutDateRange(TIMELINES_URL); + importTimeline(timeline); + }); + + after(() => { + closeTimeline(); + deleteTimeline(); + }); + + it('Displays the correct timeline details on the timelines page', () => { + cy.readFile(`cypress/fixtures/${timeline}`).then((file) => { + const timelineJson = JSON.parse(file); + const regex = new RegExp( + `\\S${timelineJson.globalNotes[0].createdBy}added a note\\d* \\w* ago${timelineJson.globalNotes[0].createdBy} added a note${timelineJson.globalNotes[0].note}` + ); + + cy.get(TIMELINE_NAME).should('have.text', timelineJson.title); + cy.get(TIMELINES_DESCRIPTION).should('have.text', timelineJson.description); + cy.get(TIMELINES_USERNAME).should('have.text', username); + cy.get(TIMELINES_NOTES_COUNT).should('have.text', timelineJson.globalNotes.length.toString()); + cy.get(TIMELINES_PINNED_EVENT_COUNT).should( + 'have.text', + timelineJson.pinnedEventIds.length.toString() + ); + + expandNotes(); + + cy.get(NOTE).invoke('text').should('match', regex); + }); + }); + + it('Displays the correct timeline details inside the query tab', () => { + openTimeline(); + + cy.readFile(`cypress/fixtures/${timeline}`).then((file) => { + const timelineJson = JSON.parse(file); + + cy.get(TIMELINE_TITLE).should('have.text', timelineJson.title); + cy.get(TIMELINE_DESCRIPTION).should('have.text', timelineJson.description); + cy.get(DATA_PROVIDERS).should('have.length', timelineJson.dataProviders.length.toString()); + cy.get(DATA_PROVIDERS) + .invoke('text') + .then((value) => { + expect(value.replace(/"/g, '')).to.eq(timelineJson.dataProviders[0].name); + }); + cy.get(PROCESS_KPI).should('contain', '0'); + cy.get(USER_KPI).should('contain', '0'); + cy.get(HOST_KPI).should('contain', '1'); + cy.get(SOURCE_IP_KPI).should('contain', '1'); + cy.get(DESTINATION_IP_KPI).should('contain', '1'); + cy.get(DATE_PICKER_START).should('contain', timelineDetails.dateStart); + cy.get(DATE_PICKER_END).should('contain', timelineDetails.dateEnd); + cy.get(TIMELINE_QUERY).should( + 'have.text', + timelineJson.kqlQuery.filterQuery.kuery.expression + ); + cy.get(QUERY_TAB_BUTTON).should('have.text', timelineDetails.queryTab); + cy.get(TIMELINE_CORRELATION_TAB).should('have.text', timelineDetails.correlationTab); + cy.get(GRAPH_TAB_BUTTON).should('have.text', timelineDetails.analyzerTab).and('be.disabled'); + cy.get(NOTES_TAB_BUTTON).should('have.text', timelineDetails.notesTab); + cy.get(PINNED_TAB_BUTTON).should('have.text', timelineDetails.pinnedTab); + + cy.get(CELL).eq(0).should('contain', detectionAlert.timestamp); + cy.get(CELL).eq(1).should('contain', detectionAlert.message); + cy.get(CELL).eq(2).should('contain', detectionAlert.eventCategory); + cy.get(CELL).eq(3).should('contain', detectionAlert.eventAction); + cy.get(CELL).eq(4).should('contain', detectionAlert.hostName); + cy.get(CELL).eq(5).should('contain', detectionAlert.sourceIp); + cy.get(CELL).eq(6).should('contain', detectionAlert.destinationIp); + cy.get(CELL).eq(7).should('contain', detectionAlert.userName); + + cy.get(CELL).eq(8).should('contain', event.timestamp); + cy.get(CELL).eq(9).should('contain', event.message); + cy.get(CELL).eq(10).should('contain', event.eventCategory); + cy.get(CELL).eq(11).should('contain', event.eventAction); + cy.get(CELL).eq(12).should('contain', event.hostName); + cy.get(CELL).eq(13).should('contain', event.sourceIp); + cy.get(CELL).eq(14).should('contain', event.destinationIp); + cy.get(CELL).eq(15).should('contain', event.userName); + }); + }); + + it('Displays the correct timeline details inside the query tab', () => { + goToCorrelationTab(); + + cy.get(TIMELINE_CORRELATION_INPUT).should('be.empty'); + }); + + it('Displays the correct timeline details inside the notes tab', () => { + goToNotesTab(); + + cy.readFile(`cypress/fixtures/${timeline}`).then((file) => { + const timelineJson = JSON.parse(file); + const descriptionRegex = new RegExp( + `\\S${username}added description\\d* \\w* ago${timelineJson.description}` + ); + const noteRegex = new RegExp( + `\\S${timelineJson.globalNotes[0].createdBy}added a note\\d* \\w* ago${timelineJson.globalNotes[0].createdBy} added a note${timelineJson.globalNotes[0].note}` + ); + + cy.get(NOTE_DESCRIPTION).invoke('text').should('match', descriptionRegex); + cy.get(NOTE_PREVIEW).invoke('text').should('match', noteRegex); + }); + }); + + it('Displays the correct timeline details inside the pinned tab', () => { + goToPinnedTab(); + + cy.get(CELL).eq(0).should('contain', detectionAlert.timestamp); + cy.get(CELL).eq(1).should('contain', detectionAlert.message); + cy.get(CELL).eq(2).should('contain', detectionAlert.eventCategory); + cy.get(CELL).eq(3).should('contain', detectionAlert.eventAction); + cy.get(CELL).eq(4).should('contain', detectionAlert.hostName); + cy.get(CELL).eq(5).should('contain', detectionAlert.sourceIp); + cy.get(CELL).eq(6).should('contain', detectionAlert.destinationIp); + cy.get(CELL).eq(7).should('contain', detectionAlert.userName); + }); +}); diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx index 85e41a5cc12ca..41e441fd4110f 100644 --- a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx @@ -23,7 +23,7 @@ import { ADD_DATA_PATH } from '../../../../common/constants'; import { isDetectionsPath } from '../../../../public/helpers'; const BUTTON_ADD_DATA = i18n.translate('xpack.securitySolution.globalHeader.buttonAddData', { - defaultMessage: 'Add data', + defaultMessage: 'Add integrations', }); /** diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index 5e2b7e27fb1e5..72a41acf1d456 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -6,7 +6,6 @@ */ import React, { useCallback } from 'react'; -import { EuiPanel } from '@elastic/eui'; import { getCaseDetailsUrl, getCaseUrl } from '../../../common/components/link_to'; import { useKibana } from '../../../common/lib/kibana'; @@ -40,25 +39,21 @@ export const Create = React.memo(() => { [navigateToApp, search] ); - return ( - - {cases.getCreateCase({ - onCancel: handleSetIsCancel, - onSuccess, - timelineIntegration: { - editor_plugins: { - parsingPlugin: timelineMarkdownPlugin.parser, - processingPluginRenderer: timelineMarkdownPlugin.renderer, - uiPlugin: timelineMarkdownPlugin.plugin, - }, - hooks: { - useInsertTimeline, - }, - }, - owner: [APP_ID], - })} - - ); + return cases.getCreateCase({ + onCancel: handleSetIsCancel, + onSuccess, + timelineIntegration: { + editor_plugins: { + parsingPlugin: timelineMarkdownPlugin.parser, + processingPluginRenderer: timelineMarkdownPlugin.renderer, + uiPlugin: timelineMarkdownPlugin.plugin, + }, + hooks: { + useInsertTimeline, + }, + }, + owner: [APP_ID], + }); }); Create.displayName = 'Create'; diff --git a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx index 4a59fe3fdcabd..933e890ea2d9f 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx @@ -47,7 +47,7 @@ export const CreateCasePage = React.memo(() => { return ( <> - + diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/__snapshots__/alert_summary_view.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/event_details/__snapshots__/alert_summary_view.test.tsx.snap index 772badd80ce53..d97208a500714 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/__snapshots__/alert_summary_view.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/event_details/__snapshots__/alert_summary_view.test.tsx.snap @@ -136,7 +136,7 @@ exports[`AlertSummaryView Behavior event code renders additional summary rows 1` class="euiTableCellContent flyoutOverviewDescription euiTableCellContent--overflowingContent" >
{ it('renders an anchor link for indicator.reference', () => { const enrichments = [ buildEventEnrichmentMock({ - 'threat.indicator.reference': ['http://foo.baz'], + 'threatintel.indicator.reference': ['http://foo.baz'], }), ]; const wrapper = mount( @@ -60,10 +60,10 @@ describe('ThreatDetailsView', () => { const existingEnrichment = buildEventEnrichmentMock({ 'indicator.first_seen': [mostRecentDate], }); - delete existingEnrichment['threat.indicator.first_seen']; + delete existingEnrichment['threatintel.indicator.first_seen']; const newEnrichment = buildEventEnrichmentMock({ 'matched.id': ['other.id'], - 'threat.indicator.first_seen': [olderDate], + 'threatintel.indicator.first_seen': [olderDate], }); const enrichments = [existingEnrichment, newEnrichment]; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx index f6c43da2da8ac..d703e736d8b61 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.test.tsx @@ -180,6 +180,12 @@ describe('FieldValueCell', () => { ); }); + test('it aligns items at the start of the group to prevent content from stretching (by default)', () => { + expect(screen.getByTestId(`event-field-${hostIpData.field}`)).toHaveClass( + 'euiFlexGroup--alignItemsFlexStart' + ); + }); + test('it renders link buttons for each of the host ip addresses', () => { expect(screen.getAllByRole('button').length).toBe(hostIpValues.length); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.tsx index dc6c84b8138fe..0685582b33882 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/field_value_cell.tsx @@ -37,6 +37,7 @@ export const FieldValueCell = React.memo( }: FieldValueCellProps) => { return ( { importComplete={jest.fn()} checkBoxLabel="checkBoxLabel" description="description" - errorMessage="errorMessage" + errorMessage={jest.fn()} failedDetailed={jest.fn()} importData={jest.fn()} showCheckBox={true} diff --git a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx index 4c3dc2a249b4f..5eeff40fe9ed6 100644 --- a/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/import_data_modal/index.tsx @@ -23,23 +23,16 @@ import React, { useCallback, useState } from 'react'; import { ImportDataResponse, ImportDataProps, - ImportRulesResponseError, - ImportResponseError, } from '../../../detections/containers/detection_engine/rules'; -import { - displayErrorToast, - displaySuccessToast, - useStateToaster, - errorToToaster, -} from '../toasters'; +import { useAppToasts } from '../../hooks/use_app_toasts'; import * as i18n from './translations'; interface ImportDataModalProps { checkBoxLabel: string; closeModal: () => void; description: string; - errorMessage: string; - failedDetailed: (id: string, statusCode: number, message: string) => string; + errorMessage: (totalCount: number) => string; + failedDetailed: (message: string) => string; importComplete: () => void; importData: (arg: ImportDataProps) => Promise; showCheckBox: boolean; @@ -50,12 +43,6 @@ interface ImportDataModalProps { title: string; } -const isImportRulesResponseError = ( - error: ImportRulesResponseError | ImportResponseError -): error is ImportRulesResponseError => { - return (error as ImportRulesResponseError).rule_id !== undefined; -}; - /** * Modal component for importing Rules from a json file */ @@ -77,7 +64,7 @@ export const ImportDataModalComponent = ({ const [selectedFiles, setSelectedFiles] = useState(null); const [isImporting, setIsImporting] = useState(false); const [overwrite, setOverwrite] = useState(false); - const [, dispatchToaster] = useStateToaster(); + const { addError, addSuccess } = useAppToasts(); const cleanupAndCloseModal = useCallback(() => { setIsImporting(false); @@ -97,31 +84,39 @@ export const ImportDataModalComponent = ({ signal: abortCtrl.signal, }); - // TODO: Improve error toast details for better debugging failed imports - // e.g. When success == true && success_count === 0 that means no rules were overwritten, etc if (importResponse.success) { - displaySuccessToast(successMessage(importResponse.success_count), dispatchToaster); + addSuccess(successMessage(importResponse.success_count)); } if (importResponse.errors.length > 0) { - const formattedErrors = importResponse.errors.map((e) => - failedDetailed( - isImportRulesResponseError(e) ? e.rule_id : e.id, - e.error.status_code, - e.error.message - ) + const formattedErrors = importResponse.errors.map((e) => failedDetailed(e.error.message)); + const error: Error & { raw_network_error?: object } = new Error( + formattedErrors.join('. ') ); - displayErrorToast(errorMessage, formattedErrors, dispatchToaster); + error.stack = undefined; + error.name = 'Network errors'; + error.raw_network_error = importResponse; + addError(error, { title: errorMessage(importResponse.errors.length) }); } importComplete(); cleanupAndCloseModal(); } catch (error) { cleanupAndCloseModal(); - errorToToaster({ title: errorMessage, error, dispatchToaster }); + addError(error, { title: errorMessage(1) }); } } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedFiles, overwrite]); + }, [ + selectedFiles, + overwrite, + addError, + addSuccess, + cleanupAndCloseModal, + errorMessage, + failedDetailed, + importComplete, + importData, + successMessage, + ]); const handleCloseModal = useCallback(() => { setSelectedFiles(null); diff --git a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx index 352fc95447822..591cba6b19381 100644 --- a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx @@ -7,6 +7,9 @@ import React from 'react'; import { mount } from 'enzyme'; +import { waitFor } from '@testing-library/react'; + +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { SourcererScopeName } from '../../store/sourcerer/model'; import { Sourcerer } from './index'; import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; @@ -19,8 +22,6 @@ import { TestProviders, } from '../../mock'; import { createStore, State } from '../../store'; -import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { waitFor } from '@testing-library/react'; const mockDispatch = jest.fn(); jest.mock('react-redux', () => { @@ -46,6 +47,7 @@ const mockOptions = [ const defaultProps = { scope: sourcererModel.SourcererScopeName.default, }; + describe('Sourcerer component', () => { beforeEach(() => { jest.clearAllMocks(); @@ -59,6 +61,34 @@ describe('Sourcerer component', () => { store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); }); + it('renders tooltip', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find('[data-test-subj="sourcerer-tooltip"]').prop('content')).toEqual( + mockOptions + .map((p) => p.label) + .sort() + .join(', ') + ); + }); + + it('renders popover button inside tooltip', () => { + const wrapper = mount( + + + + ); + + expect( + wrapper + .find('[data-test-subj="sourcerer-tooltip"] [data-test-subj="sourcerer-trigger"]') + .exists() + ).toBeTruthy(); + }); + // Using props callback instead of simulating clicks, // because EuiSelectable uses a virtualized list, which isn't easily testable via test subjects it('Mounts with all options selected', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx index 8d0bb6410651c..3e922176f9982 100644 --- a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx @@ -169,55 +169,62 @@ export const Sourcerer = React.memo(({ scope: scopeId } [isPopoverOpen, sourcererScope.selectedPatterns] ); + const buttonWithTooptip = useMemo(() => { + return tooltipContent ? ( + + {trigger} + + ) : ( + trigger + ); + }, [trigger, tooltipContent]); + return ( - - - - - <>{i18n.SELECT_INDEX_PATTERNS} - - - {i18n.INDEX_PATTERNS_SELECTION_LABEL} - - {comboBox} - - - - - {i18n.INDEX_PATTERNS_RESET} - - - - - {i18n.SAVE_INDEX_PATTERNS} - - - - - - + + + + <>{i18n.SELECT_INDEX_PATTERNS} + + + {i18n.INDEX_PATTERNS_SELECTION_LABEL} + + {comboBox} + + + + + {i18n.INDEX_PATTERNS_RESET} + + + + + {i18n.SAVE_INDEX_PATTERNS} + + + + + ); }); Sourcerer.displayName = 'Sourcerer'; diff --git a/x-pack/plugins/security_solution/public/common/utils/saved_query_services/index.tsx b/x-pack/plugins/security_solution/public/common/utils/saved_query_services/index.tsx index b15a466af4d79..a5c4d81b1728c 100644 --- a/x-pack/plugins/security_solution/public/common/utils/saved_query_services/index.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/saved_query_services/index.tsx @@ -15,14 +15,14 @@ import { useKibana } from '../../lib/kibana'; export const useSavedQueryServices = () => { const kibana = useKibana(); - const client = kibana.services.savedObjects.client; + const { http } = kibana.services; const [savedQueryService, setSavedQueryService] = useState( - createSavedQueryService(client) + createSavedQueryService(http) ); useEffect(() => { - setSavedQueryService(createSavedQueryService(client)); - }, [client]); + setSavedQueryService(createSavedQueryService(http)); + }, [http]); return savedQueryService; }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx index f64e279fb2755..d6b1afea98592 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx @@ -35,7 +35,7 @@ const getAlertsCountTableColumns = ( { field: 'key', name: selectedStackByOption, - truncateText: true, + truncateText: false, render: function DraggableStackOptionField(value: string) { return ( { describe('validateSingleAction', () => { it('should validate single action', async () => { - (isUuid as jest.Mock).mockReturnValue(true); (validateActionParams as jest.Mock).mockReturnValue([]); (validateMustache as jest.Mock).mockReturnValue([]); @@ -34,7 +33,6 @@ describe('stepRuleActions schema', () => { }); it('should validate single action with invalid mustache template', async () => { - (isUuid as jest.Mock).mockReturnValue(true); (validateActionParams as jest.Mock).mockReturnValue([]); (validateMustache as jest.Mock).mockReturnValue(['Message is not valid mustache template']); @@ -54,8 +52,7 @@ describe('stepRuleActions schema', () => { expect(errors[0]).toEqual('Message is not valid mustache template'); }); - it('should validate single action with incorrect id', async () => { - (isUuid as jest.Mock).mockReturnValue(false); + it('should validate single action with non-uuid formatted id', async () => { (validateMustache as jest.Mock).mockReturnValue([]); (validateActionParams as jest.Mock).mockReturnValue([]); @@ -68,8 +65,7 @@ describe('stepRuleActions schema', () => { }, actionTypeRegistry ); - expect(errors).toHaveLength(1); - expect(errors[0]).toEqual('No connector selected'); + expect(errors).toHaveLength(0); }); }); @@ -89,40 +85,8 @@ describe('stepRuleActions schema', () => { expect(result).toEqual(undefined); }); - it('should validate incorrect rule actions field', async () => { - (getActionTypeName as jest.Mock).mockReturnValue('Slack'); - const validator = validateRuleActionsField(actionTypeRegistry); - - const result = await validator({ - path: '', - value: [ - { - id: '3', - group: 'default', - actionTypeId: '.slack', - params: {}, - }, - ], - form: {} as FormHook, - formData: jest.fn(), - errors: [], - customData: { value: null, provider: () => Promise.resolve(null) }, - }); - - expect(result).toEqual({ - code: 'ERR_FIELD_FORMAT', - message: ` -**Slack:** -* No connector selected -`, - path: '', - }); - }); - it('should validate multiple incorrect rule actions field', async () => { - (isUuid as jest.Mock).mockReturnValueOnce(false); (getActionTypeName as jest.Mock).mockReturnValueOnce('Slack'); - (isUuid as jest.Mock).mockReturnValueOnce(true); (getActionTypeName as jest.Mock).mockReturnValueOnce('Pagerduty'); (validateActionParams as jest.Mock).mockReturnValue(['Summary is required']); (validateMustache as jest.Mock).mockReturnValue(['Component is not valid mustache template']); @@ -156,7 +120,8 @@ describe('stepRuleActions schema', () => { code: 'ERR_FIELD_FORMAT', message: ` **Slack:** -* No connector selected +* Summary is required +* Component is not valid mustache template **Pagerduty:** diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx index 58202929c49a3..955c357673689 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/schema.tsx @@ -20,17 +20,12 @@ import { ValidationError, } from '../../../../shared_imports'; import { ActionsStepRule } from '../../../pages/detection_engine/rules/types'; -import * as I18n from './translations'; -import { isUuid, getActionTypeName, validateMustache, validateActionParams } from './utils'; +import { getActionTypeName, validateMustache, validateActionParams } from './utils'; export const validateSingleAction = async ( actionItem: AlertAction, actionTypeRegistry: ActionTypeRegistryContract ): Promise => { - if (!isUuid(actionItem.id)) { - return [I18n.NO_CONNECTOR_SELECTED]; - } - const actionParamsErrors = await validateActionParams(actionItem, actionTypeRegistry); const mustacheErrors = validateMustache(actionItem.params); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.test.ts b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.test.ts index 7c4ea71c983c8..575791afd110b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.test.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.test.ts @@ -6,19 +6,9 @@ */ import { actionTypeRegistryMock } from '../../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; -import { isUuid, getActionTypeName, validateMustache, validateActionParams } from './utils'; +import { getActionTypeName, validateMustache, validateActionParams } from './utils'; describe('stepRuleActions utils', () => { - describe('isUuidv4', () => { - it('should validate proper uuid v4 value', () => { - expect(isUuid('817b8bca-91d1-4729-8ee1-3a83aaafd9d4')).toEqual(true); - }); - - it('should validate incorrect uuid v4 value', () => { - expect(isUuid('ad9d4')).toEqual(false); - }); - }); - describe('getActionTypeName', () => { it('should return capitalized action type name', () => { expect(getActionTypeName('.slack')).toEqual('Slack'); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts index 22363df5164a6..fc9562af83525 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_rule_actions/utils.ts @@ -14,10 +14,6 @@ import { } from '../../../../../../triggers_actions_ui/public'; import * as I18n from './translations'; -const UUID_REGEX = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; - -export const isUuid = (id: AlertAction['id']) => !!id.match(UUID_REGEX); - export const getActionTypeName = (actionTypeId: AlertAction['actionTypeId']) => { if (!actionTypeId) return ''; const actionType = actionTypeId.split('.')[1]; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_overflow_display.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_overflow_display.tsx index d22d338d6f50a..d3219cc86d0e7 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_overflow_display.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_overflow_display.tsx @@ -27,7 +27,10 @@ interface OverflowListComponentProps { } const ExceptionOverflowWrapper = styled(EuiBadgeGroup)` - width: 100%; + .euiBadgeGroup__item { + display: block; + width: 100%; + } `; const ExceptionOverflowPopoverWrapper = styled(EuiBadgeGroup)` @@ -87,7 +90,6 @@ const ExceptionOverflowDisplayComponent = ({ { <> - - <> - {loadingTableInfo && ( - + {loadingTableInfo && ( + + )} + {!initLoading && } + + + {loadingTableInfo && !initLoading && !showReferenceErrorModal && ( + + )} + + {initLoading ? ( + + ) : ( + <> + - )} - {!initLoading && } - - - {loadingTableInfo && !initLoading && !showReferenceErrorModal && ( - - )} - - {initLoading ? ( - - ) : ( - <> - - - data-test-subj="exceptions-table" - columns={exceptionsColumns} - isSelectable={hasPermissions} - itemId="id" - items={tableItems} - noItemsMessage={emptyPrompt} - onChange={handlePaginationChange} - pagination={paginationMemo} - /> - - )} - - - - + + data-test-subj="exceptions-table" + columns={exceptionsColumns} + isSelectable={hasPermissions} + itemId="id" + items={tableItems} + noItemsMessage={emptyPrompt} + onChange={handlePaginationChange} + pagination={paginationMemo} + /> + + )} + + + +
); }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx index 9d9425cdabe63..bc2172a257635 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx @@ -32,7 +32,6 @@ import { HeaderSection } from '../../../../../common/components/header_section'; import { useKibana, useUiSetting$ } from '../../../../../common/lib/kibana'; import { useStateToaster } from '../../../../../common/components/toasters'; import { Loader } from '../../../../../common/components/loader'; -import { Panel } from '../../../../../common/components/panel'; import { PrePackagedRulesPrompt } from '../../../../components/rules/pre_packaged_rules/load_empty_prompt'; import { AllRulesTables, SortingType } from '../../../../components/rules/all_rules_tables'; import { getPrePackagedRuleStatus } from '../helpers'; @@ -456,114 +455,101 @@ export const RulesTables = React.memo( - + )} + + {shouldShowRulesTable && ( + + )} + + {!initLoading && + (loading || isLoadingRules || isLoadingAnActionOnRule) && + !isRefreshing && } + {shouldShowPrepackagedRulesPrompt && ( + + )} + {initLoading && ( + + )} + {showIdleModal && ( + +

{i18n.REFRESH_PROMPT_BODY}

+
+ )} + {isDeleteConfirmationVisible && ( + +

{i18n.DELETE_CONFIRMATION_BODY}

+
+ )} + {shouldShowRulesTable && ( <> - {!initLoading && - (loading || isLoadingRules || isLoadingAnActionOnRule) && - isRefreshing && ( - - )} - - {shouldShowRulesTable && ( - - )} - - - {!initLoading && - (loading || isLoadingRules || isLoadingAnActionOnRule) && - !isRefreshing && ( - - )} - - {shouldShowPrepackagedRulesPrompt && ( - - )} - {initLoading && ( - - )} - {showIdleModal && ( - -

{i18n.REFRESH_PROMPT_BODY}

-
- )} - {isDeleteConfirmationVisible && ( - -

{i18n.DELETE_CONFIRMATION_BODY}

-
- )} - {shouldShowRulesTable && ( - <> - - - - )} + + -
+ )} ); } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index 53efe28cba49c..15ff91cac5096 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -579,19 +579,21 @@ export const SUCCESSFULLY_IMPORTED_RULES = (totalRules: number) => } ); -export const IMPORT_FAILED = i18n.translate( - 'xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedTitle', - { - defaultMessage: 'Failed to import rules', - } -); +export const IMPORT_FAILED = (totalRules: number) => + i18n.translate( + 'xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedTitle', + { + values: { totalRules }, + defaultMessage: 'Failed to import {totalRules} {totalRules, plural, =1 {rule} other {rules}}', + } + ); -export const IMPORT_FAILED_DETAILED = (ruleId: string, statusCode: number, message: string) => +export const IMPORT_FAILED_DETAILED = (message: string) => i18n.translate( 'xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedDetailedTitle', { - values: { ruleId, statusCode, message }, - defaultMessage: 'Rule ID: {ruleId}\n Status Code: {statusCode}\n Message: {message}', + values: { message }, + defaultMessage: '{message}', } ); diff --git a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx index 8e6a635624bfe..b1c7c25c794c1 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/hosts.tsx @@ -179,6 +179,7 @@ const HostsComponent = () => { /> } title={i18n.PAGE_TITLE} + border /> { @@ -63,15 +65,20 @@ export const AdministrationListPage: FC - - + {!hideHeader && ( + <> + + + + )} + { + it('should display dates in expected format', () => { render(); expect(renderResult.getByTestId('testCard-header-updated').textContent).toEqual( - expect.stringMatching(/Last updated(\s seconds? ago|now)/) + expect.stringMatching(/Last updated(?:(\s*\d+ seconds? ago)|now)/) ); }); diff --git a/x-pack/plugins/security_solution/public/management/components/management_empty_state_wraper.tsx b/x-pack/plugins/security_solution/public/management/components/management_empty_state_wraper.tsx new file mode 100644 index 0000000000000..6283fa86b1026 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/components/management_empty_state_wraper.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiFlexGroup, EuiPageTemplate } from '@elastic/eui'; +import styled from 'styled-components'; + +export const StyledEuiFlexGroup = styled(EuiFlexGroup)` + min-height: calc(100vh - 140px); +`; + +export const ManagementEmptyStateWraper = memo(({ children }) => { + return ( + + {children} + + ); +}); + +ManagementEmptyStateWraper.displayName = 'ManagementEmptyStateWraper'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx index 8f044959f4c90..adae21b55a637 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx @@ -62,7 +62,7 @@ export const EndpointDetailsFlyoutTabs = memo( const selectedTab = useMemo(() => tabs.find((tab) => tab.id === show), [tabs, show]); const renderTabs = tabs.map((tab) => ( - + )); return ( diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx index cc1cad52eb21c..cb920bdbd1b03 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx @@ -13,8 +13,9 @@ import { EuiText, EuiFlexGroup, EuiFlexItem, - EuiBadge, EuiSpacer, + EuiLink, + EuiHealth, } from '@elastic/eui'; import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -30,7 +31,6 @@ import { getEndpointDetailsPath } from '../../../../common/routing'; import { EndpointPolicyLink } from '../components/endpoint_policy_link'; import { OutOfDate } from '../components/out_of_date'; import { EndpointAgentStatus } from '../components/endpoint_agent_status'; -import { useAppUrl } from '../../../../../common/lib/kibana/hooks'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -53,9 +53,8 @@ export const EndpointDetailsContent = memo( const policyStatus = useEndpointSelector( policyResponseStatus ) as keyof typeof POLICY_STATUS_TO_BADGE_COLOR; - const { getAppUrl } = useAppUrl(); - const [policyResponseUri, policyResponseRoutePath] = useMemo(() => { + const policyResponseRoutePath = useMemo(() => { // eslint-disable-next-line @typescript-eslint/naming-convention const { selected_endpoint, show, ...currentUrlParams } = queryParams; const path = getEndpointDetailsPath({ @@ -63,8 +62,8 @@ export const EndpointDetailsContent = memo( ...currentUrlParams, selected_endpoint: details.agent.id, }); - return [getAppUrl({ path }), path]; - }, [details.agent.id, getAppUrl, queryParams]); + return path; + }, [details.agent.id, queryParams]); const policyStatusClickHandler = useNavigateByRouterEventHandler(policyResponseRoutePath); @@ -142,26 +141,20 @@ export const EndpointDetailsContent = memo( defaultMessage: 'Policy Status', }), description: ( - // https://github.com/elastic/eui/issues/4530 - // @ts-ignore - - - - - + + + + + + ), }, { @@ -185,14 +178,7 @@ export const EndpointDetailsContent = memo( ), }, ]; - }, [ - details, - hostStatus, - policyResponseUri, - policyStatus, - policyStatusClickHandler, - policyInfo, - ]); + }, [details, hostStatus, policyStatus, policyStatusClickHandler, policyInfo]); return ( <> diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index 727c2e8a35024..45dcf5f7a0f7d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -167,7 +167,7 @@ describe('when on the endpoint list page', () => { it('should NOT display timeline', async () => { const renderResult = render(); - const timelineFlyout = await renderResult.queryByTestId('flyoutOverlay'); + const timelineFlyout = renderResult.queryByTestId('flyoutOverlay'); expect(timelineFlyout).toBeNull(); }); @@ -460,7 +460,7 @@ describe('when on the endpoint list page', () => { const outOfDates = await renderResult.findAllByTestId('rowPolicyOutOfDate'); expect(outOfDates).toHaveLength(4); - outOfDates.forEach((item, index) => { + outOfDates.forEach((item) => { expect(item.textContent).toEqual('Out-of-date'); expect(item.querySelector(`[data-euiicon-type][color=warning]`)).not.toBeNull(); }); @@ -512,8 +512,8 @@ describe('when on the endpoint list page', () => { // FLAKY: https://github.com/elastic/kibana/issues/75721 describe.skip('when polling on Endpoint List', () => { - beforeEach(async () => { - await reactTestingLibrary.act(() => { + beforeEach(() => { + reactTestingLibrary.act(() => { const hostListData = mockEndpointResultList({ total: 4 }).hosts; setEndpointListApiMockImplementation(coreStart.http, { @@ -703,8 +703,8 @@ describe('when on the endpoint list page', () => { it('should show the flyout and footer', async () => { const renderResult = await renderAndWaitForData(); - await expect(renderResult.findByTestId('endpointDetailsFlyout')).not.toBeNull(); - await expect(renderResult.queryByTestId('endpointDetailsFlyoutFooter')).not.toBeNull(); + expect(renderResult.getByTestId('endpointDetailsFlyout')).not.toBeNull(); + expect(renderResult.getByTestId('endpointDetailsFlyoutFooter')).not.toBeNull(); }); it('should display policy name value as a link', async () => { @@ -738,15 +738,6 @@ describe('when on the endpoint list page', () => { ); }); - it('should display policy status value as a link', async () => { - const renderResult = await renderAndWaitForData(); - const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); - expect(policyStatusLink).not.toBeNull(); - expect(policyStatusLink.getAttribute('href')).toEqual( - `${APP_PATH}${MANAGEMENT_PATH}/endpoints?page_index=0&page_size=10&selected_endpoint=1&show=policy_response` - ); - }); - it('should update the URL when policy status link is clicked', async () => { const renderResult = await renderAndWaitForData(); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); @@ -763,10 +754,8 @@ describe('when on the endpoint list page', () => { it('should display Success overall policy status', async () => { const renderResult = await renderAndWaitForData(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); + expect(renderResult.getByTestId('policyStatusValue-success')).toBeTruthy(); expect(policyStatusBadge.textContent).toEqual('Success'); - expect(policyStatusBadge.getAttribute('style')).toMatch( - /background-color\: rgb\(109\, 204\, 177\)\;/ - ); }); it('should display Warning overall policy status', async () => { @@ -774,9 +763,7 @@ describe('when on the endpoint list page', () => { const renderResult = await renderAndWaitForData(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Warning'); - expect(policyStatusBadge.getAttribute('style')).toMatch( - /background-color\: rgb\(241\, 216\, 111\)\;/ - ); + expect(renderResult.getByTestId('policyStatusValue-warning')).toBeTruthy(); }); it('should display Failed overall policy status', async () => { @@ -784,9 +771,7 @@ describe('when on the endpoint list page', () => { const renderResult = await renderAndWaitForData(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Failed'); - expect(policyStatusBadge.getAttribute('style')).toMatch( - /background-color\: rgb\(255\, 126\, 98\)\;/ - ); + expect(renderResult.getByTestId('policyStatusValue-failure')).toBeTruthy(); }); it('should display Unknown overall policy status', async () => { @@ -794,9 +779,7 @@ describe('when on the endpoint list page', () => { const renderResult = await renderAndWaitForData(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Unknown'); - expect(policyStatusBadge.getAttribute('style')).toMatch( - /background-color\: rgb\(211\, 218\, 230\)\;/ - ); + expect(renderResult.getByTestId('policyStatusValue-')).toBeTruthy(); }); it('should show the Take Action button', async () => { @@ -898,7 +881,7 @@ describe('when on the endpoint list page', () => { await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); - const hostNameLinks = await renderResult.getAllByTestId('hostnameCellLink'); + const hostNameLinks = renderResult.getAllByTestId('hostnameCellLink'); reactTestingLibrary.fireEvent.click(hostNameLinks[0]); }); @@ -913,7 +896,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.act(() => { dispatchEndpointDetailsActivityLogChanged('success', getMockData()); }); - const endpointDetailsFlyout = await renderResult.queryByTestId('endpointDetailsFlyoutBody'); + const endpointDetailsFlyout = renderResult.queryByTestId('endpointDetailsFlyoutBody'); expect(endpointDetailsFlyout).not.toBeNull(); }); @@ -926,7 +909,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.act(() => { dispatchEndpointDetailsActivityLogChanged('success', getMockData()); }); - const logEntries = await renderResult.queryAllByTestId('timelineEntry'); + const logEntries = renderResult.queryAllByTestId('timelineEntry'); expect(logEntries.length).toEqual(3); expect(`${logEntries[0]} .euiCommentTimeline__icon--update`).not.toBe(null); expect(`${logEntries[1]} .euiCommentTimeline__icon--regular`).not.toBe(null); @@ -944,7 +927,7 @@ describe('when on the endpoint list page', () => { getMockData({ hasLogsEndpointActionResponses: true }) ); }); - const logEntries = await renderResult.queryAllByTestId('timelineEntry'); + const logEntries = renderResult.queryAllByTestId('timelineEntry'); expect(logEntries.length).toEqual(4); expect(`${logEntries[0]} .euiCommentTimeline__icon--update`).not.toBe(null); expect(`${logEntries[1]} .euiCommentTimeline__icon--update`).not.toBe(null); @@ -960,7 +943,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.act(() => { dispatchEndpointDetailsActivityLogChanged('failed', getMockData()); }); - const emptyState = await renderResult.queryByTestId('activityLogEmpty'); + const emptyState = renderResult.queryByTestId('activityLogEmpty'); expect(emptyState).not.toBe(null); }); @@ -980,10 +963,10 @@ describe('when on the endpoint list page', () => { }); }); - const emptyState = await renderResult.queryByTestId('activityLogEmpty'); + const emptyState = renderResult.queryByTestId('activityLogEmpty'); expect(emptyState).toBe(null); - const superDatePicker = await renderResult.queryByTestId('activityLogSuperDatePicker'); + const superDatePicker = renderResult.queryByTestId('activityLogSuperDatePicker'); expect(superDatePicker).not.toBe(null); }); @@ -1002,7 +985,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.act(() => { dispatchEndpointDetailsActivityLogChanged('success', getMockData()); }); - const logEntries = await renderResult.queryAllByTestId('timelineEntry'); + const logEntries = renderResult.queryAllByTestId('timelineEntry'); expect(logEntries.length).toEqual(3); }); @@ -1047,7 +1030,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.act(() => { dispatchEndpointDetailsActivityLogChanged('success', getMockData()); }); - const commentTexts = await renderResult.queryAllByTestId('activityLogCommentText'); + const commentTexts = renderResult.queryAllByTestId('activityLogCommentText'); expect(commentTexts.length).toEqual(1); expect(commentTexts[0].textContent).toEqual('some comment'); expect(commentTexts[0].parentElement?.parentElement?.className).toContain( @@ -1081,7 +1064,7 @@ describe('when on the endpoint list page', () => { afterEach(reactTestingLibrary.cleanup); it('should hide the host details panel', async () => { - const endpointDetailsFlyout = await renderResult.queryByTestId('endpointDetailsFlyoutBody'); + const endpointDetailsFlyout = renderResult.queryByTestId('endpointDetailsFlyoutBody'); expect(endpointDetailsFlyout).toBeNull(); }); @@ -1328,8 +1311,8 @@ describe('when on the endpoint list page', () => { ).toBe(true); }); - it('should NOT show the flyout footer', async () => { - await expect(renderResult.queryByTestId('endpointDetailsFlyoutFooter')).toBeNull(); + it('should NOT show the flyout footer', () => { + expect(renderResult.queryByTestId('endpointDetailsFlyoutFooter')).toBeNull(); }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/empty/index.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/empty/index.tsx index e27adc851dab7..36a7f32ce32dd 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/empty/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/empty/index.tsx @@ -9,6 +9,7 @@ import React, { memo } from 'react'; import styled, { css } from 'styled-components'; import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { ManagementEmptyStateWraper } from '../../../../../components/management_empty_state_wraper'; const EmptyPrompt = styled(EuiEmptyPrompt)` ${() => css` @@ -22,37 +23,39 @@ export const EventFiltersListEmptyState = memo<{ isAddDisabled?: boolean; }>(({ onAdd, isAddDisabled = false }) => { return ( - + + + + + } + body={ - - } - body={ - - } - actions={ - - - - } - /> + } + actions={ + + + + } + /> + ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx index a024012b41351..ced0abcea0258 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx @@ -129,7 +129,8 @@ export const EventFiltersForm: React.FC = memo( listNamespaceType: 'agnostic', ruleName: RULE_NAME, indexPatterns, - isOrDisabled: true, // TODO: pending to be validated + isOrDisabled: true, + isOrHidden: true, isAndDisabled: false, isNestedDisabled: false, dataTestSubj: 'alert-exception-builder', diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx index db4e5dbb531b2..cebd70d2b69a3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx @@ -248,6 +248,7 @@ export const EventFiltersListPage = memo(() => { ) } + hideHeader={!doesDataExist} > {showFlyout && ( > = createSelector( + getListApiSuccessResponse, + (apiResponseData) => { + return apiResponseData?.total || 0; + } +); + export const getListPagination: HostIsolationExceptionsSelector = createSelector( getListApiSuccessResponse, // memoized via `reselect` until the API response changes diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/utils.ts b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/utils.ts index bfb1ac048e286..aecdfd9f0c464 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/utils.ts +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/utils.ts @@ -31,11 +31,20 @@ export function createEmptyHostIsolationException(): CreateExceptionListItemSche }; } +/** + * Validates that an IP is a valid ipv4 or CIDR. + * The initial regex validates the format for x.x.x.x/xx + * Then ipaddr is used for a deeper ipv4 validation + */ export function isValidIPv4OrCIDR(maybeIp: string): boolean { - try { - ipaddr.IPv4.parseCIDR(maybeIp); - return true; - } catch (e) { - return ipaddr.IPv4.isValid(maybeIp); + const ipv4re = /^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/; + if (ipv4re.test(maybeIp)) { + try { + ipaddr.IPv4.parseCIDR(maybeIp); + return true; + } catch (e) { + return ipaddr.IPv4.isValid(maybeIp); + } } + return false; } diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/empty.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/empty.tsx index 88cd0abc365cf..70a30d0890ee4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/empty.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/empty.tsx @@ -9,6 +9,7 @@ import React, { memo } from 'react'; import styled, { css } from 'styled-components'; import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { ManagementEmptyStateWraper } from '../../../../components/management_empty_state_wraper'; const EmptyPrompt = styled(EuiEmptyPrompt)` ${() => css` @@ -18,32 +19,38 @@ const EmptyPrompt = styled(EuiEmptyPrompt)` export const HostIsolationExceptionsEmptyState = memo<{ onAdd: () => void }>(({ onAdd }) => { return ( - + + + + + } + body={ - - } - body={ - - } - actions={ - - - - } - /> + } + actions={ + + + + } + /> + ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form.test.tsx index 826f7bf6c4d8a..eb8294a1f4658 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form.test.tsx @@ -44,6 +44,7 @@ describe('When on the host isolation exceptions add entry form', () => { newException = createEmptyHostIsolationException(); renderResult = render(newException); }); + it('should render the form with empty inputs', () => { expect(renderResult.getByTestId('hostIsolationExceptions-form-name-input')).toHaveValue(''); expect(renderResult.getByTestId('hostIsolationExceptions-form-ip-input')).toHaveValue(''); @@ -51,20 +52,31 @@ describe('When on the host isolation exceptions add entry form', () => { renderResult.getByTestId('hostIsolationExceptions-form-description-input') ).toHaveValue(''); }); - it('should call onError with true when a wrong ip value is introduced', () => { - const ipInput = renderResult.getByTestId('hostIsolationExceptions-form-ip-input'); - userEvent.type(ipInput, 'not an ip'); - expect(onError).toHaveBeenCalledWith(true); - }); - it('should call onError with false when a correct values are introduced', () => { - const ipInput = renderResult.getByTestId('hostIsolationExceptions-form-ip-input'); - const nameInput = renderResult.getByTestId('hostIsolationExceptions-form-name-input'); - userEvent.type(nameInput, 'test name'); - userEvent.type(ipInput, '10.0.0.1'); + it.each(['not an ip', '100', '900.0.0.1', 'x.x.x.x', '10.0.0'])( + 'should call onError with true when a wrong ip value is introduced. Case: "%s"', + (value: string) => { + const nameInput = renderResult.getByTestId('hostIsolationExceptions-form-name-input'); + const ipInput = renderResult.getByTestId('hostIsolationExceptions-form-ip-input'); + userEvent.type(nameInput, 'test name'); + userEvent.type(ipInput, value); + expect(onError).toHaveBeenCalledWith(true); + } + ); + + it.each(['192.168.0.1', '10.0.0.1', '100.90.1.1/24', '192.168.200.6/30'])( + 'should call onError with false when a correct ip value is introduced. Case: "%s"', + (value: string) => { + const ipInput = renderResult.getByTestId('hostIsolationExceptions-form-ip-input'); + const nameInput = renderResult.getByTestId('hostIsolationExceptions-form-name-input'); + + userEvent.type(nameInput, 'test name'); + userEvent.type(ipInput, value); + + expect(onError).toHaveBeenLastCalledWith(false); + } + ); - expect(onError).toHaveBeenLastCalledWith(false); - }); it('should call onChange when a value is introduced in a field', () => { const ipInput = renderResult.getByTestId('hostIsolationExceptions-form-ip-input'); userEvent.type(ipInput, '10.0.0.1'); @@ -76,6 +88,7 @@ describe('When on the host isolation exceptions add entry form', () => { }); }); }); + describe('When editing an existing exception', () => { let existingException: UpdateExceptionListItemSchema; beforeEach(() => { @@ -96,6 +109,7 @@ describe('When on the host isolation exceptions add entry form', () => { }; renderResult = render(existingException); }); + it('should render the form with pre-filled inputs', () => { expect(renderResult.getByTestId('hostIsolationExceptions-form-name-input')).toHaveValue( 'name edit me' @@ -107,6 +121,7 @@ describe('When on the host isolation exceptions add entry form', () => { renderResult.getByTestId('hostIsolationExceptions-form-description-input') ).toHaveValue('initial description'); }); + it('should call onChange when a value is introduced in a field', () => { const ipInput = renderResult.getByTestId('hostIsolationExceptions-form-ip-input'); userEvent.clear(ipInput); diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form_flyout.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form_flyout.tsx index e87ac2adeab49..2eeddbaeeb0f3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form_flyout.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/components/form_flyout.tsx @@ -94,7 +94,7 @@ export const HostIsolationExceptionsFormFlyout: React.FC<{}> = memo(() => { type: 'hostIsolationExceptionsMarkToEdit', payload: { id: location.id }, }); - } else { + } else if (exception === undefined) { setException(exceptionToEdit); } } diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx index 625da11a3644e..9a119a58aa802 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx @@ -94,10 +94,13 @@ describe('When on the host isolation exceptions page', () => { expect(renderResult.container.querySelector('.euiProgress')).toBeNull(); }); - it('should display the search bar', async () => { + it('should display the search bar and item count', async () => { render(); await dataReceived(); expect(renderResult.getByTestId('searchExceptions')).toBeTruthy(); + expect(renderResult.getByTestId('hostIsolationExceptions-totalCount').textContent).toBe( + 'Showing 1 exception' + ); }); it('should show items on the list', async () => { @@ -127,19 +130,22 @@ describe('When on the host isolation exceptions page', () => { }); describe('is license platinum plus', () => { - beforeEach(() => { + beforeEach(async () => { isPlatinumPlusMock.mockReturnValue(true); + getHostIsolationExceptionItemsMock.mockImplementation(getFoundExceptionListItemSchemaMock); }); - it('should show the create flyout when the add button is pressed', () => { + it('should show the create flyout when the add button is pressed', async () => { render(); + await dataReceived(); act(() => { userEvent.click(renderResult.getByTestId('hostIsolationExceptionsListAddButton')); }); expect(renderResult.getByTestId('hostIsolationExceptionsCreateEditFlyout')).toBeTruthy(); }); - it('should show the create flyout when the show location is create', () => { + it('should show the create flyout when the show location is create', async () => { history.push(`${HOST_ISOLATION_EXCEPTIONS_PATH}?show=create`); render(); + await dataReceived(); expect(renderResult.getByTestId('hostIsolationExceptionsCreateEditFlyout')).toBeTruthy(); expect(renderResult.queryByTestId('hostIsolationExceptionsCreateEditFlyout')).toBeTruthy(); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx index 096575bab360c..bf063f4b2508e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx @@ -8,7 +8,7 @@ import { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; import { i18n } from '@kbn/i18n'; import React, { Dispatch, useCallback, useEffect } from 'react'; -import { EuiButton, EuiSpacer } from '@elastic/eui'; +import { EuiButton, EuiText, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { useDispatch } from 'react-redux'; import { useHistory } from 'react-router-dom'; @@ -21,6 +21,7 @@ import { getListIsLoading, getListItems, getListPagination, + getTotalListItems, } from '../store/selector'; import { useHostIsolationExceptionsNavigateCallback, @@ -48,6 +49,7 @@ type HostIsolationExceptionPaginatedContent = PaginatedContentProps< export const HostIsolationExceptionsList = () => { const listItems = useHostIsolationExceptionsSelector(getListItems); + const totalCountListItems = useHostIsolationExceptionsSelector(getTotalListItems); const pagination = useHostIsolationExceptionsSelector(getListPagination); const isLoading = useHostIsolationExceptionsSelector(getListIsLoading); const fetchError = useHostIsolationExceptionsSelector(getListFetchError); @@ -74,7 +76,7 @@ export const HostIsolationExceptionsList = () => { function handleItemComponentProps(element: ExceptionListItemSchema): ArtifactEntryCardProps { const editAction = { - icon: 'trash', + icon: 'controlsHorizontal', onClick: () => { navigateCallback({ show: 'edit', @@ -130,8 +132,14 @@ export const HostIsolationExceptionsList = () => { defaultMessage="Host isolation exceptions" /> } + subtitle={ + + } actions={ - license.isPlatinumPlus() ? ( + license.isPlatinumPlus() && listItems.length > 0 ? ( { [] ) } + hideHeader={isLoading || listItems.length === 0} > {showFlyout && } {itemToDelete ? : null} - {listItems.length ? ( - + {!isLoading && listItems.length ? ( + <> + + + + + + + ) : null} - - items={listItems} ItemComponent={ArtifactEntryCard} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_policy_edit_extension.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_policy_edit_extension.tsx index 0a912598c5722..0717ca5193bee 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_policy_edit_extension.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_policy_edit_extension.tsx @@ -6,7 +6,7 @@ */ import React, { memo, useEffect, useState, useMemo } from 'react'; -import { EuiSpacer, EuiText } from '@elastic/eui'; +import { EuiCallOut, EuiLoadingSpinner, EuiSpacer, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { useDispatch } from 'react-redux'; @@ -23,7 +23,11 @@ import { getPolicyDetailPath, getPolicyTrustedAppsPath } from '../../../../commo import { PolicyDetailsForm } from '../policy_details_form'; import { AppAction } from '../../../../../common/store/actions'; import { usePolicyDetailsSelector } from '../policy_hooks'; -import { policyDetailsForUpdate } from '../../store/policy_details/selectors'; +import { + apiError, + policyDetails, + policyDetailsForUpdate, +} from '../../store/policy_details/selectors'; import { FleetTrustedAppsCard } from './endpoint_package_custom_extension/components/fleet_trusted_apps_card'; import { LinkWithIcon } from './endpoint_package_custom_extension/components/link_with_icon'; /** @@ -48,6 +52,8 @@ const WrappedPolicyDetailsForm = memo<{ }>(({ policyId, onChange }) => { const dispatch = useDispatch<(a: AppAction) => void>(); const updatedPolicy = usePolicyDetailsSelector(policyDetailsForUpdate); + const endpointPolicyDetails = usePolicyDetailsSelector(policyDetails); + const endpointDetailsLoadingError = usePolicyDetailsSelector(apiError); const { getAppUrl } = useAppUrl(); const [, setLastUpdatedPolicy] = useState(updatedPolicy); // TODO: Remove this and related code when removing FF @@ -185,7 +191,25 @@ const WrappedPolicyDetailsForm = memo<{ - + {endpointDetailsLoadingError ? ( + + } + iconType="alert" + color="warning" + data-test-subj="endpiontPolicySettingsLoadingError" + > + {endpointDetailsLoadingError.message} + + ) : !endpointPolicyDetails ? ( + + ) : ( + + )}
) : ( diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_advanced.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_advanced.tsx index 8e0d8c544563a..6034ed875c02b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_advanced.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_advanced.tsx @@ -171,10 +171,10 @@ const PolicyAdvanced = React.memo( - {configPath.join('.')} + + {configPath.join('.')} {documentation && ( - + )} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index 65308012df080..db3291207fc91 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -10,12 +10,7 @@ import { i18n } from '@kbn/i18n'; import { useLocation } from 'react-router-dom'; import { EuiCallOut, EuiLoadingSpinner, EuiPageTemplate } from '@elastic/eui'; import { usePolicyDetailsSelector } from './policy_hooks'; -import { - policyDetails, - agentStatusSummary, - isLoading, - apiError, -} from '../store/policy_details/selectors'; +import { policyDetails, agentStatusSummary, apiError } from '../store/policy_details/selectors'; import { AgentsSummary } from './agents_summary'; import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { PolicyTabs } from './tabs'; @@ -39,7 +34,6 @@ export const PolicyDetails = React.memo(() => { const { getAppUrl } = useAppUrl(); // Store values - const loading = usePolicyDetailsSelector(isLoading); const policyApiError = usePolicyDetailsSelector(apiError); const policyItem = usePolicyDetailsSelector(policyDetails); const policyAgentStatusSummary = usePolicyDetailsSelector(agentStatusSummary); @@ -90,24 +84,24 @@ export const PolicyDetails = React.memo(() => { ); const pageBody: React.ReactNode = useMemo(() => { - if (loading) { + if (policyApiError) { return ( - + + {policyApiError?.message} + ); } - if (policyApiError) { + if (!policyItem) { return ( - - {policyApiError?.message} - + ); } @@ -118,7 +112,7 @@ export const PolicyDetails = React.memo(() => { } return ; - }, [isTrustedAppsByPolicyEnabled, loading, policyApiError]); + }, [isTrustedAppsByPolicyEnabled, policyApiError, policyItem]); return ( { +describe('When using the RemoveTrustedAppFromPolicyModal component', () => { let appTestContext: AppContextTestRender; let renderResult: ReturnType; let render: (waitForLoadedState?: boolean) => Promise>; @@ -50,7 +49,7 @@ describe.skip('When using the RemoveTrustedAppFromPolicyModal component', () => mockedApis.responseProvider.trustedAppUpdate.mockDelay.mockImplementation( () => new Promise((resolve) => { - setTimeout(resolve, 20); + setTimeout(resolve, 100); }) ); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx index d052138d309ac..f487a38401ef0 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/condition_entry_input/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { ChangeEventHandler, memo, useCallback, useMemo } from 'react'; +import React, { ChangeEventHandler, memo, useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; import { @@ -100,6 +100,7 @@ export const ConditionEntryInput = memo( 'data-test-subj': dataTestSubj, }) => { const getTestId = useTestIdGenerator(dataTestSubj); + const [isVisited, setIsVisited] = useState(false); const fieldOptions = useMemo>>(() => { const getDropdownDisplay = (field: ConditionEntryField) => ( @@ -155,7 +156,10 @@ export const ConditionEntryInput = memo( if (onVisited) { onVisited(entry); } - }, [entry, onVisited]); + if (!isVisited) { + setIsVisited(true); + } + }, [entry, onVisited, isVisited]); return ( @@ -199,7 +203,7 @@ export const ConditionEntryInput = memo( type: entry.type, })} fullWidth - required + required={isVisited} onChange={handleValueUpdate} onBlur={handleValueOnBlur} data-test-subj={getTestId('value')} diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx index d3b4a541bd18d..f05d018fe8e9a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.test.tsx @@ -153,7 +153,11 @@ describe('When using the Trusted App Form', () => { describe('and the form is rendered', () => { beforeEach(() => render()); - it('should show Name as required', () => { + it('should show Name as required after blur', () => { + expect(getNameField().required).toBe(false); + reactTestingLibrary.act(() => { + fireEvent.blur(getNameField()); + }); expect(getNameField().required).toBe(true); }); @@ -224,7 +228,11 @@ describe('When using the Trusted App Form', () => { ]); }); - it('should show the value field as required', () => { + it('should show the value field as required after blur', () => { + expect(getConditionValue(getCondition()).required).toEqual(false); + reactTestingLibrary.act(() => { + fireEvent.blur(getConditionValue(getCondition())); + }); expect(getConditionValue(getCondition()).required).toEqual(true); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx index d4f456ab8e039..da925ddd8a6c1 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx @@ -478,7 +478,7 @@ export const CreateTrustedAppForm = memo( onChange={handleDomChangeEvents} onBlur={handleDomBlurEvents} fullWidth - required + required={wasVisited?.name} maxLength={256} data-test-subj={getTestId('nameTextField')} /> diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/empty_state.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/empty_state.tsx index d4b02b6ac467a..d64d2fd7f634b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/empty_state.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/empty_state.tsx @@ -8,6 +8,7 @@ import React, { memo } from 'react'; import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { ManagementEmptyStateWraper } from '../../../../components/management_empty_state_wraper'; export const EmptyState = memo<{ onAdd: () => void; @@ -15,37 +16,39 @@ export const EmptyState = memo<{ isAddDisabled?: boolean; }>(({ onAdd, isAddDisabled = false }) => { return ( - + + + + + } + body={ - - } - body={ - - } - actions={ - - - - } - /> + } + actions={ + + + + } + /> + ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx index 70698aec509ba..dcdf86e395619 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx @@ -171,7 +171,8 @@ export const TrustedAppsPage = memo(() => { } headerBackComponent={backButton} subtitle={ABOUT_TRUSTED_APPS} - actions={canDisplayContent() ? addButton : <>} + actions={addButton} + hideHeader={!canDisplayContent()} > diff --git a/x-pack/plugins/security_solution/public/network/pages/network.tsx b/x-pack/plugins/security_solution/public/network/pages/network.tsx index fe8a9a93f97c7..af7f513afd744 100644 --- a/x-pack/plugins/security_solution/public/network/pages/network.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/network.tsx @@ -170,6 +170,7 @@ const NetworkComponent = React.memo( /> } title={i18n.PAGE_TITLE} + border /> +The predefined schemas are located here ```typescript const supportedSchemas: SupportedSchema[] = [ diff --git a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx index 6a146882fbab5..cb36aff214a76 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.test.tsx @@ -269,7 +269,12 @@ describe('graph controls: when relsover is loaded with an origin node', () => { .testSubject('resolver:graph-controls:node-legend:description') .map((description) => description.text()) ) - ).toYieldEqualTo(['Running Process', 'Terminated Process', 'Loading Process', 'Error']); + ).toYieldEqualTo([ + 'Running Process', + 'Terminated Process', + 'Loading Process', + 'Error Process', + ]); }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx index 96a59383b1a4e..570f444814d7f 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/graph_controls.tsx @@ -569,7 +569,7 @@ const NodeLegend = ({ > {i18n.translate('xpack.securitySolution.resolver.graphControls.errorCube', { - defaultMessage: 'Error', + defaultMessage: 'Error Process', })} diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx index 1eafa51058bdd..05f5a90346379 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiPanel, EuiBasicTable } from '@elastic/eui'; +import { EuiBasicTable } from '@elastic/eui'; import React, { useCallback, useMemo, useRef } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -194,7 +194,7 @@ export const OpenTimeline = React.memo( title={i18n.IMPORT_TIMELINE} /> - +
{!!timelineFilter && timelineFilter} ( tableRef={tableRef} totalSearchResultsCount={totalSearchResultsCount} /> - +
); } diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts index ebb927259535b..b14177b066feb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/translations.ts @@ -373,12 +373,15 @@ export const SUCCESSFULLY_IMPORTED_TIMELINES = (totalCount: number) => } ); -export const IMPORT_FAILED = i18n.translate( - 'xpack.securitySolution.timelines.components.importTimelineModal.importFailedTitle', - { - defaultMessage: 'Failed to import', - } -); +export const IMPORT_FAILED = (totalTimelines: number) => + i18n.translate( + 'xpack.securitySolution.timelines.components.importTimelineModal.importFailedTitle', + { + values: { totalTimelines }, + defaultMessage: + 'Failed to import {totalTimelines} {totalTimelines, plural, =1 {rule} other {rules}}', + } + ); export const IMPORT_TIMELINE = i18n.translate( 'xpack.securitySolution.timelines.components.importTimelineModal.importTitle', @@ -387,11 +390,11 @@ export const IMPORT_TIMELINE = i18n.translate( } ); -export const IMPORT_FAILED_DETAILED = (id: string, statusCode: number, message: string) => +export const IMPORT_FAILED_DETAILED = (message: string) => i18n.translate( 'xpack.securitySolution.timelines.components.importTimelineModal.importFailedDetailedTitle', { - values: { id, statusCode, message }, - defaultMessage: 'Timeline ID: {id}\n Status Code: {statusCode}\n Message: {message}', + values: { message }, + defaultMessage: '{message}', } ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap index 17a9c7efbf301..3e764b34d74c5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap @@ -20,7 +20,6 @@ exports[`Header rendering renders correctly against snapshot 1`] = ` "filters": Array [], "getAllMigrations": [Function], "inject": [Function], - "migrateToLatest": [Function], "telemetry": [Function], "uiSettings": Object { "get": [MockFunction], diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx index b2b304e16c4a0..daafec3005eb8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx @@ -244,27 +244,19 @@ export const QueryBarTimeline = memo( (f) => f.meta.controlledBy === TIMELINE_FILTER_DROP_AREA ) : -1; - savedQueryServices.saveQuery( - { - ...newSavedQuery.attributes, - filters: - newSavedQuery.attributes.filters != null - ? dataProviderFilterExists > -1 - ? [ - ...newSavedQuery.attributes.filters.slice(0, dataProviderFilterExists), - getDataProviderFilter(dataProvidersDsl), - ...newSavedQuery.attributes.filters.slice(dataProviderFilterExists + 1), - ] - : [ - ...newSavedQuery.attributes.filters, - getDataProviderFilter(dataProvidersDsl), - ] - : [], - }, - { - overwrite: true, - } - ); + savedQueryServices.updateQuery(newSavedQuery.id, { + ...newSavedQuery.attributes, + filters: + newSavedQuery.attributes.filters != null + ? dataProviderFilterExists > -1 + ? [ + ...newSavedQuery.attributes.filters.slice(0, dataProviderFilterExists), + getDataProviderFilter(dataProvidersDsl), + ...newSavedQuery.attributes.filters.slice(dataProviderFilterExists + 1), + ] + : [...newSavedQuery.attributes.filters, getDataProviderFilter(dataProvidersDsl)] + : [], + }); } } else { setSavedQueryId(null); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.test.tsx index 3c6dc68edefcc..e519cfcd204a7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.test.tsx @@ -5,7 +5,9 @@ * 2.0. */ -import { fireEvent, render } from '@testing-library/react'; +import { fireEvent, render, within } from '@testing-library/react'; +import { EuiToolTip } from '@elastic/eui'; + import React from 'react'; import { PickEventType } from './pick_events'; import { @@ -19,6 +21,14 @@ import { TimelineEventsType } from '../../../../../common'; import { createStore } from '../../../../common/store'; import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; +jest.mock('@elastic/eui', () => { + const actual = jest.requireActual('@elastic/eui'); + return { + ...actual, + EuiToolTip: jest.fn(), + }; +}); + describe('pick_events', () => { const defaultProps = { eventType: 'all' as TimelineEventsType, @@ -53,6 +63,23 @@ describe('pick_events', () => { }, }; const store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + + const mockTooltip = ({ + tooltipContent, + children, + }: { + tooltipContent: string; + children: React.ReactElement; + }) => ( +
+ {tooltipContent} + {children} +
+ ); + + beforeAll(() => { + (EuiToolTip as unknown as jest.Mock).mockImplementation(mockTooltip); + }); beforeEach(() => { jest.clearAllMocks(); jest.restoreAllMocks(); @@ -68,6 +95,32 @@ describe('pick_events', () => { initialPatterns.sort().join('') ); }); + + it('renders tooltip', () => { + render( + + + + ); + + expect((EuiToolTip as unknown as jest.Mock).mock.calls[0][0].content).toEqual( + initialPatterns + .filter((p) => p != null) + .sort() + .join(', ') + ); + }); + + it('renders popover button inside tooltip', () => { + const wrapper = render( + + + + ); + const tooltip = wrapper.getByTestId('timeline-sourcerer-tooltip'); + expect(within(tooltip).getByTestId('sourcerer-timeline-trigger')).toBeTruthy(); + }); + it('correctly filters options', () => { const wrapper = render( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.tsx index dbe04eccac521..6d86d7c0f1330 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/pick_events.tsx @@ -295,6 +295,20 @@ const PickEventTypeComponents: React.FC = ({ [isPopoverOpen, sourcererScope.selectedPatterns] ); + const buttonWithTooptip = useMemo(() => { + return tooltipContent ? ( + + {button} + + ) : ( + button + ); + }, [button, tooltipContent]); + const ButtonContent = useMemo( () => ( @@ -326,69 +340,66 @@ const PickEventTypeComponents: React.FC = ({ return ( - - - - - <>{i18n.SELECT_INDEX_PATTERNS} - - - {filter} - - - <> - - {comboBox} - - - {!showAdvanceSettings && ( - <> - - - {i18n.CONFIGURE_INDEX_PATTERNS} - - - )} - - - - - {i18n.DATA_SOURCES_RESET} - - - - - {i18n.SAVE_INDEX_PATTERNS} - - - - - - + + + + <>{i18n.SELECT_INDEX_PATTERNS} + + + {filter} + + + <> + + {comboBox} + + + {!showAdvanceSettings && ( + <> + + + {i18n.CONFIGURE_INDEX_PATTERNS} + + + )} + + + + + {i18n.DATA_SOURCES_RESET} + + + + + {i18n.SAVE_INDEX_PATTERNS} + + + + + ); }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/mocks.ts index b50d80a9bae71..984cf607b7e63 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/mocks.ts @@ -139,6 +139,7 @@ export class MockResponse { private command: ISOLATION_ACTIONS = 'isolate'; private comment?: string; private error?: string; + private ack?: boolean; constructor() {} @@ -154,9 +155,61 @@ export class MockResponse { command: this.command, comment: this.comment, }, + action_response: { + endpoint: { + ack: this.ack, + }, + }, }; } + public withAck(ack?: boolean) { + this.ack = ack; + return this; + } + + public forAction(id: string) { + this.actionID = id; + return this; + } + public forAgent(id: string) { + this.agent = id; + return this; + } +} + +export const aMockResponse = (actionID: string, agentID: string, ack?: boolean): MockResponse => { + return new MockResponse().forAction(actionID).forAgent(agentID).withAck(ack); +}; + +export class MockEndpointResponse { + private actionID: string = uuid.v4(); + private ts: moment.Moment = moment(); + private started: moment.Moment = moment(); + private completed: moment.Moment = moment(); + private agent: string = ''; + private command: ISOLATION_ACTIONS = 'isolate'; + private comment?: string; + private error?: string; + + constructor() {} + + public build(): LogsEndpointActionResponse { + return { + '@timestamp': this.ts.toISOString(), + EndpointActions: { + action_id: this.actionID, + completed_at: this.completed.toISOString(), + data: { + command: this.command, + comment: this.comment, + }, + started_at: this.started.toISOString(), + }, + agent: { id: this.agent }, + error: { message: this.error ?? '' }, + }; + } public forAction(id: string) { this.actionID = id; return this; @@ -167,6 +220,6 @@ export class MockResponse { } } -export const aMockResponse = (actionID: string, agentID: string): MockResponse => { - return new MockResponse().forAction(actionID).forAgent(agentID); +export const aMockEndpointResponse = (actionID: string, agentID: string): MockEndpointResponse => { + return new MockEndpointResponse().forAction(actionID).forAgent(agentID); }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/status.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/status.test.ts index 2f8ba30936f25..a8592f02691aa 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/status.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/status.test.ts @@ -27,7 +27,15 @@ import { } from '../../mocks'; import { registerActionStatusRoutes } from './status'; import uuid from 'uuid'; -import { aMockAction, aMockResponse, MockAction, mockSearchResult, MockResponse } from './mocks'; +import { + aMockAction, + aMockResponse, + aMockEndpointResponse, + MockEndpointResponse, + MockAction, + mockSearchResult, + MockResponse, +} from './mocks'; describe('Endpoint Action Status', () => { describe('schema', () => { @@ -62,7 +70,11 @@ describe('Endpoint Action Status', () => { // convenience for calling the route and handler for action status let getPendingStatus: (reqParams?: any) => Promise>; // convenience for injecting mock responses for actions index and responses - let havingActionsAndResponses: (actions: MockAction[], responses: any[]) => void; + let havingActionsAndResponses: ( + actions: MockAction[], + responses: MockResponse[], + endpointResponses?: MockEndpointResponse[] + ) => void; beforeEach(() => { const esClientMock = elasticsearchServiceMock.createScopedClusterClient(); @@ -94,12 +106,19 @@ describe('Endpoint Action Status', () => { return mockResponse; }; - havingActionsAndResponses = (actions: MockAction[], responses: MockResponse[]) => { + havingActionsAndResponses = ( + actions: MockAction[], + responses: MockResponse[], + endpointResponses?: MockEndpointResponse[] + ) => { esClientMock.asCurrentUser.search = jest.fn().mockImplementation((req) => { const size = req.size ? req.size : 10; - const items: any[] = - req.index === '.fleet-actions' ? actions.splice(0, size) : responses.splice(0, size); + req.index === '.fleet-actions' + ? actions.splice(0, size) + : req.index === '.logs-endpoint.action.responses' && !!endpointResponses + ? endpointResponses + : responses.splice(0, size); if (items.length > 0) { return Promise.resolve(mockSearchResult(items.map((x) => x.build()))); @@ -311,5 +330,125 @@ describe('Endpoint Action Status', () => { }, }); }); + + describe('with endpoint response index', () => { + it('should respond with 1 pending action response when no endpoint response', async () => { + const mockAgentID = 'XYZABC-000'; + const actionID = 'some-known-action_id'; + havingActionsAndResponses( + [aMockAction().withAgent(mockAgentID).withID(actionID)], + [aMockResponse(actionID, mockAgentID, true)] + ); + (endpointAppContextService.getEndpointMetadataService as jest.Mock) = jest + .fn() + .mockReturnValue({ + findHostMetadataForFleetAgents: jest.fn().mockResolvedValue([]), + }); + const response = await getPendingStatus({ + query: { + agent_ids: [mockAgentID], + }, + }); + + expect(response.ok).toBeCalled(); + expect((response.ok.mock.calls[0][0]?.body as any)?.data).toHaveLength(1); + expect((response.ok.mock.calls[0][0]?.body as any)?.data[0].agent_id).toEqual(mockAgentID); + }); + + it('should respond with 0 pending action response when there is a matching endpoint response', async () => { + const mockAgentID = 'XYZABC-000'; + const actionID = 'some-known-action_id'; + havingActionsAndResponses( + [aMockAction().withAgent(mockAgentID).withID(actionID)], + [aMockResponse(actionID, mockAgentID, true)], + [aMockEndpointResponse(actionID, mockAgentID)] + ); + (endpointAppContextService.getEndpointMetadataService as jest.Mock) = jest + .fn() + .mockReturnValue({ + findHostMetadataForFleetAgents: jest.fn().mockResolvedValue([]), + }); + const response = await getPendingStatus({ + query: { + agent_ids: [mockAgentID], + }, + }); + + expect(response.ok).toBeCalled(); + expect((response.ok.mock.calls[0][0]?.body as any)?.data).toHaveLength(1); + expect((response.ok.mock.calls[0][0]?.body as any)?.data[0].agent_id).toEqual(mockAgentID); + }); + + it('should include a total count of a pending action response', async () => { + const mockAgentId = 'XYZABC-000'; + const actionIds = ['action_id_0', 'action_id_1']; + havingActionsAndResponses( + [ + aMockAction().withAgent(mockAgentId).withAction('isolate').withID(actionIds[0]), + aMockAction().withAgent(mockAgentId).withAction('isolate').withID(actionIds[1]), + ], + [ + aMockResponse(actionIds[0], mockAgentId, true), + aMockResponse(actionIds[1], mockAgentId, true), + ] + ); + (endpointAppContextService.getEndpointMetadataService as jest.Mock) = jest + .fn() + .mockReturnValue({ + findHostMetadataForFleetAgents: jest.fn().mockResolvedValue([]), + }); + const response = await getPendingStatus({ + query: { + agent_ids: [mockAgentId], + }, + }); + expect(response.ok).toBeCalled(); + expect((response.ok.mock.calls[0][0]?.body as any)?.data).toHaveLength(1); + expect((response.ok.mock.calls[0][0]?.body as any)?.data[0].agent_id).toEqual(mockAgentId); + expect( + (response.ok.mock.calls[0][0]?.body as any)?.data[0].pending_actions.isolate + ).toEqual(2); + }); + + it('should show multiple pending action responses, and their counts', async () => { + const mockAgentID = 'XYZABC-000'; + const actionIds = ['ack_0', 'ack_1', 'ack_2', 'ack_3', 'ack_4']; + havingActionsAndResponses( + [ + aMockAction().withAgent(mockAgentID).withAction('isolate').withID(actionIds[0]), + aMockAction().withAgent(mockAgentID).withAction('isolate').withID(actionIds[1]), + aMockAction().withAgent(mockAgentID).withAction('isolate').withID(actionIds[2]), + aMockAction().withAgent(mockAgentID).withAction('unisolate').withID(actionIds[3]), + aMockAction().withAgent(mockAgentID).withAction('unisolate').withID(actionIds[4]), + ], + [ + aMockResponse(actionIds[0], mockAgentID, true), + aMockResponse(actionIds[1], mockAgentID, true), + aMockResponse(actionIds[2], mockAgentID, true), + aMockResponse(actionIds[3], mockAgentID, true), + aMockResponse(actionIds[4], mockAgentID, true), + ] + ); + (endpointAppContextService.getEndpointMetadataService as jest.Mock) = jest + .fn() + .mockReturnValue({ + findHostMetadataForFleetAgents: jest.fn().mockResolvedValue([]), + }); + const response = await getPendingStatus({ + query: { + agent_ids: [mockAgentID], + }, + }); + expect(response.ok).toBeCalled(); + expect((response.ok.mock.calls[0][0]?.body as any)?.data).toHaveLength(1); + expect((response.ok.mock.calls[0][0]?.body as any)?.data[0].agent_id).toEqual(mockAgentID); + expect( + (response.ok.mock.calls[0][0]?.body as any)?.data[0].pending_actions.isolate + ).toEqual(3); + expect( + (response.ok.mock.calls[0][0]?.body as any)?.data[0].pending_actions.unisolate + ).toEqual(2); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts index e98cdc4f11404..028850d4f2afc 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts @@ -41,7 +41,7 @@ import { findAllUnenrolledAgentIds } from './support/unenroll'; import { getAllEndpointPackagePolicies } from './support/endpoint_package_policies'; import { findAgentIdsByStatus } from './support/agent_status'; import { EndpointAppContextService } from '../../endpoint_app_context_services'; -import { fleetAgentStatusToEndpointHostStatus } from '../../utils'; +import { catchAndWrapError, fleetAgentStatusToEndpointHostStatus } from '../../utils'; import { queryResponseToHostListResult, queryResponseToHostResult, @@ -194,7 +194,9 @@ export async function getHostMetaData( const query = getESQueryHostMetadataByID(id); - const response = await esClient.asCurrentUser.search(query); + const response = await esClient.asCurrentUser + .search(query) + .catch(catchAndWrapError); const hostResult = queryResponseToHostResult(response.body); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions.ts index b25b599517300..8104c51068182 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions.ts @@ -148,7 +148,7 @@ const getActivityLog = async ({ }; const hasAckInResponse = (response: EndpointActionResponse): boolean => { - return typeof response.action_data.ack !== 'undefined'; + return response.action_response?.endpoint?.ack ?? false; }; // return TRUE if for given action_id/agent_id @@ -222,8 +222,6 @@ export const getPendingActionCounts = async ( agentIDs ); - // - const pending: EndpointPendingActions[] = []; for (const agentId of agentIDs) { const agentResponses = responses[agentId]; @@ -270,11 +268,11 @@ export const getPendingActionCounts = async ( }; /** - * Returns a boolean for search result + * Returns a string of action ids for search result * * @param esClient * @param actionIds - * @param agentIds + * @param agentId */ const hasEndpointResponseDoc = async ({ actionIds, @@ -307,7 +305,7 @@ const hasEndpointResponseDoc = async ({ }; /** - * Returns back a map of elastic Agent IDs to array of Action IDs that have received a response. + * Returns back a map of elastic Agent IDs to array of action responses that have a response. * * @param esClient * @param metadataService diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/README.md b/x-pack/plugins/security_solution/server/lib/detection_engine/README.md index 5806df1de0e3d..a2385e15a1bf2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/README.md +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/README.md @@ -152,8 +152,8 @@ logging.events: ``` See these two README.md's pages for more references on the alerting and actions API: -https://github.com/elastic/kibana/blob/master/x-pack/plugins/alerting/README.md -https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions +https://github.com/elastic/kibana/blob/main/x-pack/plugins/alerting/README.md +https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions ### Signals API diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.test.ts index 2f63a184875f1..f28d78e5c0304 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.test.ts @@ -77,17 +77,6 @@ describe('legacy_inject_rule_id_references', () => { expect(logger.error).not.toHaveBeenCalled(); }); - test('logs an error if found with a different saved object reference id', () => { - legacyInjectRuleIdReferences({ - logger, - ruleAlertId: '456', - savedObjectReferences: mockSavedObjectReferences(), - }); - expect(logger.error).toBeCalledWith( - 'The id of the "saved object reference id": 123 is not the same as the "saved object id": 456. Preferring and using the "saved object reference id" instead of the "saved object id"' - ); - }); - test('logs an error if the saved object references is empty', () => { legacyInjectRuleIdReferences({ logger, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.ts index 5cb32c6563157..b6ad98eb864ed 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/legacy_saved_object_references/legacy_inject_rule_id_references.ts @@ -32,19 +32,6 @@ export const legacyInjectRuleIdReferences = ({ return reference.name === 'alert_0'; }); if (referenceFound) { - if (referenceFound.id !== ruleAlertId) { - // This condition should not be reached but we log an error if we encounter it to help if we migrations - // did not run correctly or we create a regression in the future. - logger.error( - [ - 'The id of the "saved object reference id": ', - referenceFound.id, - ' is not the same as the "saved object id": ', - ruleAlertId, - '. Preferring and using the "saved object reference id" instead of the "saved object id"', - ].join('') - ); - } return referenceFound.id; } else { logger.error( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts index 2f5f8ac846954..fc88e7b8b2be0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts @@ -11,6 +11,7 @@ import { coreMock } from 'src/core/server/mocks'; import { ActionsApiRequestHandlerContext } from '../../../../../../actions/server'; import { AlertingApiRequestHandlerContext } from '../../../../../../alerting/server'; import { rulesClientMock } from '../../../../../../alerting/server/mocks'; +import { actionsClientMock } from '../../../../../../actions/server/mocks'; import { licensingMock } from '../../../../../../licensing/server/mocks'; import { listMock } from '../../../../../../lists/server/mocks'; import { ruleRegistryMocks } from '../../../../../../rule_registry/server/mocks'; @@ -44,6 +45,7 @@ const createMockClients = () => { exceptionListClient: listMock.getExceptionListClient(core.savedObjects.client), }, rulesClient: rulesClientMock.create(), + actionsClient: actionsClientMock.create(), ruleDataService: ruleRegistryMocks.createRuleDataService(), config: createMockConfig(), @@ -65,7 +67,9 @@ const createRequestContextMock = ( return { core: clients.core, securitySolution: createSecuritySolutionRequestContextMock(clients), - actions: {} as unknown as jest.Mocked, + actions: { + getActionsClient: jest.fn(() => clients.actionsClient), + } as unknown as jest.Mocked, alerting: { getRulesClient: jest.fn(() => clients.rulesClient), } as unknown as jest.Mocked, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/check_template_version.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/check_template_version.ts index 974d18292a078..0040b5f30afb4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/check_template_version.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/check_template_version.ts @@ -43,10 +43,12 @@ export const templateNeedsUpdate = async ({ export const fieldAliasesOutdated = async (esClient: ElasticsearchClient, index: string) => { const { body: indexMappings } = await esClient.indices.get({ index }); - for (const [_, mapping] of Object.entries(indexMappings)) { - const aliasesVersion = get(mapping.mappings?._meta, ALIAS_VERSION_FIELD) ?? 0; - if (aliasesVersion < SIGNALS_FIELD_ALIASES_VERSION) { - return true; + for (const [indexName, mapping] of Object.entries(indexMappings)) { + if (indexName.startsWith(`${index}-`)) { + const aliasesVersion = get(mapping.mappings?._meta, ALIAS_VERSION_FIELD) ?? 0; + if (aliasesVersion < SIGNALS_FIELD_ALIASES_VERSION) { + return true; + } } } return false; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts index b011fd3fcd247..09c76344ba8e7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/create_index_route.ts @@ -5,12 +5,12 @@ * 2.0. */ -import { get } from 'lodash'; +import { chunk, get } from 'lodash'; import { estypes } from '@elastic/elasticsearch'; import { ElasticsearchClient } from 'src/core/server'; import { transformError, - getIndexExists, + getBootstrapIndexExists, getPolicyExists, setPolicy, createBootstrapIndex, @@ -25,6 +25,8 @@ import { getSignalsTemplate, SIGNALS_TEMPLATE_VERSION, createBackwardsCompatibilityMapping, + ALIAS_VERSION_FIELD, + SIGNALS_FIELD_ALIASES_VERSION, } from './get_signals_template'; import { ensureMigrationCleanupPolicy } from '../../migrations/migration_cleanup'; import signalsPolicy from './signals_policy.json'; @@ -71,7 +73,10 @@ export const createDetectionIndex = async ( const spaceId = context.getSpaceId(); const index = siemClient.getSignalsIndex(); - const indexExists = await getIndexExists(esClient, index); + const indexExists = await getBootstrapIndexExists( + context.core.elasticsearch.client.asInternalUser, + index + ); const { ruleRegistryEnabled } = config.experimentalFeatures; // If using the rule registry implementation, we don't want to create new .siem-signals indices - @@ -124,6 +129,11 @@ export const createDetectionIndex = async ( } }; +// This function can be expensive if there are lots of existing .siem-signals indices +// because any new backwards compatibility mappings need to be applied to all of them +// while also preserving the original 'version' of the mapping. To do it somewhat efficiently, +// we first group the indices by version and exclude any that already have up-to-date +// aliases. Then we start updating the mappings sequentially in chunks. const addFieldAliasesToIndices = async ({ esClient, index, @@ -132,14 +142,34 @@ const addFieldAliasesToIndices = async ({ index: string; }) => { const { body: indexMappings } = await esClient.indices.get({ index }); + const indicesByVersion: Record = {}; + const versions: Set = new Set(); for (const [indexName, mapping] of Object.entries(indexMappings)) { - const currentVersion: number | undefined = get(mapping.mappings?._meta, 'version'); - const body = createBackwardsCompatibilityMapping(currentVersion ?? 0); - await esClient.indices.putMapping({ - index: indexName, - body, - allow_no_indices: true, - } as estypes.IndicesPutMappingRequest); + const version: number = get(mapping.mappings?._meta, 'version') ?? 0; + const aliasesVersion: number = get(mapping.mappings?._meta, ALIAS_VERSION_FIELD) ?? 0; + // Only attempt to add backwards compatibility mappings to indices whose names start with the alias + // This limits us to legacy .siem-signals indices, since alerts as data indices use a different naming + // scheme (but have the same alias, so will also be returned by the "get" request) + if ( + indexName.startsWith(`${index}-`) && + isOutdated({ current: aliasesVersion, target: SIGNALS_FIELD_ALIASES_VERSION }) + ) { + indicesByVersion[version] = indicesByVersion[version] + ? [...indicesByVersion[version], indexName] + : [indexName]; + versions.add(version); + } + } + for (const version of versions) { + const body = createBackwardsCompatibilityMapping(version); + const indexNameChunks = chunk(indicesByVersion[version], 20); + for (const indexNameChunk of indexNameChunks) { + await esClient.indices.putMapping({ + index: indexNameChunk, + body, + allow_no_indices: true, + } as estypes.IndicesPutMappingRequest); + } } }; @@ -152,7 +182,7 @@ const addFieldAliasesToIndices = async ({ // index: string; // aadIndexAliasName: string; // }) => { -// const { body: indices } = await esClient.indices.getAlias({ name: index }); +// const { body: indices } = await esClient.indices.getAlias({ index: `${index}-*`, name: index }); // const aliasActions = { // actions: Object.keys(indices).map((concreteIndexName) => { // return { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts index 4cfedd5dcaa01..164743b8b8bb2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index/read_index_route.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { transformError, getIndexExists } from '@kbn/securitysolution-es-utils'; +import { transformError, getBootstrapIndexExists } from '@kbn/securitysolution-es-utils'; import { parseExperimentalConfigValue } from '../../../../../common/experimental_features'; import { ConfigType } from '../../../../config'; import type { SecuritySolutionPluginRouter } from '../../../../types'; @@ -41,7 +41,10 @@ export const readIndexRoute = (router: SecuritySolutionPluginRouter, config: Con const { ruleRegistryEnabled } = parseExperimentalConfigValue(config.enableExperimental); const index = siemClient.getSignalsIndex(); - const indexExists = await getIndexExists(esClient, index); + const indexExists = await getBootstrapIndexExists( + context.core.elasticsearch.client.asInternalUser, + index + ); if (indexExists) { let mappingOutdated: boolean | null = null; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index 23779afdc5410..86be61e8f9c99 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -53,6 +53,7 @@ describe.each([ clients.rulesClient.update.mockResolvedValue( getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()) ); + clients.actionsClient.getAll.mockResolvedValue([]); context.core.elasticsearch.client.asCurrentUser.search.mockResolvedValue( elasticsearchClientMock.createSuccessTransportRequestPromise(getBasicEmptySearchResponse()) ); @@ -77,21 +78,6 @@ describe.each([ status_code: 500, }); }); - - test('returns 404 if alertClient is not available on the route', async () => { - context.alerting.getRulesClient = jest.fn(); - const response = await server.inject(request, context); - expect(response.status).toEqual(404); - expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); - }); - - it('returns 404 if siem client is unavailable', async () => { - const { securitySolution, ...contextWithoutSecuritySolution } = context; - // @ts-expect-error - const response = await server.inject(request, contextWithoutSecuritySolution); - expect(response.status).toEqual(404); - expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); - }); }); describe('unhappy paths', () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts index 3752128d3daa3..187de40d33df0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -41,7 +41,7 @@ import { import { patchRules } from '../../rules/patch_rules'; import { legacyMigrate } from '../../rules/utils'; -import { getTupleDuplicateErrorsAndUniqueRules } from './utils'; +import { getTupleDuplicateErrorsAndUniqueRules, getInvalidConnectors } from './utils'; import { createRulesStreamFromNdJson } from '../../rules/create_rules_stream_from_ndjson'; import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import { HapiReadableStream } from '../../rules/types'; @@ -78,14 +78,11 @@ export const importRulesRoute = ( const siemResponse = buildSiemResponse(response); try { - const rulesClient = context.alerting?.getRulesClient(); + const rulesClient = context.alerting.getRulesClient(); + const actionsClient = context.actions.getActionsClient(); const esClient = context.core.elasticsearch.client; const savedObjectsClient = context.core.savedObjects.client; - const siemClient = context.securitySolution?.getAppClient(); - - if (!siemClient || !rulesClient) { - return siemResponse.error({ statusCode: 404 }); - } + const siemClient = context.securitySolution.getAppClient(); const mlAuthz = buildMlAuthz({ license: context.licensing.license, @@ -103,6 +100,7 @@ export const importRulesRoute = ( body: `Invalid file extension ${fileExtension}`, }); } + const signalsIndex = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(esClient.asCurrentUser, signalsIndex); if (!isRuleRegistryEnabled && !indexExists) { @@ -118,14 +116,24 @@ export const importRulesRoute = ( request.body.file as HapiReadableStream, ...readStream, ]); - const [duplicateIdErrors, uniqueParsedObjects] = getTupleDuplicateErrorsAndUniqueRules( - parsedObjects, - request.query.overwrite + + const [duplicateIdErrors, parsedObjectsWithoutDuplicateErrors] = + getTupleDuplicateErrorsAndUniqueRules(parsedObjects, request.query.overwrite); + + const [nonExistentActionErrors, uniqueParsedObjects] = await getInvalidConnectors( + parsedObjectsWithoutDuplicateErrors, + actionsClient ); const chunkParseObjects = chunk(CHUNK_PARSED_OBJECT_SIZE, uniqueParsedObjects); let importRuleResponse: ImportRuleResponse[] = []; + // If we had 100% errors and no successful rule could be imported we still have to output an error. + // otherwise we would output we are success importing 0 rules. + if (chunkParseObjects.length === 0) { + importRuleResponse = [...nonExistentActionErrors, ...duplicateIdErrors]; + } + while (chunkParseObjects.length) { const batchParseObjects = chunkParseObjects.shift() ?? []; const newImportRuleResponse = await Promise.all( @@ -362,6 +370,7 @@ export const importRulesRoute = ( }, []) ); importRuleResponse = [ + ...nonExistentActionErrors, ...duplicateIdErrors, ...importRuleResponse, ...newImportRuleResponse, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index d8b7e8cb2b724..067f7b80dfca1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -78,7 +78,7 @@ export const updateRulesBulkRoute = ( id: payloadRule.id, }); - await legacyMigrate({ + const migratedRule = await legacyMigrate({ rulesClient, savedObjectsClient, rule: existingRule, @@ -88,8 +88,9 @@ export const updateRulesBulkRoute = ( spaceId: context.securitySolution.getSpaceId(), rulesClient, ruleStatusClient, - savedObjectsClient, defaultOutputIndex: siemClient.getSignalsIndex(), + existingRule, + migratedRule, ruleUpdate: payloadRule, isRuleRegistryEnabled, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts index cf443e3293510..543591c415a6b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -69,7 +69,7 @@ export const updateRulesRoute = ( id: request.body.id, }); - await legacyMigrate({ + const migratedRule = await legacyMigrate({ rulesClient, savedObjectsClient, rule: existingRule, @@ -79,7 +79,8 @@ export const updateRulesRoute = ( isRuleRegistryEnabled, rulesClient, ruleStatusClient, - savedObjectsClient, + existingRule, + migratedRule, ruleUpdate: request.body, spaceId: context.securitySolution.getSpaceId(), }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts index 366ae607f0ba8..2dfc98fd3ba2f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.test.ts @@ -18,6 +18,7 @@ import { transformAlertsToRules, getDuplicates, getTupleDuplicateErrorsAndUniqueRules, + getInvalidConnectors, } from './utils'; import { getAlertMock } from '../__mocks__/request_responses'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; @@ -36,6 +37,8 @@ import { getQueryRuleParams, getThreatRuleParams, } from '../../schemas/rule_schemas.mock'; +import { requestContextMock } from '../__mocks__'; + // eslint-disable-next-line no-restricted-imports import { LegacyRulesActionsSavedObject } from '../../rule_actions/legacy_get_rule_actions_saved_object'; // eslint-disable-next-line no-restricted-imports @@ -47,6 +50,8 @@ describe.each([ ['Legacy', false], ['RAC', true], ])('utils - %s', (_, isRuleRegistryEnabled) => { + const { clients } = requestContextMock.createTools(); + describe('transformAlertToRule', () => { test('should work with a full data set', () => { const fullRule = getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()); @@ -529,6 +534,7 @@ describe.each([ describe('getTupleDuplicateErrorsAndUniqueRules', () => { test('returns tuple of empty duplicate errors array and rule array with instance of Syntax Error when imported rule contains parse error', async () => { + // This is a string because we have a double "::" below to make an error happen on purpose. const multipartPayload = '{"name"::"Simple Rule Query","description":"Simple Rule Query","risk_score":1,"rule_id":"rule-1","severity":"high","type":"query","query":"user.name: root or user.name: admin"}\n'; const ndJsonStream = new Readable({ @@ -645,4 +651,469 @@ describe.each([ expect(errors.length).toEqual(0); }); }); + + describe('getInvalidConnectors', () => { + beforeEach(() => { + clients.actionsClient.getAll.mockReset(); + }); + + test('returns empty errors array and rule array with instance of Syntax Error when imported rule contains parse error', async () => { + // This is a string because we have a double "::" below to make an error happen on purpose. + const multipartPayload = + '{"name"::"Simple Rule Query","description":"Simple Rule Query","risk_score":1,"rule_id":"rule-1","severity":"high","type":"query","query":"user.name: root or user.name: admin"}\n'; + const ndJsonStream = new Readable({ + read() { + this.push(multipartPayload); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + const isInstanceOfError = output[0] instanceof Error; + + expect(isInstanceOfError).toEqual(true); + expect(errors.length).toEqual(0); + }); + + test('creates error with a rule has an action that does not exist within the actions client', async () => { + const rule: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(output.length).toEqual(0); + expect(errors).toEqual([ + { + error: { + message: '1 connector is missing. Connector id missing is: 123', + status_code: 404, + }, + rule_id: 'rule-1', + }, + ]); + }); + + test('creates output with no errors if 1 rule with an action exists within the actions client', async () => { + const rule: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([ + { + id: '123', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + ]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(errors.length).toEqual(0); + expect(output.length).toEqual(1); + expect(output[0]).toEqual(expect.objectContaining(rule)); + }); + + test('creates output with no errors if 1 rule with 2 actions exists within the actions client', async () => { + const rule: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + { + group: 'default', + id: '789', + action_type_id: '101112', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([ + { + id: '123', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + { + id: '789', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + ]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(errors.length).toEqual(0); + expect(output.length).toEqual(1); + expect(output[0]).toEqual(expect.objectContaining(rule)); + }); + + test('creates output with no errors if 2 rules with 1 action each exists within the actions client', async () => { + const rule1: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + ], + }; + const rule2: ReturnType = { + ...getCreateRulesSchemaMock('rule-2'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule1)}\n`); + this.push(`${JSON.stringify(rule2)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([ + { + id: '123', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + { + id: '789', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + ]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(errors.length).toEqual(0); + expect(output.length).toEqual(2); + expect(output[0]).toEqual(expect.objectContaining(rule1)); + expect(output[1]).toEqual(expect.objectContaining(rule2)); + }); + + test('creates output with 1 error if 2 rules with 1 action each exists within the actions client but 1 has a nonexistent action', async () => { + const rule1: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + ], + }; + const rule2: ReturnType = { + ...getCreateRulesSchemaMock('rule-2'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + { + group: 'default', + id: '456', // <--- Non-existent that triggers the error. + action_type_id: '456', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule1)}\n`); + this.push(`${JSON.stringify(rule2)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([ + { + id: '123', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + { + id: '789', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + ]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(errors.length).toEqual(1); + expect(output.length).toEqual(1); + expect(output[0]).toEqual(expect.objectContaining(rule1)); + expect(errors).toEqual([ + { + error: { + message: '1 connector is missing. Connector id missing is: 456', + status_code: 404, + }, + rule_id: 'rule-2', + }, + ]); + }); + + test('creates output with error if 1 rule with 2 actions but 1 action does not exist within the actions client', async () => { + const rule: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + { + group: 'default', + id: '789', + action_type_id: '101112', + params: {}, + }, + { + group: 'default', + id: '101112', // <-- Does not exist + action_type_id: '101112', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([ + { + id: '123', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + { + id: '789', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + ]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(errors.length).toEqual(1); + expect(output.length).toEqual(0); + expect(errors).toEqual([ + { + error: { + message: '1 connector is missing. Connector id missing is: 101112', + status_code: 404, + }, + rule_id: 'rule-1', + }, + ]); + }); + + test('creates output with 2 errors if 3 rules with actions but 1 action does not exist within the actions client', async () => { + const rule1: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + { + group: 'default', + id: '789', + action_type_id: '101112', + params: {}, + }, + { + group: 'default', + id: '101112', // <-- Does not exist + action_type_id: '101112', + params: {}, + }, + ], + }; + const rule2: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + { + group: 'default', + id: '789', + action_type_id: '101112', + params: {}, + }, + ], + }; + const rule3: ReturnType = { + ...getCreateRulesSchemaMock('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + { + group: 'default', + id: '789', + action_type_id: '101112', + params: {}, + }, + { + group: 'default', + id: '101112', // <-- Does not exist + action_type_id: '101112', + params: {}, + }, + ], + }; + const ndJsonStream = new Readable({ + read() { + this.push(`${JSON.stringify(rule1)}\n`); + this.push(`${JSON.stringify(rule2)}\n`); + this.push(`${JSON.stringify(rule3)}\n`); + this.push(null); + }, + }); + const rulesObjectsStream = createRulesStreamFromNdJson(1000); + const parsedObjects = await createPromiseFromStreams([ + ndJsonStream, + ...rulesObjectsStream, + ]); + clients.actionsClient.getAll.mockResolvedValue([ + { + id: '123', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + { + id: '789', + referencedByCount: 1, + actionTypeId: 'default', + name: 'name', + isPreconfigured: false, + }, + ]); + const [errors, output] = await getInvalidConnectors(parsedObjects, clients.actionsClient); + expect(errors.length).toEqual(2); + expect(output.length).toEqual(1); + expect(output[0]).toEqual(expect.objectContaining(rule2)); + expect(errors).toEqual([ + { + error: { + message: '1 connector is missing. Connector id missing is: 101112', + status_code: 404, + }, + rule_id: 'rule-1', + }, + { + error: { + message: '1 connector is missing. Connector id missing is: 101112', + status_code: 404, + }, + rule_id: 'rule-1', + }, + ]); + }); + }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts index bb2e35d189ca1..7472d41b9ab77 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/utils.ts @@ -13,6 +13,7 @@ import { RulesSchema } from '../../../../../common/detection_engine/schemas/resp import { ImportRulesSchemaDecoded } from '../../../../../common/detection_engine/schemas/request/import_rules_schema'; import { CreateRulesBulkSchema } from '../../../../../common/detection_engine/schemas/request/create_rules_bulk_schema'; import { PartialAlert, FindResult } from '../../../../../../alerting/server'; +import { ActionsClient } from '../../../../../../actions/server'; import { INTERNAL_IDENTIFIER } from '../../../../../common/constants'; import { RuleAlertType, @@ -194,3 +195,57 @@ export const getTupleDuplicateErrorsAndUniqueRules = ( return [Array.from(errors.values()), Array.from(rulesAcc.values())]; }; + +/** + * Given a set of rules and an actions client this will return connectors that are invalid + * such as missing connectors and filter out the rules that have invalid connectors. + * @param rules The rules to check for invalid connectors + * @param actionsClient The actions client to get all the connectors. + * @returns An array of connector errors if it found any and then the promise stream of valid and invalid connectors. + */ +export const getInvalidConnectors = async ( + rules: PromiseFromStreams[], + actionsClient: ActionsClient +): Promise<[BulkError[], PromiseFromStreams[]]> => { + const actionsFind = await actionsClient.getAll(); + const actionIds = new Set(actionsFind.map((action) => action.id)); + const { errors, rulesAcc } = rules.reduce( + (acc, parsedRule) => { + if (parsedRule instanceof Error) { + acc.rulesAcc.set(uuid.v4(), parsedRule); + } else { + const { rule_id: ruleId, actions } = parsedRule; + const missingActionIds = actions.flatMap((action) => { + if (!actionIds.has(action.id)) { + return [action.id]; + } else { + return []; + } + }); + if (missingActionIds.length === 0) { + acc.rulesAcc.set(ruleId, parsedRule); + } else { + const errorMessage = + missingActionIds.length > 1 + ? 'connectors are missing. Connector ids missing are:' + : 'connector is missing. Connector id missing is:'; + acc.errors.set( + uuid.v4(), + createBulkErrorObject({ + ruleId, + statusCode: 404, + message: `${missingActionIds.length} ${errorMessage} ${missingActionIds.join(', ')}`, + }) + ); + } + } + return acc; + }, // using map (preserves ordering) + { + errors: new Map(), + rulesAcc: new Map(), + } + ); + + return [Array.from(errors.values()), Array.from(rulesAcc.values())]; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts index 07c3bc37e7d72..39ccf9f158422 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals.test.ts @@ -15,16 +15,21 @@ import { getSuccessfulSignalUpdateResponse, } from '../__mocks__/request_responses'; import { requestContextMock, serverMock, requestMock } from '../__mocks__'; +import { SetupPlugins } from '../../../../plugin'; +import { createMockTelemetryEventsSender } from '../../../telemetry/__mocks__'; import { setSignalsStatusRoute } from './open_close_signals_route'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { elasticsearchClientMock } from 'src/core/server/elasticsearch/client/mocks'; +import { loggingSystemMock } from 'src/core/server/mocks'; describe('set signal status', () => { let server: ReturnType; let { context } = requestContextMock.createTools(); + let logger: ReturnType; beforeEach(() => { server = serverMock.create(); + logger = loggingSystemMock.createLogger(); ({ context } = requestContextMock.createTools()); context.core.elasticsearch.client.asCurrentUser.updateByQuery.mockResolvedValue( @@ -32,8 +37,13 @@ describe('set signal status', () => { getSuccessfulSignalUpdateResponse() ) ); - - setSignalsStatusRoute(server.router); + const telemetrySenderMock = createMockTelemetryEventsSender(); + const securityMock = { + authc: { + getCurrentUser: jest.fn().mockReturnValue({ user: { username: 'my-username' } }), + }, + } as unknown as SetupPlugins['security']; + setSignalsStatusRoute(server.router, logger, securityMock, telemetrySenderMock); }); describe('status on signal', () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index e54cc94b886f6..c29a9d9a5d7eb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -5,8 +5,10 @@ * 2.0. */ +import { get } from 'lodash'; import { transformError } from '@kbn/securitysolution-es-utils'; import { ALERT_WORKFLOW_STATUS } from '@kbn/rule-data-utils'; +import { Logger } from 'src/core/server'; import { setSignalStatusValidateTypeDependents } from '../../../../../common/detection_engine/schemas/request/set_signal_status_type_dependents'; import { SetSignalsStatusSchemaDecoded, @@ -15,10 +17,21 @@ import { import type { SecuritySolutionPluginRouter } from '../../../../types'; import { DETECTION_ENGINE_SIGNALS_STATUS_URL } from '../../../../../common/constants'; import { buildSiemResponse } from '../utils'; - +import { TelemetryEventsSender } from '../../../telemetry/sender'; +import { INSIGHTS_CHANNEL } from '../../../telemetry/constants'; +import { SetupPlugins } from '../../../../plugin'; import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; +import { + getSessionIDfromKibanaRequest, + createAlertStatusPayloads, +} from '../../../telemetry/insights'; -export const setSignalsStatusRoute = (router: SecuritySolutionPluginRouter) => { +export const setSignalsStatusRoute = ( + router: SecuritySolutionPluginRouter, + logger: Logger, + security: SetupPlugins['security'], + sender: TelemetryEventsSender +) => { router.post( { path: DETECTION_ENGINE_SIGNALS_STATUS_URL, @@ -46,6 +59,30 @@ export const setSignalsStatusRoute = (router: SecuritySolutionPluginRouter) => { return siemResponse.error({ statusCode: 404 }); } + const clusterId = sender.getClusterID(); + const [isTelemetryOptedIn, username] = await Promise.all([ + sender.isTelemetryOptedIn(), + security?.authc.getCurrentUser(request)?.username, + ]); + if (isTelemetryOptedIn && clusterId) { + // Sometimes the ids are in the query not passed in the request? + const toSendAlertIds = get(query, 'bool.filter.terms._id') || signalIds; + // Get Context for Insights Payloads + const sessionId = getSessionIDfromKibanaRequest(clusterId, request); + if (username && toSendAlertIds && sessionId && status) { + const insightsPayloads = createAlertStatusPayloads( + clusterId, + toSendAlertIds, + sessionId, + username, + DETECTION_ENGINE_SIGNALS_STATUS_URL, + status + ); + logger.debug(`Sending Insights Payloads ${JSON.stringify(insightsPayloads)}`); + await sender.sendOnDemand(INSIGHTS_CHANNEL, insightsPayloads); + } + } + let queryObject; if (signalIds) { queryObject = { ids: { values: signalIds } }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts index c2e4b926d6375..7d808777feb3c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts @@ -295,7 +295,7 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = ?.kibana_siem_app_url, }); - logger.info( + logger.debug( buildRuleMessage(`Found ${createdSignalsCount} signals for notification.`) ); @@ -346,8 +346,7 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = }); } - // adding this log line so we can get some information from cloud - logger.info( + logger.debug( buildRuleMessage( `[+] Finished indexing ${createdSignalsCount} ${ !isEmpty(tuples) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/field_maps/cti.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/field_maps/cti.ts new file mode 100644 index 0000000000000..daf54e4f7cf5c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/field_maps/cti.ts @@ -0,0 +1,154 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const ctiFieldMap = { + 'threat.indicator': { + type: 'nested', + array: false, + required: false, + }, + 'threat.indicator.as.number': { + type: 'long', + array: false, + required: false, + }, + 'threat.indicator.as.organization.name': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.confidence': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.dataset': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.description': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.domain': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.email.address': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.first_seen': { + type: 'date', + array: false, + required: false, + }, + 'threat.indicator.geo.city_name': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.geo.continent_name': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.geo.country_iso_code': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.geo.country_name': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.geo.location': { + type: 'geo_point', + array: false, + required: false, + }, + 'threat.indicator.geo.name': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.geo.region_iso_code': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.geo.region_name': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.ip': { + type: 'ip', + array: false, + required: false, + }, + 'threat.indicator.last_seen': { + type: 'date', + array: false, + required: false, + }, + 'threat.indicator.marking.tlp': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.matched.atomic': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.matched.field': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.matched.type': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.module': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.port': { + type: 'long', + array: false, + required: false, + }, + 'threat.indicator.provider': { + type: 'keyword', + array: false, + required: false, + }, + 'threat.indicator.scanner_stats': { + type: 'long', + array: false, + required: false, + }, + 'threat.indicator.sightings': { + type: 'long', + array: false, + required: false, + }, + 'threat.indicator.type': { + type: 'keyword', + array: false, + required: false, + }, +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.test.ts index 1bd3d411adf11..576e409378213 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/create_indicator_match_alert_type.test.ts @@ -42,7 +42,7 @@ describe('Indicator Match Alerts', () => { { field: 'file.hash.md5', type: 'mapping', - value: 'threat.indicator.file.hash.md5', + value: 'threatintel.indicator.file.hash.md5', }, ], }, @@ -156,11 +156,11 @@ describe('Indicator Match Alerts', () => { ...sampleDocNoSortId(v4()), _source: { ...sampleDocNoSortId(v4())._source, - 'threat.indicator.file.hash.md5': 'a1b2c3', + 'threatintel.indicator.file.hash.md5': 'a1b2c3', }, fields: { ...sampleDocNoSortId(v4()).fields, - 'threat.indicator.file.hash.md5': ['a1b2c3'], + 'threatintel.indicator.file.hash.md5': ['a1b2c3'], }, }, ], diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/scripts/create_rule_indicator_match.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/scripts/create_rule_indicator_match.sh index 5beaea5e14475..f50aac30a69c5 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/scripts/create_rule_indicator_match.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/scripts/create_rule_indicator_match.sh @@ -46,7 +46,7 @@ curl -X POST ${KIBANA_URL}${SPACE_URL}/api/alerts/alert \ { "field":"file.hash.md5", "type":"mapping", - "value":"threat.indicator.file.hash.md5" + "value":"threatintel.indicator.file.hash.md5" } ] } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts index d4357c45fd373..799412a33ffbc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/create_rules_stream_from_ndjson.ts @@ -24,6 +24,7 @@ import { filterExportedRulesCounts, filterExceptions, createLimitStream, + filterExportedCounts, } from '../../../utils/read_stream/create_stream_from_ndjson'; export const validateRules = (): Transform => { @@ -60,6 +61,7 @@ export const createRulesStreamFromNdJson = (ruleLimit: number) => { return [ createSplitStream('\n'), parseNdjsonStrings(), + filterExportedCounts(), filterExportedRulesCounts(), filterExceptions(), validateRules(), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_timelines/README.md b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_timelines/README.md index 1b8516ee16012..09257371bca60 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_timelines/README.md +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_timelines/README.md @@ -4,7 +4,7 @@ -1. [Have the env params set up](https://github.com/elastic/kibana/blob/master/x-pack/plugins/security_solution/server/lib/detection_engine/README.md) +1. [Have the env params set up](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/README.md) 2. Create a new timelines template into `x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_timelines` diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts index a4ef081154010..bfc857f7a12cf 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/types.ts @@ -275,8 +275,9 @@ export interface UpdateRulesOptions { ruleStatusClient: IRuleExecutionLogClient; rulesClient: RulesClient; defaultOutputIndex: string; + existingRule: SanitizedAlert | null | undefined; + migratedRule: SanitizedAlert | null | undefined; ruleUpdate: UpdateRulesSchema; - savedObjectsClient: SavedObjectsClientContract; } export interface PatchRulesOptions { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts index 9a7711fcc8987..b98a95ed1aabc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.mock.ts @@ -12,6 +12,8 @@ import { getUpdateRulesSchemaMock, } from '../../../../common/detection_engine/schemas/request/rule_schemas.mock'; import { ruleExecutionLogClientMock } from '../rule_execution_log/__mocks__/rule_execution_log_client'; +import { getAlertMock } from '../routes/__mocks__/request_responses'; +import { getQueryRuleParams } from '../schemas/rule_schemas.mock'; export const getUpdateRulesOptionsMock = (isRuleRegistryEnabled: boolean) => ({ spaceId: 'default', @@ -19,6 +21,8 @@ export const getUpdateRulesOptionsMock = (isRuleRegistryEnabled: boolean) => ({ ruleStatusClient: ruleExecutionLogClientMock.create(), savedObjectsClient: savedObjectsClientMock.create(), defaultOutputIndex: '.siem-signals-default', + existingRule: getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()), + migratedRule: getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()), ruleUpdate: getUpdateRulesSchemaMock(), isRuleRegistryEnabled, }); @@ -29,6 +33,8 @@ export const getUpdateMlRulesOptionsMock = (isRuleRegistryEnabled: boolean) => ( ruleStatusClient: ruleExecutionLogClientMock.create(), savedObjectsClient: savedObjectsClientMock.create(), defaultOutputIndex: '.siem-signals-default', + existingRule: getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()), + migratedRule: getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()), ruleUpdate: getUpdateMachineLearningSchemaMock(), isRuleRegistryEnabled, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts index 703be3bdd76bd..6020fce9c4909 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.test.ts @@ -37,11 +37,8 @@ describe.each([ it('should call rulesClient.enable if the rule was disabled and enabled is true', async () => { const rulesOptionsMock = getUpdateRulesOptionsMock(isRuleRegistryEnabled); rulesOptionsMock.ruleUpdate.enabled = true; + rulesOptionsMock.existingRule.enabled = false; - (rulesOptionsMock.rulesClient as unknown as RulesClientMock).resolve.mockResolvedValue({ - ...resolveAlertMock(isRuleRegistryEnabled, getQueryRuleParams()), - enabled: false, - }); (rulesOptionsMock.rulesClient as unknown as RulesClientMock).update.mockResolvedValue( getAlertMock(isRuleRegistryEnabled, getQueryRuleParams()) ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts index 4268ed9014066..ae16d0435e3dc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts @@ -10,13 +10,19 @@ import { validate } from '@kbn/securitysolution-io-ts-utils'; import { DEFAULT_MAX_SIGNALS } from '../../../../common/constants'; import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { PartialAlert } from '../../../../../alerting/server'; -import { readRules } from './read_rules'; + import { UpdateRulesOptions } from './types'; import { addTags } from './add_tags'; import { typeSpecificSnakeToCamel } from '../schemas/rule_converters'; import { internalRuleUpdate, RuleParams } from '../schemas/rule_schemas'; import { enableRule } from './enable_rule'; -import { maybeMute, transformToAlertThrottle, transformToNotifyWhen } from './utils'; +import { + maybeMute, + transformToAlertThrottle, + transformToNotifyWhen, + updateActions, + updateThrottleNotifyWhen, +} from './utils'; class UpdateError extends Error { public readonly statusCode: number; @@ -27,20 +33,14 @@ class UpdateError extends Error { } export const updateRules = async ({ - isRuleRegistryEnabled, spaceId, rulesClient, ruleStatusClient, defaultOutputIndex, + existingRule, + migratedRule, ruleUpdate, - savedObjectsClient, }: UpdateRulesOptions): Promise | null> => { - const existingRule = await readRules({ - isRuleRegistryEnabled, - rulesClient, - ruleId: ruleUpdate.rule_id, - id: ruleUpdate.id, - }); if (existingRule == null) { return null; } @@ -86,9 +86,24 @@ export const updateRules = async ({ ...typeSpecificParams, }, schedule: { interval: ruleUpdate.interval ?? '5m' }, - actions: ruleUpdate.actions != null ? ruleUpdate.actions.map(transformRuleToAlertAction) : [], - throttle: transformToAlertThrottle(ruleUpdate.throttle), - notifyWhen: transformToNotifyWhen(ruleUpdate.throttle), + actions: updateActions( + transformRuleToAlertAction, + migratedRule?.actions, + existingRule.actions, + ruleUpdate?.actions + ), + throttle: updateThrottleNotifyWhen( + transformToAlertThrottle, + migratedRule?.throttle, + existingRule.throttle, + ruleUpdate?.throttle + ), + notifyWhen: updateThrottleNotifyWhen( + transformToNotifyWhen, + migratedRule?.notifyWhen, + existingRule.notifyWhen, + ruleUpdate?.throttle + ), }; const [validated, errors] = validate(newInternalRule, internalRuleUpdate); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts index a558024a73e34..c9e00486dc130 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { pickBy, isEmpty } from 'lodash/fp'; +import { pickBy, isEmpty, isEqual } from 'lodash/fp'; import type { FromOrUndefined, MachineLearningJobIdOrUndefined, @@ -64,10 +64,14 @@ import { RulesClient } from '../../../../../alerting/server'; // eslint-disable-next-line no-restricted-imports import { LegacyRuleActions } from '../rule_actions/legacy_types'; import { FullResponseSchema } from '../../../../common/detection_engine/schemas/request'; -import { transformAlertToRuleAction } from '../../../../common/detection_engine/transform_actions'; +import { + transformAlertToRuleAction, + transformRuleToAlertAction, +} from '../../../../common/detection_engine/transform_actions'; // eslint-disable-next-line no-restricted-imports import { legacyRuleActionsSavedObjectType } from '../rule_actions/legacy_saved_object_mappings'; import { LegacyMigrateParams } from './types'; +import { RuleAlertAction } from '../../../../common/detection_engine/types'; export const calculateInterval = ( interval: string | undefined, @@ -331,6 +335,10 @@ export const legacyMigrate = async ({ }), savedObjectsClient.find({ type: legacyRuleActionsSavedObjectType, + hasReference: { + type: 'alert', + id: rule.id, + }, }), ]); @@ -344,8 +352,10 @@ export const legacyMigrate = async ({ ) : null, ]); + + const { id, ...restOfRule } = rule; const migratedRule = { - ...rule, + ...restOfRule, actions: siemNotification.data[0].actions, throttle: siemNotification.data[0].schedule.interval, notifyWhen: transformToNotifyWhen(siemNotification.data[0].throttle), @@ -354,7 +364,39 @@ export const legacyMigrate = async ({ id: rule.id, data: migratedRule, }); - return migratedRule; + return { id: rule.id, ...migratedRule }; } return rule; }; + +export const updateThrottleNotifyWhen = ( + transform: typeof transformToAlertThrottle | typeof transformToNotifyWhen, + migratedRuleThrottle: string | null | undefined, + existingRuleThrottle: string | null | undefined, + ruleUpdateThrottle: string | null | undefined +) => { + if (existingRuleThrottle == null && ruleUpdateThrottle == null && migratedRuleThrottle != null) { + return migratedRuleThrottle; + } + return transform(ruleUpdateThrottle); +}; + +export const updateActions = ( + transform: typeof transformRuleToAlertAction, + migratedRuleActions: AlertAction[] | null | undefined, + existingRuleActions: AlertAction[] | null | undefined, + ruleUpdateActions: RuleAlertAction[] | null | undefined +) => { + // if the existing rule actions and the rule update actions are equivalent (aka no change) + // but the migrated actions and the ruleUpdateActions (or existing rule actions, associatively) + // are not equivalent, we know that the rules' actions were migrated and we need to apply + // that change to the update request so it is not overwritten by the rule update payload + if ( + existingRuleActions?.length === 0 && + ruleUpdateActions == null && + !isEqual(existingRuleActions, migratedRuleActions) + ) { + return migratedRuleActions; + } + return ruleUpdateActions != null ? ruleUpdateActions.map(transform) : []; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_instances.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_instances.sh index 01248d32cf025..90c7529c29802 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_instances.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_instances.sh @@ -11,7 +11,7 @@ set -e ./check_env_variables.sh # Example: ./get_action_instances.sh -# https://github.com/elastic/kibana/blob/master/x-pack/plugins/actions/README.md#get-apiaction_find-find-actions +# https://github.com/elastic/kibana/blob/main/x-pack/plugins/actions/README.md#get-apiaction_find-find-actions curl -s -k \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ -X GET ${KIBANA_URL}${SPACE_URL}/api/actions \ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_types.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_types.sh index 0aa6eeb04c28e..3b7006e02a52d 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_types.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_action_types.sh @@ -11,7 +11,7 @@ set -e ./check_env_variables.sh # Example: ./get_action_types.sh -# https://github.com/elastic/kibana/blob/master/x-pack/plugins/actions/README.md +# https://github.com/elastic/kibana/blob/main/x-pack/plugins/actions/README.md curl -s -k \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ -X GET ${KIBANA_URL}${SPACE_URL}/api/actions/connector_types \ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh index f5df0c368300c..f2ba9bb70a7c6 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh @@ -11,7 +11,7 @@ set -e ./check_env_variables.sh # Example: ./get_alert_instances.sh -# https://github.com/elastic/kibana/blob/master/x-pack/plugins/alerting/README.md#get-apialert_find-find-alerts +# https://github.com/elastic/kibana/blob/main/x-pack/plugins/alerting/README.md#get-apialert_find-find-alerts curl -s -k \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ -X GET ${KIBANA_URL}${SPACE_URL}/api/alerts/_find \ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh index 46659766bce16..9b51c289ac2c3 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh @@ -11,7 +11,7 @@ set -e ./check_env_variables.sh # Example: ./get_alert_types.sh -# https://github.com/elastic/kibana/blob/master/x-pack/plugins/alerting/README.md#get-apialerttypes-list-alert-types +# https://github.com/elastic/kibana/blob/main/x-pack/plugins/alerting/README.md#get-apialerttypes-list-alert-types curl -s -k \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ -X GET ${KIBANA_URL}${SPACE_URL}/api/alerts/list_alert_types \ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.ts index e5776899e4942..14b18a75589c8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/ml.ts @@ -105,7 +105,7 @@ export const mlExecutor = async ({ const anomalyCount = filteredAnomalyResults.hits.hits.length; if (anomalyCount) { - logger.info(buildRuleMessage(`Found ${anomalyCount} signals from ML anomalies.`)); + logger.debug(buildRuleMessage(`Found ${anomalyCount} signals from ML anomalies.`)); } const { success, errors, bulkCreateDuration, createdItemsCount, createdItems } = await bulkCreateMlSignals({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.test.ts index f0ff1b6072479..1212b73a6250e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.test.ts @@ -105,17 +105,6 @@ describe('inject_exceptions_list', () => { ).toEqual([{ ...mockExceptionsList()[0], id: '456' }]); }); - test('logs an error if found with a different saved object reference id', () => { - injectExceptionsReferences({ - logger, - exceptionsList: mockExceptionsList(), - savedObjectReferences: [{ ...mockSavedObjectReferences()[0], id: '456' }], - }); - expect(logger.error).toBeCalledWith( - 'The id of the "saved object reference id": 456 is not the same as the "saved object id": 123. Preferring and using the "saved object reference id" instead of the "saved object id"' - ); - }); - test('returns exceptionItem if the saved object reference cannot match as a fall back', () => { expect( injectExceptionsReferences({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.ts index 2e6559fbf18cf..baaaa2eb60ce9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/inject_exceptions_list.ts @@ -7,11 +7,7 @@ import { Logger, SavedObjectReference } from 'src/core/server'; import { RuleParams } from '../../schemas/rule_schemas'; -import { - getSavedObjectReferenceForExceptionsList, - logMissingSavedObjectError, - logWarningIfDifferentReferencesDetected, -} from './utils'; +import { getSavedObjectReferenceForExceptionsList, logMissingSavedObjectError } from './utils'; /** * This injects any "exceptionsList" "id"'s from saved object reference and returns the "exceptionsList" using the saved object reference. If for @@ -44,11 +40,6 @@ export const injectExceptionsReferences = ({ savedObjectReferences, }); if (savedObjectReference != null) { - logWarningIfDifferentReferencesDetected({ - logger, - savedObjectReferenceId: savedObjectReference.id, - savedObjectId: exceptionItem.id, - }); const reference: RuleParams['exceptionsList'][0] = { ...exceptionItem, id: savedObjectReference.id, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/index.ts index ca88dae364a4b..3a3d559a6ed39 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/index.ts @@ -11,4 +11,3 @@ export * from './get_saved_object_name_pattern'; export * from './get_saved_object_reference_for_exceptions_list'; export * from './get_saved_object_reference'; export * from './log_missing_saved_object_error'; -export * from './log_warning_if_different_references_detected'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/log_warning_if_different_references_detected.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/log_warning_if_different_references_detected.test.ts deleted file mode 100644 index a27faa6356c2b..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/log_warning_if_different_references_detected.test.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { loggingSystemMock } from 'src/core/server/mocks'; - -import { logWarningIfDifferentReferencesDetected } from '.'; - -describe('log_warning_if_different_references_detected', () => { - let logger = loggingSystemMock.create().get('security_solution'); - - beforeEach(() => { - logger = loggingSystemMock.create().get('security_solution'); - }); - - test('logs expect error message if the two ids are different', () => { - logWarningIfDifferentReferencesDetected({ - logger, - savedObjectReferenceId: '123', - savedObjectId: '456', - }); - expect(logger.error).toBeCalledWith( - 'The id of the "saved object reference id": 123 is not the same as the "saved object id": 456. Preferring and using the "saved object reference id" instead of the "saved object id"' - ); - }); - - test('logs nothing if the two ids are the same', () => { - logWarningIfDifferentReferencesDetected({ - logger, - savedObjectReferenceId: '123', - savedObjectId: '123', - }); - expect(logger.error).not.toHaveBeenCalled(); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/log_warning_if_different_references_detected.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/log_warning_if_different_references_detected.ts deleted file mode 100644 index 9f80ba6d8ce83..0000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/utils/log_warning_if_different_references_detected.ts +++ /dev/null @@ -1,36 +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 { Logger } from 'src/core/server'; - -/** - * This will log a warning that the saved object reference id and the saved object id are not the same if that is true. - * @param logger The kibana injected logger - * @param savedObjectReferenceId The saved object reference id from "references: [{ id: ...}]" - * @param savedObjectId The saved object id from a structure such as exceptions { exceptionsList: { "id": "..." } } - */ -export const logWarningIfDifferentReferencesDetected = ({ - logger, - savedObjectReferenceId, - savedObjectId, -}: { - logger: Logger; - savedObjectReferenceId: string; - savedObjectId: string; -}): void => { - if (savedObjectReferenceId !== savedObjectId) { - logger.error( - [ - 'The id of the "saved object reference id": ', - savedObjectReferenceId, - ' is not the same as the "saved object id": ', - savedObjectId, - '. Preferring and using the "saved object reference id" instead of the "saved object id"', - ].join('') - ); - } -}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts index 0b1524a5682ab..ab1f428776630 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -400,7 +400,7 @@ export const signalRulesAlertType = ({ ?.kibana_siem_app_url, }); - logger.info( + logger.debug( buildRuleMessage(`Found ${result.createdSignalsCount} signals for notification.`) ); @@ -450,8 +450,7 @@ export const signalRulesAlertType = ({ }); } - // adding this log line so we can get some information from cloud - logger.info( + logger.debug( buildRuleMessage( `[+] Finished indexing ${result.createdSignalsCount} ${ !isEmpty(tuples) 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 45ceb98ed0dc1..b6657e7753364 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 @@ -21,12 +21,14 @@ export const createMockTelemetryEventsSender = ( setup: jest.fn(), start: jest.fn(), stop: jest.fn(), + getClusterID: jest.fn(), fetchTelemetryUrl: jest.fn(), queueTelemetryEvents: jest.fn(), processEvents: jest.fn(), isTelemetryOptedIn: jest.fn().mockReturnValue(enableTelemetry ?? jest.fn()), sendIfDue: jest.fn(), sendEvents: jest.fn(), + sendOnDemand: jest.fn(), } as unknown as jest.Mocked; }; @@ -35,7 +37,6 @@ export const createMockTelemetryReceiver = ( ): jest.Mocked => { return { start: jest.fn(), - fetchClusterInfo: jest.fn(), fetchLicenseInfo: jest.fn(), copyLicenseFields: jest.fn(), fetchFleetAgents: jest.fn(), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts b/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts index ec1505ec314d1..af02c98f32c55 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts @@ -24,3 +24,5 @@ export const LIST_ENDPOINT_EXCEPTION = 'endpoint_exception'; export const LIST_ENDPOINT_EVENT_FILTER = 'endpoint_event_filter'; export const LIST_TRUSTED_APPLICATION = 'trusted_application'; + +export const INSIGHTS_CHANNEL = 'security-insights-v1'; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/filters.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/filters.test.ts index 4844a10d99f90..926816149d25c 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/filters.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/filters.test.ts @@ -10,6 +10,7 @@ import { copyAllowlistedFields } from './filters'; describe('Security Telemetry filters', () => { describe('allowlistEventFields', () => { const allowlist = { + _id: true, a: true, b: true, c: { @@ -19,12 +20,14 @@ describe('Security Telemetry filters', () => { it('filters top level', () => { const event = { + _id: 'id', a: 'a', a1: 'a1', b: 'b', b1: 'b1', }; expect(copyAllowlistedFields(allowlist, event)).toStrictEqual({ + _id: 'id', a: 'a', b: 'b', }); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts b/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts index ee162fb76f95b..b3316458365d5 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/filters.ts @@ -105,6 +105,7 @@ const allowlistBaseEventFields: AllowlistFields = { // blindly. Object contents means that we only copy the fields that appear explicitly in // the sub-object. export const allowlistEventFields: AllowlistFields = { + _id: true, '@timestamp': true, agent: true, Endpoint: true, @@ -140,6 +141,7 @@ export const exceptionListEventFields: AllowlistFields = { name: true, os_types: true, rule_version: true, + scope: true, }; /** 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 e72b0ba7d16fe..86d41f5040cc6 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts @@ -108,6 +108,7 @@ export const trustedApplicationToTelemetryEntry = (trustedApplication: TrustedAp updated_at: trustedApplication.updated_at, entries: trustedApplication.entries, os_types: [trustedApplication.os], + scope: trustedApplication.effectScope, } as ExceptionListItem; }; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/insights/index.ts b/x-pack/plugins/security_solution/server/lib/telemetry/insights/index.ts new file mode 100644 index 0000000000000..8f300c6089d29 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/telemetry/insights/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright 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 { getSessionIDfromKibanaRequest, createAlertStatusPayloads } from './insights'; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/insights/insights.ts b/x-pack/plugins/security_solution/server/lib/telemetry/insights/insights.ts new file mode 100644 index 0000000000000..367eb92824117 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/telemetry/insights/insights.ts @@ -0,0 +1,82 @@ +/* + * Copyright 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 moment from 'moment'; +import { KibanaRequest } from 'src/core/server'; +import { sha256 } from 'js-sha256'; + +interface AlertContext { + alert_id: string; +} + +interface AlertStatusAction { + alert_status: string; + action_timestamp: string; +} + +export interface InsightsPayload { + state: { + route: string; + cluster_id: string; + user_id: string; + session_id: string; + context: AlertContext; + }; + action: AlertStatusAction; +} +export function getSessionIDfromKibanaRequest(clusterId: string, request: KibanaRequest): string { + const rawCookieHeader = request.headers.cookie; + if (!rawCookieHeader) { + return ''; + } + const cookieHeaders = Array.isArray(rawCookieHeader) ? rawCookieHeader : [rawCookieHeader]; + let tokenPackage: string | undefined; + + cookieHeaders + .flatMap((rawHeader) => rawHeader.split('; ')) + .forEach((rawCookie) => { + const [cookieName, cookieValue] = rawCookie.split('='); + if (cookieName === 'sid') tokenPackage = cookieValue; + }); + + if (tokenPackage) { + return getClusterHashSalt(clusterId, tokenPackage); + } else { + return ''; + } +} + +function getClusterHashSalt(clusterId: string, toHash: string): string { + const concatValue = toHash + clusterId; + const sha = sha256.create().update(concatValue).hex(); + return sha; +} + +export function createAlertStatusPayloads( + clusterId: string, + alertIds: string[], + sessionId: string, + username: string, + route: string, + status: string +): InsightsPayload[] { + return alertIds.map((alertId) => ({ + state: { + route, + cluster_id: clusterId, + user_id: getClusterHashSalt(clusterId, username), + session_id: sessionId, + context: { + alert_id: alertId, + }, + }, + action: { + alert_status: status, + action_timestamp: moment().toISOString(), + }, + })); +} 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 94aa6c867304f..5246b649ebaa1 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -38,6 +38,7 @@ export class TelemetryReceiver { private exceptionListClient?: ExceptionListClient; private soClient?: SavedObjectsClientContract; private kibanaIndex?: string; + private clusterInfo?: ESClusterInfo; private readonly max_records = 10_000; constructor(logger: Logger) { @@ -57,6 +58,11 @@ export class TelemetryReceiver { this.exceptionListClient = exceptionListClient; this.soClient = core?.savedObjects.createInternalRepository() as unknown as SavedObjectsClientContract; + this.clusterInfo = await this.fetchClusterInfo(); + } + + public getClusterInfo(): ESClusterInfo | undefined { + return this.clusterInfo; } public async fetchFleetAgents() { @@ -304,7 +310,7 @@ export class TelemetryReceiver { }; } - public async fetchClusterInfo(): Promise { + private async fetchClusterInfo(): Promise { if (this.esClient === undefined || this.esClient === null) { throw Error('elasticsearch client is unavailable: cannot retrieve cluster infomation'); } 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 7c9906d0eae48..3a8d503c9311f 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts @@ -67,6 +67,10 @@ export class TelemetryEventsSender { } } + public getClusterID(): string | undefined { + return this.receiver?.getClusterInfo()?.cluster_uuid; + } + public start( telemetryStart?: TelemetryPluginStart, taskManager?: TaskManagerStartContract, @@ -149,9 +153,10 @@ export class TelemetryEventsSender { return; } - const [telemetryUrl, clusterInfo, licenseInfo] = await Promise.all([ + const clusterInfo = this.receiver?.getClusterInfo(); + + const [telemetryUrl, licenseInfo] = await Promise.all([ this.fetchTelemetryUrl('alerts-endpoint'), - this.receiver?.fetchClusterInfo(), this.receiver?.fetchLicenseInfo(), ]); @@ -198,10 +203,10 @@ export class TelemetryEventsSender { * @param toSend telemetry events */ public async sendOnDemand(channel: string, toSend: unknown[]) { + const clusterInfo = this.receiver?.getClusterInfo(); try { - const [telemetryUrl, clusterInfo, licenseInfo] = await Promise.all([ + const [telemetryUrl, licenseInfo] = await Promise.all([ this.fetchTelemetryUrl(channel), - this.receiver?.fetchClusterInfo(), this.receiver?.fetchLicenseInfo(), ]); @@ -255,6 +260,7 @@ export class TelemetryEventsSender { const ndjson = transformDataToNdjson(events); try { + this.logger.debug(`Sending ${events.length} telemetry events to ${channel}`); const resp = await axios.post(telemetryUrl, ndjson, { headers: { 'Content-Type': 'application/x-ndjson', @@ -275,9 +281,7 @@ export class TelemetryEventsSender { }); this.logger.debug(`Events sent!. Response: ${resp.status} ${JSON.stringify(resp.data)}`); } catch (err) { - this.logger.warn( - `Error sending events: ${err.response.status} ${JSON.stringify(err.response.data)}` - ); + this.logger.debug(`Error sending events: ${err}`); this.telemetryUsageCounter?.incrementCounter({ counterName: createUsageCounterLabel(usageLabelPrefix.concat(['payloads', channel])), counterType: 'docs_lost', diff --git a/x-pack/plugins/security_solution/server/lib/timeline/constants.ts b/x-pack/plugins/security_solution/server/lib/timeline/constants.ts index e38096bc2e82c..916fe726210cd 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/constants.ts @@ -12,7 +12,7 @@ export const SAVED_QUERY_ID_REF_NAME = 'savedQueryId'; /** * This needs to match the type of the saved query saved object. That type is defined here: - * https://github.com/elastic/kibana/blob/master/src/plugins/data/public/query/saved_query/saved_query_service.ts#L54 + * https://github.com/elastic/kibana/blob/main/src/plugins/data/public/query/saved_query/saved_query_service.ts#L54 */ export const SAVED_QUERY_TYPE = 'query'; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 53d145c7ab635..e950af43faebe 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -68,6 +68,7 @@ import { registerEventLogProvider } from './lib/detection_engine/rule_execution_ import { getKibanaPrivilegesFeaturePrivileges } from './features'; import { EndpointMetadataService } from './endpoint/services/metadata'; import { CreateRuleOptions } from './lib/detection_engine/rule_types/types'; +import { ctiFieldMap } from './lib/detection_engine/rule_types/field_maps/cti'; import { registerPrivilegeDeprecations } from './deprecation_privileges'; // eslint-disable-next-line no-restricted-imports import { legacyRulesNotificationAlertType } from './lib/detection_engine/notifications/legacy_rules_notification_alert_type'; @@ -198,7 +199,10 @@ export class Plugin implements ISecuritySolutionPlugin { componentTemplates: [ { name: 'mappings', - mappings: mappingFromFieldMap({ ...alertsFieldMap, ...rulesFieldMap }, false), + mappings: mappingFromFieldMap( + { ...alertsFieldMap, ...rulesFieldMap, ...ctiFieldMap }, + false + ), }, ], secondaryAlias: config.signalsIndex, @@ -239,6 +243,7 @@ export class Plugin implements ISecuritySolutionPlugin { config, plugins.encryptedSavedObjects?.canEncrypt === true, plugins.security, + this.telemetryEventsSender, plugins.ml, logger, isRuleRegistryEnabled diff --git a/x-pack/plugins/security_solution/server/routes/index.ts b/x-pack/plugins/security_solution/server/routes/index.ts index 9d31684907f86..0273ce3fae6ff 100644 --- a/x-pack/plugins/security_solution/server/routes/index.ts +++ b/x-pack/plugins/security_solution/server/routes/index.ts @@ -56,6 +56,7 @@ import { persistPinnedEventRoute } from '../lib/timeline/routes/pinned_events'; import { SetupPlugins } from '../plugin'; import { ConfigType } from '../config'; +import { TelemetryEventsSender } from '../lib/telemetry/sender'; import { installPrepackedTimelinesRoute } from '../lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines'; // eslint-disable-next-line no-restricted-imports import { legacyCreateLegacyNotificationRoute } from '../lib/detection_engine/routes/rules/legacy_create_legacy_notification'; @@ -65,6 +66,7 @@ export const initRoutes = ( config: ConfigType, hasEncryptionKey: boolean, security: SetupPlugins['security'], + telemetrySender: TelemetryEventsSender, ml: SetupPlugins['ml'], logger: Logger, isRuleRegistryEnabled: boolean @@ -116,7 +118,7 @@ export const initRoutes = ( // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals // POST /api/detection_engine/signals/status // Example usage can be found in security_solution/server/lib/detection_engine/scripts/signals - setSignalsStatusRoute(router); + setSignalsStatusRoute(router, logger, security, telemetrySender); querySignalsRoute(router, config); getSignalsMigrationStatusRoute(router); createSignalsMigrationRoute(router, security); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/helpers.test.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/helpers.test.ts index f20c567813f7f..a246b66d462ce 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/helpers.test.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/helpers.test.ts @@ -32,7 +32,7 @@ describe('buildIndicatorShouldClauses', () => { expect(buildIndicatorShouldClauses(eventFields)).toContainEqual({ match: { - 'threat.indicator.file.hash.md5': { + 'threatintel.indicator.file.hash.md5': { _name: 'file.hash.md5', query: '1eee2bf3f56d8abed72da2bc523e7431', }, @@ -44,8 +44,8 @@ describe('buildIndicatorShouldClauses', () => { const eventFields = { 'source.ip': '127.0.0.1', 'url.full': 'elastic.co' }; expect(buildIndicatorShouldClauses(eventFields)).toEqual( expect.arrayContaining([ - { match: { 'threat.indicator.ip': { _name: 'source.ip', query: '127.0.0.1' } } }, - { match: { 'threat.indicator.url.full': { _name: 'url.full', query: 'elastic.co' } } }, + { match: { 'threatintel.indicator.ip': { _name: 'source.ip', query: '127.0.0.1' } } }, + { match: { 'threatintel.indicator.url.full': { _name: 'url.full', query: 'elastic.co' } } }, ]) ); }); @@ -83,7 +83,7 @@ describe('buildIndicatorEnrichments', () => { _index: '_index', matched_queries: ['file.hash.md5'], fields: { - 'threat.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], }, }, ]; @@ -94,7 +94,7 @@ describe('buildIndicatorEnrichments', () => { 'matched.field': ['file.hash.md5'], 'matched.id': ['_id'], 'matched.index': ['_index'], - 'threat.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], }), ]); }); @@ -106,8 +106,8 @@ describe('buildIndicatorEnrichments', () => { _index: '_index', matched_queries: ['file.hash.md5', 'source.ip'], fields: { - 'threat.indicator.file.hash.md5': ['indicator_value'], - 'threat.indicator.ip': ['127.0.0.1'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.ip': ['127.0.0.1'], }, }, ]; @@ -118,16 +118,16 @@ describe('buildIndicatorEnrichments', () => { 'matched.field': ['file.hash.md5'], 'matched.id': ['_id'], 'matched.index': ['_index'], - 'threat.indicator.file.hash.md5': ['indicator_value'], - 'threat.indicator.ip': ['127.0.0.1'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.ip': ['127.0.0.1'], }), expect.objectContaining({ 'matched.atomic': ['127.0.0.1'], 'matched.field': ['source.ip'], 'matched.id': ['_id'], 'matched.index': ['_index'], - 'threat.indicator.file.hash.md5': ['indicator_value'], - 'threat.indicator.ip': ['127.0.0.1'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.ip': ['127.0.0.1'], }), ]); }); @@ -139,7 +139,7 @@ describe('buildIndicatorEnrichments', () => { _index: '_index', matched_queries: ['file.hash.md5'], fields: { - 'threat.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], }, }, { @@ -147,7 +147,7 @@ describe('buildIndicatorEnrichments', () => { _index: '_index2', matched_queries: ['source.ip'], fields: { - 'threat.indicator.ip': ['127.0.0.1'], + 'threatintel.indicator.ip': ['127.0.0.1'], }, }, ]; @@ -158,14 +158,14 @@ describe('buildIndicatorEnrichments', () => { 'matched.field': ['file.hash.md5'], 'matched.id': ['_id'], 'matched.index': ['_index'], - 'threat.indicator.file.hash.md5': ['indicator_value'], + 'threatintel.indicator.file.hash.md5': ['indicator_value'], }), expect.objectContaining({ 'matched.atomic': ['127.0.0.1'], 'matched.field': ['source.ip'], 'matched.id': ['_id2'], 'matched.index': ['_index2'], - 'threat.indicator.ip': ['127.0.0.1'], + 'threatintel.indicator.ip': ['127.0.0.1'], }), ]); }); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/query.test.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/query.test.ts index d953cb2979e5c..bc96a387105c6 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/query.test.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/query.test.ts @@ -16,14 +16,14 @@ describe('buildEventEnrichmentQuery', () => { expect.arrayContaining([ { match: { - 'threat.indicator.file.hash.md5': { + 'threatintel.indicator.file.hash.md5': { _name: 'file.hash.md5', query: '1eee2bf3f56d8abed72da2bc523e7431', }, }, }, - { match: { 'threat.indicator.ip': { _name: 'source.ip', query: '127.0.0.1' } } }, - { match: { 'threat.indicator.url.full': { _name: 'url.full', query: 'elastic.co' } } }, + { match: { 'threatintel.indicator.ip': { _name: 'source.ip', query: '127.0.0.1' } } }, + { match: { 'threatintel.indicator.url.full': { _name: 'url.full', query: 'elastic.co' } } }, ]) ); }); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/response.test.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/response.test.ts index de88860876089..54aa7eb58b6ce 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/response.test.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/event_enrichment/response.test.ts @@ -41,16 +41,16 @@ describe('parseEventEnrichmentResponse', () => { should: [ { match: { - 'threat.indicator.file.hash.md5': { + 'threatintel.indicator.file.hash.md5': { _name: 'file.hash.md5', query: '1eee2bf3f56d8abed72da2bc523e7431', }, }, }, - { match: { 'threat.indicator.ip': { _name: 'source.ip', query: '127.0.0.1' } } }, + { match: { 'threatintel.indicator.ip': { _name: 'source.ip', query: '127.0.0.1' } } }, { match: { - 'threat.indicator.url.full': { _name: 'url.full', query: 'elastic.co' }, + 'threatintel.indicator.url.full': { _name: 'url.full', query: 'elastic.co' }, }, }, ], diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts index ae68d81d6b922..fbc51aa0360ce 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts @@ -22,9 +22,7 @@ import { HostValue, } from '../../../../../../common/search_strategy/security_solution/hosts'; import { toObjectArrayOfStrings } from '../../../../../../common/utils/to_array'; -import { getHostMetaData } from '../../../../../endpoint/routes/metadata/handlers'; import { EndpointAppContext } from '../../../../../endpoint/types'; -import { fleetAgentStatusToEndpointHostStatus } from '../../../../../endpoint/utils'; import { getPendingActionCounts } from '../../../../../endpoint/services'; export const HOST_FIELDS = [ @@ -184,51 +182,54 @@ export const getHostEndpoint = async ( endpointContext: EndpointAppContext; } ): Promise => { - const { esClient, endpointContext, savedObjectsClient } = deps; + if (!id) { + return null; + } + + const { esClient, endpointContext } = deps; const logger = endpointContext.logFactory.get('metadata'); + try { const agentService = endpointContext.service.getAgentService(); - if (agentService === undefined) { + + if (!agentService) { throw new Error('agentService not available'); } - const metadataRequestContext = { - esClient, - endpointAppContextService: endpointContext.service, - logger, - savedObjectsClient, - }; - const endpointData = - id != null && metadataRequestContext.endpointAppContextService.getAgentService() != null - ? await getHostMetaData(metadataRequestContext, id) - : null; - - const fleetAgentId = endpointData?.elastic.agent.id; - const [fleetAgentStatus, pendingActions] = !fleetAgentId - ? [undefined, {}] - : await Promise.all([ - // Get Agent Status - agentService.getAgentStatusById(esClient.asCurrentUser, fleetAgentId), - // Get a list of pending actions (if any) - getPendingActionCounts( - esClient.asCurrentUser, - endpointContext.service.getEndpointMetadataService(), - [fleetAgentId] - ).then((results) => { + + const endpointData = await endpointContext.service + .getEndpointMetadataService() + // Using `internalUser` ES client below due to the fact that Fleet data has been moved to + // system indices (`.fleet*`). Because this is a readonly action, this should be ok to do + // here until proper RBOC controls are implemented + .getEnrichedHostMetadata(esClient.asInternalUser, id); + + const fleetAgentId = endpointData.metadata.elastic.agent.id; + + const pendingActions = fleetAgentId + ? getPendingActionCounts( + esClient.asInternalUser, + endpointContext.service.getEndpointMetadataService(), + [fleetAgentId] + ) + .then((results) => { return results[0].pending_actions; - }), - ]); - - return endpointData != null && endpointData - ? { - endpointPolicy: endpointData.Endpoint.policy.applied.name, - policyStatus: endpointData.Endpoint.policy.applied.status, - sensorVersion: endpointData.agent.version, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - elasticAgentStatus: fleetAgentStatusToEndpointHostStatus(fleetAgentStatus!), - isolation: endpointData.Endpoint.state?.isolation ?? false, - pendingActions, - } - : null; + }) + .catch((error) => { + // Failure in retrieving the number of pending actions should not fail the entire + // call to get endpoint details. Log the error and return an empty object + logger.warn(error); + return {}; + }) + : {}; + + return { + endpointPolicy: endpointData.metadata.Endpoint.policy.applied.name, + policyStatus: endpointData.metadata.Endpoint.policy.applied.status, + sensorVersion: endpointData.metadata.agent.version, + elasticAgentStatus: endpointData.host_status, + isolation: endpointData.metadata.Endpoint.state?.isolation ?? false, + pendingActions, + }; } catch (err) { logger.warn(err); return null; diff --git a/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.test.tsx b/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.test.tsx index 988564d0140cc..a9768bea9d1ed 100644 --- a/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.test.tsx +++ b/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.test.tsx @@ -112,8 +112,7 @@ const setup = async (opts: SetupOpts = {}) => { return { wrapper, onClose, mockSpacesManager, mockToastNotifications, savedObjectToCopy }; }; -// flaky https://github.com/elastic/kibana/issues/96708 -describe.skip('CopyToSpaceFlyout', () => { +describe('CopyToSpaceFlyout', () => { it('waits for spaces to load', async () => { const { wrapper } = await setup({ returnBeforeSpacesLoad: true }); diff --git a/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx b/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx index 7697780c352c9..3ff72e131aa66 100644 --- a/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx +++ b/x-pack/plugins/spaces/public/copy_saved_objects_to_space/components/copy_to_space_flyout_internal.tsx @@ -75,7 +75,7 @@ export const CopyToSpaceFlyoutInternal = (props: CopyToSpaceFlyoutProps) => { isLoading: false, spaces: [...spacesMap.values()].filter( ({ isActiveSpace, isAuthorizedForPurpose }) => - isActiveSpace || isAuthorizedForPurpose('copySavedObjectsIntoSpace') + !isActiveSpace && isAuthorizedForPurpose('copySavedObjectsIntoSpace') ), }); }) diff --git a/x-pack/plugins/stack_alerts/server/index.ts b/x-pack/plugins/stack_alerts/server/index.ts index 1ac774a2d6c3f..b6b117ceb7075 100644 --- a/x-pack/plugins/stack_alerts/server/index.ts +++ b/x-pack/plugins/stack_alerts/server/index.ts @@ -18,6 +18,7 @@ export const config: PluginConfigDescriptor = { const stackAlerts = get(settings, fromPath); if (stackAlerts?.enabled === false || stackAlerts?.enabled === true) { addDeprecation({ + level: 'critical', configPath: 'xpack.stack_alerts.enabled', message: `"xpack.stack_alerts.enabled" is deprecated. The ability to disable this plugin will be removed in 8.0.0.`, correctiveActions: { diff --git a/x-pack/plugins/stack_alerts/server/plugin.test.ts b/x-pack/plugins/stack_alerts/server/plugin.test.ts index b2bf076eaf49d..b9263553173d2 100644 --- a/x-pack/plugins/stack_alerts/server/plugin.test.ts +++ b/x-pack/plugins/stack_alerts/server/plugin.test.ts @@ -11,8 +11,7 @@ import { alertsMock } from '../../alerting/server/mocks'; import { featuresPluginMock } from '../../features/server/mocks'; import { BUILT_IN_ALERTS_FEATURE } from './feature'; -// unhandled promise rejection: https://github.com/elastic/kibana/issues/112699 -describe.skip('AlertingBuiltins Plugin', () => { +describe('AlertingBuiltins Plugin', () => { describe('setup()', () => { let context: ReturnType; let plugin: AlertingBuiltinsPlugin; diff --git a/x-pack/plugins/task_manager/server/index.ts b/x-pack/plugins/task_manager/server/index.ts index 2a360fc1a1d90..e608f3cfc30ee 100644 --- a/x-pack/plugins/task_manager/server/index.ts +++ b/x-pack/plugins/task_manager/server/index.ts @@ -49,6 +49,7 @@ export const config: PluginConfigDescriptor = { const taskManager = get(settings, fromPath); if (taskManager?.index) { addDeprecation({ + level: 'critical', configPath: `${fromPath}.index`, documentationUrl: 'https://ela.st/kbn-remove-legacy-multitenancy', message: `"${fromPath}.index" is deprecated. Multitenancy by changing "kibana.index" will not be supported starting in 8.0. See https://ela.st/kbn-remove-legacy-multitenancy for more details`, @@ -62,6 +63,7 @@ export const config: PluginConfigDescriptor = { } if (taskManager?.max_workers > MAX_WORKERS_LIMIT) { addDeprecation({ + level: 'critical', configPath: `${fromPath}.max_workers`, message: `setting "${fromPath}.max_workers" (${taskManager?.max_workers}) greater than ${MAX_WORKERS_LIMIT} is deprecated. Values greater than ${MAX_WORKERS_LIMIT} will not be supported starting in 8.0.`, correctiveActions: { diff --git a/x-pack/plugins/telemetry_collection_xpack/README.md b/x-pack/plugins/telemetry_collection_xpack/README.md index 6c205bb17c663..b055719c19585 100644 --- a/x-pack/plugins/telemetry_collection_xpack/README.md +++ b/x-pack/plugins/telemetry_collection_xpack/README.md @@ -6,4 +6,4 @@ Gathers all usage collection, retrieving them from both: OSS and X-Pack plugins. ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions on how to set up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions on how to set up your development environment. diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 9e509172ecdd5..932947c1b01a9 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -144,26 +144,26 @@ "throttle_time": { "properties": { "min": { - "type": "keyword" + "type": "long" }, "avg": { - "type": "keyword" + "type": "float" }, "max": { - "type": "keyword" + "type": "long" } } }, "schedule_time": { "properties": { "min": { - "type": "keyword" + "type": "long" }, "avg": { - "type": "keyword" + "type": "float" }, "max": { - "type": "keyword" + "type": "long" } } }, diff --git a/x-pack/plugins/transform/common/api_schemas/transforms.ts b/x-pack/plugins/transform/common/api_schemas/transforms.ts index 8867ecb5cc760..55ea326069f0d 100644 --- a/x-pack/plugins/transform/common/api_schemas/transforms.ts +++ b/x-pack/plugins/transform/common/api_schemas/transforms.ts @@ -94,6 +94,13 @@ function transformConfigPayloadValidator< } } +export const _metaSchema = schema.object( + {}, + { + unknowns: 'allow', + } +); + // PUT transforms/{transformId} export const putTransformsRequestSchema = schema.object( { @@ -112,6 +119,11 @@ export const putTransformsRequestSchema = schema.object( settings: schema.maybe(settingsSchema), source: sourceSchema, sync: schema.maybe(syncSchema), + /** + * This _meta field stores an arbitrary key-value map + * where keys are strings and values are arbitrary objects (possibly also maps). + */ + _meta: schema.maybe(_metaSchema), }, { validate: transformConfigPayloadValidator, diff --git a/x-pack/plugins/transform/common/types/transform.ts b/x-pack/plugins/transform/common/types/transform.ts index a478946ff917c..92ffc0b99bc3d 100644 --- a/x-pack/plugins/transform/common/types/transform.ts +++ b/x-pack/plugins/transform/common/types/transform.ts @@ -24,6 +24,7 @@ export type TransformBaseConfig = PutTransformsRequestSchema & { create_time?: number; version?: string; alerting_rules?: TransformHealthAlertRule[]; + _meta?: Record; }; export interface PivotConfigDefinition { diff --git a/x-pack/plugins/transform/public/app/common/request.ts b/x-pack/plugins/transform/public/app/common/request.ts index a7a3a91f9429b..f0e411f559aea 100644 --- a/x-pack/plugins/transform/public/app/common/request.ts +++ b/x-pack/plugins/transform/public/app/common/request.ts @@ -242,6 +242,7 @@ export const getCreateTransformRequestBody = ( }, } : {}), + ...(transformDetailsState._meta ? { _meta: transformDetailsState._meta } : {}), // conditionally add additional settings ...getCreateTransformSettingsRequestBody(transformDetailsState), }); diff --git a/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx b/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx index 9729cc8e62b1f..7aae41cf2e769 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx +++ b/x-pack/plugins/transform/public/app/hooks/use_index_data.test.tsx @@ -78,7 +78,8 @@ describe('Transform: useIndexData()', () => { }); }); -describe('Transform: with useIndexData()', () => { +// FLAKY: https://github.com/elastic/kibana/issues/109943 +describe.skip('Transform: with useIndexData()', () => { test('Minimal initialization, no cross cluster search warning.', async () => { // Arrange const indexPattern = { diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/common.ts b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/common.ts index 39b1a2de26f8e..21e6bce204ec8 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/common.ts +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/common.ts @@ -27,6 +27,7 @@ export interface StepDetailsExposedState { transformSettingsDocsPerSecond?: number; valid: boolean; indexPatternTimeField?: string | undefined; + _meta?: Record; } const defaultContinuousModeDelay = '60s'; @@ -94,6 +95,10 @@ export function applyTransformConfigToDetailsState( state.transformSettingsDocsPerSecond = transformConfig.settings.docs_per_second; } } + + if (transformConfig._meta) { + state._meta = transformConfig._meta; + } } return state; } diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx index 7a47cc539c4aa..6032a53909b9d 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx @@ -292,6 +292,7 @@ export const StepDetailsForm: FC = React.memo( touched: true, valid, indexPatternTimeField, + _meta: defaults._meta, }); // custom comparison /* eslint-disable react-hooks/exhaustive-deps */ diff --git a/x-pack/plugins/translations/README.asciidoc b/x-pack/plugins/translations/README.asciidoc index 3690297a097cb..52ab4b4fda8b8 100644 --- a/x-pack/plugins/translations/README.asciidoc +++ b/x-pack/plugins/translations/README.asciidoc @@ -2,4 +2,4 @@ == Translations plugin Contains Elastic-supported translations. Owned by the Localizations team. -For adding localizations and instrument a ui to support translated content, see https://github.com/elastic/kibana/tree/master/packages/kbn-i18n[kbn-i18n] +For adding localizations and instrument a ui to support translated content, see https://github.com/elastic/kibana/tree/main/packages/kbn-i18n[kbn-i18n] diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 02102df6bbe91..9d4654f1985ad 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -6415,7 +6415,6 @@ "xpack.apm.errorGroupDetails.occurrencesChartLabel": "オカレンス", "xpack.apm.errorGroupDetails.relatedTransactionSample": "関連トランザクションサンプル", "xpack.apm.errorGroupDetails.unhandledLabel": "未対応", - "xpack.apm.errorRate": "失敗したトランザクション率", "xpack.apm.errorRate.chart.errorRate": "失敗したトランザクション率(平均)", "xpack.apm.errorRate.chart.errorRate.previousPeriodLabel": "前の期間", "xpack.apm.errorsTable.errorMessageAndCulpritColumnLabel": "エラーメッセージと原因", @@ -7158,7 +7157,6 @@ "xpack.observability.alerts.manageRulesButtonLabel": "ルールの管理", "xpack.observability.alerts.searchBarPlaceholder": "kibana.alert.evaluation.threshold > 75", "xpack.observability.alertsDisclaimerLinkText": "アラートとアクション", - "xpack.observability.alertsDisclaimerText": "このページには実験アラートビューが表示されます。ここに表示されるデータは、アラートを正確に表していない可能性があります。アラートの非実験リストは、スタック管理のアラートとアクション設定にあります。", "xpack.observability.alertsDisclaimerTitle": "実験的", "xpack.observability.alertsFlyout.actualValueLabel": "実際の値", "xpack.observability.alertsFlyout.durationLabel": "期間", @@ -11133,7 +11131,6 @@ "xpack.fleet.epm.usedByLabel": "エージェントポリシー", "xpack.fleet.epm.versionLabel": "バージョン", "xpack.fleet.epmList.allPackagesFilterLinkText": "すべて", - "xpack.fleet.epmList.installedTitle": "インストールされている統合", "xpack.fleet.epmList.missingIntegrationPlaceholder": "検索用語と一致する統合が見つかりませんでした。別のキーワードを試すか、左側のカテゴリを使用して参照してください。", "xpack.fleet.epmList.noPackagesFoundPlaceholder": "パッケージが見つかりません", "xpack.fleet.epmList.searchPackagesPlaceholder": "統合を検索", @@ -13327,8 +13324,6 @@ "xpack.infra.logSourceConfiguration.childFormElementErrorMessage": "1つ以上のフォームフィールドが無効な状態です。", "xpack.infra.logSourceConfiguration.emptyColumnListErrorMessage": "列リストは未入力のままにできません。", "xpack.infra.logSourceConfiguration.emptyFieldErrorMessage": "フィールド'{fieldName}'は未入力のままにできません。", - "xpack.infra.logSourceConfiguration.indexNameReferenceDeprecationDescription": "ログソースを構成する目的で、Elasticsearchインデックスを直接参照するのは推奨されません。ログソースはKibanaインデックスパターンと統合し、使用されているインデックスを構成します。", - "xpack.infra.logSourceConfiguration.indexNameReferenceDeprecationTitle": "廃止予定の構成オプション", "xpack.infra.logSourceConfiguration.indexPatternManagementLinkText": "インデックスパターン管理画面", "xpack.infra.logSourceConfiguration.indexPatternSectionTitle": "インデックスパターン", "xpack.infra.logSourceConfiguration.indexPatternSelectorPlaceholder": "インデックスパターンを選択", @@ -18200,7 +18195,6 @@ "xpack.monitoring.elasticsearch.shardActivity.totalTimeTooltip": "開始:{startTime}", "xpack.monitoring.elasticsearch.shardActivity.unknownTargetAddressContent": "不明", "xpack.monitoring.elasticsearch.shardActivityTitle": "シャードアクティビティ", - "xpack.monitoring.elasticsearch.shardAllocation.clusterViewDisplayName": "ClusterView", "xpack.monitoring.elasticsearch.shardAllocation.decorateShards.relocatingFromTextMessage": "{nodeName} から移動しています", "xpack.monitoring.elasticsearch.shardAllocation.decorateShards.relocatingToTextMessage": "{nodeName} に移動しています", "xpack.monitoring.elasticsearch.shardAllocation.initializingLabel": "初期化中", @@ -19169,8 +19163,6 @@ "xpack.osquery.breadcrumbs.newSavedQueryPageTitle": "新規", "xpack.osquery.breadcrumbs.overviewPageTitle": "概要", "xpack.osquery.breadcrumbs.savedQueriesPageTitle": "保存されたクエリ", - "xpack.osquery.common.tabBetaBadgeLabel": "ベータ", - "xpack.osquery.common.tabBetaBadgeTooltipContent": "この機能は現在開発中です。他にも機能が追加され、機能によっては変更されるものもあります。", "xpack.osquery.editSavedQuery.deleteSavedQueryButtonLabel": "クエリを削除", "xpack.osquery.editSavedQuery.deleteSuccessToastMessageText": "保存されたクエリが正常に削除されました。", "xpack.osquery.editSavedQuery.form.cancelButtonLabel": "キャンセル", @@ -20918,8 +20910,6 @@ "xpack.securitySolution.detectionEngine.components.allRules.refreshPromptConfirm": "続行", "xpack.securitySolution.detectionEngine.components.allRules.refreshPromptTitle": "応答してください。", "xpack.securitySolution.detectionEngine.components.importRuleModal.cancelTitle": "キャンセル", - "xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedDetailedTitle": "ルールID:{ruleId}\n ステータスコード:{statusCode}\n メッセージ:{message}", - "xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedTitle": "ルールをインポートできませんでした", "xpack.securitySolution.detectionEngine.components.importRuleModal.importRuleTitle": "ルールのインポート", "xpack.securitySolution.detectionEngine.components.importRuleModal.initialPromptTextDescription": "有効なrules_export.ndjsonファイルを選択するか、ドラッグしてドロップします", "xpack.securitySolution.detectionEngine.components.importRuleModal.overwriteDescription": "競合するルールIDで既存の検出を上書き", @@ -23182,8 +23172,6 @@ "xpack.securitySolution.timelines.allTimelines.errorFetchingTimelinesTitle": "すべてのタイムラインデータをクエリできませんでした", "xpack.securitySolution.timelines.allTimelines.importTimelineTitle": "インポート", "xpack.securitySolution.timelines.allTimelines.panelTitle": "すべてのタイムライン", - "xpack.securitySolution.timelines.components.importTimelineModal.importFailedDetailedTitle": "タイムライン ID:{id}\n ステータスコード:{statusCode}\n メッセージ:{message}", - "xpack.securitySolution.timelines.components.importTimelineModal.importFailedTitle": "インポートできませんでした", "xpack.securitySolution.timelines.components.importTimelineModal.importTimelineTitle": "インポート", "xpack.securitySolution.timelines.components.importTimelineModal.importTitle": "インポート…", "xpack.securitySolution.timelines.components.importTimelineModal.initialPromptTextDescription": "有効な timelines_export.ndjson ファイルを選択するか、またはドラッグアンドドロップします", @@ -25726,7 +25714,6 @@ "xpack.uptime.alerts.tls.criteriaExpression.ariaLabel": "このアラートで監視されるモニターの条件を示す式", "xpack.uptime.alerts.tls.criteriaExpression.description": "タイミング", "xpack.uptime.alerts.tls.criteriaExpression.value": "任意のモニター", - "xpack.uptime.alerts.tls.defaultActionMessage": "期限切れになるか古くなりすぎた{count} TLS個のTLS証明書証明書を検知しました。\n{expiringConditionalOpen}\n期限切れになる証明書数:{expiringCount}\n期限切れになる証明書:{expiringCommonNameAndDate}\n{expiringConditionalClose}\n{agingConditionalOpen}\n古い証明書数:{agingCount}\n古い証明書:{agingCommonNameAndDate}\n{agingConditionalClose}\n", "xpack.uptime.alerts.tls.description": "アップタイム監視の TLS 証明書の有効期限が近いときにアラートを発行します。", "xpack.uptime.alerts.tls.expirationExpression.ariaLabel": "証明書有効期限の TLS アラートをトリガーするしきい値を示す式", "xpack.uptime.alerts.tls.expirationExpression.description": "証明書が", @@ -25735,7 +25722,6 @@ "xpack.uptime.alerts.tls.expiringLabel": "まもなく期限切れ", "xpack.uptime.alerts.tls.invalidLabel": "無効", "xpack.uptime.alerts.tls.legacy.clientName": "アップタイムTLS(レガシー)", - "xpack.uptime.alerts.tls.legacy.defaultActionMessage": "発行者{issuer}の検出されたTLS証明書{commonName}は{status}です。証明書{summary}\n", "xpack.uptime.alerts.tls.legacy.description": "アップタイム監視の TLS 証明書の有効期限が近いときにアラートを発行します。このアラートは将来のバージョンで廃止予定です。", "xpack.uptime.alerts.tls.settingsPageNav.text": "これらのしきい値は{settingsPageLink}で編集できます。", "xpack.uptime.alerts.tls.validAfterExpiredString": "{relativeDate}日前、{date}に期限切れになりました。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9723b92890a21..dc8fca5245b45 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -6467,7 +6467,6 @@ "xpack.apm.errorGroupDetails.relatedTransactionSample": "相关的事务样本", "xpack.apm.errorGroupDetails.unhandledLabel": "未处理", "xpack.apm.errorGroupDetails.viewOccurrencesInDiscoverButtonLabel": "在 Discover 中查看 {occurrencesCount} 次{occurrencesCount, plural, other {发生}}", - "xpack.apm.errorRate": "失败事务率", "xpack.apm.errorRate.chart.errorRate": "失败事务率(平均值)", "xpack.apm.errorRate.chart.errorRate.previousPeriodLabel": "上一时段", "xpack.apm.errorsTable.errorMessageAndCulpritColumnLabel": "错误消息和原因", @@ -7218,7 +7217,6 @@ "xpack.observability.alerts.manageRulesButtonLabel": "管理规则", "xpack.observability.alerts.searchBarPlaceholder": "kibana.alert.evaluation.threshold > 75", "xpack.observability.alertsDisclaimerLinkText": "告警和操作", - "xpack.observability.alertsDisclaimerText": "此页面显示实验性告警视图。此处显示的数据可能无法准确表示告警。在“堆栈管理”的“告警和操作”中提供了告警的非实验性列表。", "xpack.observability.alertsDisclaimerTitle": "实验性", "xpack.observability.alertsFlyout.actualValueLabel": "实际值", "xpack.observability.alertsFlyout.durationLabel": "持续时间", @@ -11249,7 +11247,6 @@ "xpack.fleet.epm.usedByLabel": "代理策略", "xpack.fleet.epm.versionLabel": "版本", "xpack.fleet.epmList.allPackagesFilterLinkText": "全部", - "xpack.fleet.epmList.installedTitle": "已安装集成", "xpack.fleet.epmList.missingIntegrationPlaceholder": "我们未找到任何匹配搜索词的集成。请重试其他关键字,或使用左侧的类别浏览。", "xpack.fleet.epmList.noPackagesFoundPlaceholder": "未找到任何软件包", "xpack.fleet.epmList.searchPackagesPlaceholder": "搜索集成", @@ -13516,8 +13513,6 @@ "xpack.infra.logSourceConfiguration.childFormElementErrorMessage": "至少一个表单字段处于无效状态。", "xpack.infra.logSourceConfiguration.emptyColumnListErrorMessage": "列列表不得为空。", "xpack.infra.logSourceConfiguration.emptyFieldErrorMessage": "字段“{fieldName}”不得为空。", - "xpack.infra.logSourceConfiguration.indexNameReferenceDeprecationDescription": "直接引用 Elasticsearch 索引是配置日志源的方式,但已弃用。现在,日志源与 Kibana 索引模式集成以配置使用的索引。", - "xpack.infra.logSourceConfiguration.indexNameReferenceDeprecationTitle": "弃用的配置选项", "xpack.infra.logSourceConfiguration.indexPatternManagementLinkText": "索引模式管理模式", "xpack.infra.logSourceConfiguration.indexPatternSectionTitle": "索引模式", "xpack.infra.logSourceConfiguration.indexPatternSelectorPlaceholder": "选择索引模式", @@ -18476,7 +18471,6 @@ "xpack.monitoring.elasticsearch.shardActivity.totalTimeTooltip": "已启动:{startTime}", "xpack.monitoring.elasticsearch.shardActivity.unknownTargetAddressContent": "未知", "xpack.monitoring.elasticsearch.shardActivityTitle": "分片活动", - "xpack.monitoring.elasticsearch.shardAllocation.clusterViewDisplayName": "ClusterView", "xpack.monitoring.elasticsearch.shardAllocation.decorateShards.relocatingFromTextMessage": "正在从 {nodeName} 迁移", "xpack.monitoring.elasticsearch.shardAllocation.decorateShards.relocatingToTextMessage": "正在迁移至 {nodeName}", "xpack.monitoring.elasticsearch.shardAllocation.initializingLabel": "正在初始化", @@ -19446,8 +19440,6 @@ "xpack.osquery.breadcrumbs.newSavedQueryPageTitle": "新建", "xpack.osquery.breadcrumbs.overviewPageTitle": "概览", "xpack.osquery.breadcrumbs.savedQueriesPageTitle": "已保存查询", - "xpack.osquery.common.tabBetaBadgeLabel": "公测版", - "xpack.osquery.common.tabBetaBadgeTooltipContent": "我们正在开发此功能。将会有更多的功能,某些功能可能有变更。", "xpack.osquery.createScheduledQuery.agentPolicyAgentsCountText": "{count, plural, other {# 个代理}}已注册", "xpack.osquery.editSavedQuery.deleteSavedQueryButtonLabel": "删除查询", "xpack.osquery.editSavedQuery.deleteSuccessToastMessageText": "已成功删除已保存查询", @@ -21239,8 +21231,6 @@ "xpack.securitySolution.detectionEngine.components.allRules.refreshPromptConfirm": "继续", "xpack.securitySolution.detectionEngine.components.allRules.refreshPromptTitle": "您还在吗?", "xpack.securitySolution.detectionEngine.components.importRuleModal.cancelTitle": "取消", - "xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedDetailedTitle": "规则 ID:{ruleId}\n 状态代码:{statusCode}\n 消息:{message}", - "xpack.securitySolution.detectionEngine.components.importRuleModal.importFailedTitle": "无法导入规则", "xpack.securitySolution.detectionEngine.components.importRuleModal.importRuleTitle": "导入规则", "xpack.securitySolution.detectionEngine.components.importRuleModal.initialPromptTextDescription": "选择或拖放有效 rules_export.ndjson 文件", "xpack.securitySolution.detectionEngine.components.importRuleModal.overwriteDescription": "覆盖具有冲突规则 ID 的现有检测规则", @@ -23561,8 +23551,6 @@ "xpack.securitySolution.timelines.allTimelines.errorFetchingTimelinesTitle": "无法查询所有时间线数据", "xpack.securitySolution.timelines.allTimelines.importTimelineTitle": "导入", "xpack.securitySolution.timelines.allTimelines.panelTitle": "所有时间线", - "xpack.securitySolution.timelines.components.importTimelineModal.importFailedDetailedTitle": "时间线 ID:{id}\n 状态代码:{statusCode}\n 消息:{message}", - "xpack.securitySolution.timelines.components.importTimelineModal.importFailedTitle": "无法导入", "xpack.securitySolution.timelines.components.importTimelineModal.importTimelineTitle": "导入", "xpack.securitySolution.timelines.components.importTimelineModal.importTitle": "导入……", "xpack.securitySolution.timelines.components.importTimelineModal.initialPromptTextDescription": "搜索或拖放有效的 timelines_export.ndjson 文件", @@ -26159,7 +26147,6 @@ "xpack.uptime.alerts.tls.criteriaExpression.ariaLabel": "显示此告警监视的监测条件的表达式", "xpack.uptime.alerts.tls.criteriaExpression.description": "当", "xpack.uptime.alerts.tls.criteriaExpression.value": "任意监测", - "xpack.uptime.alerts.tls.defaultActionMessage": "已检测到 {count} 个即将过期或即将过时的 TLS 证书。\n{expiringConditionalOpen}\n即将过期的证书计数:{expiringCount}\n即将过期的证书:{expiringCommonNameAndDate}\n{expiringConditionalClose}\n{agingConditionalOpen}\n过时的证书计数:{agingCount}\n过时的证书:{agingCommonNameAndDate}\n{agingConditionalClose}\n", "xpack.uptime.alerts.tls.description": "运行时间监测的 TLS 证书即将过期时告警。", "xpack.uptime.alerts.tls.expirationExpression.ariaLabel": "显示将触发证书过期 TLS 告警的阈值的表达式", "xpack.uptime.alerts.tls.expirationExpression.description": "具有将在", @@ -26168,7 +26155,6 @@ "xpack.uptime.alerts.tls.expiringLabel": "将到期", "xpack.uptime.alerts.tls.invalidLabel": "无效", "xpack.uptime.alerts.tls.legacy.clientName": "Uptime TLS(旧版)", - "xpack.uptime.alerts.tls.legacy.defaultActionMessage": "检测到来自颁发者 {issuer} 的 TLS 证书 {commonName} 的状态为 {status}。证书 {summary}\n", "xpack.uptime.alerts.tls.legacy.description": "运行时间监测的 TLS 证书即将过期时告警。未来的版本将弃用此告警。", "xpack.uptime.alerts.tls.settingsPageNav.text": "可以在 {settingsPageLink}上编辑这些阈值。", "xpack.uptime.alerts.tls.validAfterExpiredString": "已于 {relativeDate} 天前,即 {date}到期。", diff --git a/x-pack/plugins/triggers_actions_ui/README.md b/x-pack/plugins/triggers_actions_ui/README.md index 999d62db304f8..d4967552080fe 100644 --- a/x-pack/plugins/triggers_actions_ui/README.md +++ b/x-pack/plugins/triggers_actions_ui/README.md @@ -256,7 +256,7 @@ Each alert type should be defined as `AlertTypeModel` object with the these prop |requiresAppContext|Define if alert type is enabled for create and edit in the alerting management UI.| IMPORTANT: The current UI supports a single action group only. -Action groups are mapped from the server API result for [GET /api/alerts/list_alert_types: List alert types](https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting#get-apialerttypes-list-alert-types). +Action groups are mapped from the server API result for [GET /api/alerts/list_alert_types: List alert types](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting#get-apialerttypes-list-alert-types). Server side alert type model: ``` export interface AlertType { @@ -294,7 +294,7 @@ triggersActionsUi.ruleTypeRegistry.register(getSomeNewAlertType()); ## Create and register new alert type UI example -Before registering a UI for a new Alert Type, you should first register the type on the server-side by following the Alerting guide: https://github.com/elastic/kibana/tree/master/x-pack/plugins/alerting#example +Before registering a UI for a new Alert Type, you should first register the type on the server-side by following the Alerting guide: https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting#example Alert type UI is expected to be defined as `AlertTypeModel` object. @@ -1149,7 +1149,7 @@ triggersActionsUi.actionTypeRegistry.register(getSomeNewActionType()); ## Create and register new action type UI -Before starting the UI implementation, the [server side registration](https://github.com/elastic/kibana/tree/master/x-pack/plugins/actions#action-types) should be done first. +Before starting the UI implementation, the [server side registration](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions#action-types) should be done first. Action type UI is expected to be defined as `ActionTypeModel` object. diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts index 38d65b923b374..91b4f1e343bc7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.test.ts @@ -8,87 +8,96 @@ import { httpServiceMock } from '../../../../../../../../src/core/public/mocks'; import { getIssueTypes, getFieldsByIssueType, getIssues, getIssue } from './api'; -const issueTypesResponse = { - status: 'ok', - data: { - projects: [ - { - issuetypes: [ - { - id: '10006', - name: 'Task', - }, - { - id: '10007', - name: 'Bug', - }, - ], - }, - ], - }, - actionId: 'test', +const issueTypesData = { + projects: [ + { + issuetypes: [ + { + id: '10006', + name: 'Task', + }, + { + id: '10007', + name: 'Bug', + }, + ], + }, + ], }; -const fieldsResponse = { - status: 'ok', - data: { - projects: [ - { - issuetypes: [ - { - id: '10006', - name: 'Task', - fields: { - summary: { fieldId: 'summary' }, - priority: { - fieldId: 'priority', - allowedValues: [ - { - name: 'Highest', - id: '1', - }, - { - name: 'High', - id: '2', - }, - { - name: 'Medium', - id: '3', - }, - { - name: 'Low', - id: '4', - }, - { - name: 'Lowest', - id: '5', - }, - ], - defaultValue: { +const fieldData = { + projects: [ + { + issuetypes: [ + { + id: '10006', + name: 'Task', + fields: { + summary: { fieldId: 'summary' }, + priority: { + fieldId: 'priority', + allowedValues: [ + { + name: 'Highest', + id: '1', + }, + { + name: 'High', + id: '2', + }, + { name: 'Medium', id: '3', }, + { + name: 'Low', + id: '4', + }, + { + name: 'Lowest', + id: '5', + }, + ], + defaultValue: { + name: 'Medium', + id: '3', }, }, }, - ], - }, - ], - actionId: 'test', - }, + }, + ], + }, + ], +}; + +const issueTypesResponse = { + status: 'ok' as const, + connector_id: 'test', + data: issueTypesData, +}; + +const fieldsResponse = { + status: 'ok' as const, + data: fieldData, + connector_id: 'test', +}; + +const singleIssue = { + id: '10267', + key: 'RJ-107', + title: 'some title', }; const issueResponse = { - status: 'ok', - data: { - id: '10267', - key: 'RJ-107', - fields: { summary: 'Test title' }, - }, - actionId: 'test', + status: 'ok' as const, + data: singleIssue, + connector_id: 'test', }; -const issuesResponse = [issueResponse]; +const issuesResponse = { + ...issueResponse, + data: [singleIssue], +}; describe('Jira API', () => { const http = httpServiceMock.createStartContract(); @@ -100,8 +109,11 @@ describe('Jira API', () => { const abortCtrl = new AbortController(); http.post.mockResolvedValueOnce(issueTypesResponse); const res = await getIssueTypes({ http, signal: abortCtrl.signal, connectorId: 'te/st' }); - - expect(res).toEqual(issueTypesResponse); + expect(res).toEqual({ + status: 'ok' as const, + actionId: 'test', + data: issueTypesData, + }); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/te%2Fst/_execute', { body: '{"params":{"subAction":"issueTypes","subActionParams":{}}}', signal: abortCtrl.signal, @@ -120,7 +132,7 @@ describe('Jira API', () => { id: '10006', }); - expect(res).toEqual(fieldsResponse); + expect(res).toEqual({ status: 'ok', data: fieldData, actionId: 'test' }); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/te%2Fst/_execute', { body: '{"params":{"subAction":"fieldsByIssueType","subActionParams":{"id":"10006"}}}', signal: abortCtrl.signal, @@ -139,7 +151,11 @@ describe('Jira API', () => { title: 'test issue', }); - expect(res).toEqual(issuesResponse); + expect(res).toEqual({ + status: 'ok', + data: [singleIssue], + actionId: 'test', + }); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/te%2Fst/_execute', { body: '{"params":{"subAction":"issues","subActionParams":{"title":"test issue"}}}', signal: abortCtrl.signal, @@ -150,7 +166,7 @@ describe('Jira API', () => { describe('getIssue', () => { test('should call get fields API', async () => { const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(issuesResponse); + http.post.mockResolvedValueOnce(issueResponse); const res = await getIssue({ http, signal: abortCtrl.signal, @@ -158,7 +174,11 @@ describe('Jira API', () => { id: 'RJ-107', }); - expect(res).toEqual(issuesResponse); + expect(res).toEqual({ + status: 'ok', + data: singleIssue, + actionId: 'test', + }); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/te%2Fst/_execute', { body: '{"params":{"subAction":"issue","subActionParams":{"id":"RJ-107"}}}', signal: abortCtrl.signal, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts index 83e126ea9d2f6..e9cc583ee44ac 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/api.ts @@ -6,7 +6,10 @@ */ import { HttpSetup } from 'kibana/public'; +import { ActionTypeExecutorResult } from '../../../../../../actions/common'; import { BASE_ACTION_API_PATH } from '../../../constants'; +import { ConnectorExecutorResult, rewriteResponseToCamelCase } from '../rewrite_response_body'; +import { Fields, Issue, IssueTypes } from './types'; export async function getIssueTypes({ http, @@ -16,8 +19,8 @@ export async function getIssueTypes({ http: HttpSetup; signal: AbortSignal; connectorId: string; -}): Promise> { - return await http.post( +}): Promise> { + const res = await http.post>( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -26,6 +29,7 @@ export async function getIssueTypes({ signal, } ); + return rewriteResponseToCamelCase(res); } export async function getFieldsByIssueType({ @@ -38,8 +42,8 @@ export async function getFieldsByIssueType({ signal: AbortSignal; connectorId: string; id: string; -}): Promise> { - return await http.post( +}): Promise> { + const res = await http.post>( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -48,6 +52,7 @@ export async function getFieldsByIssueType({ signal, } ); + return rewriteResponseToCamelCase(res); } export async function getIssues({ @@ -60,8 +65,8 @@ export async function getIssues({ signal: AbortSignal; connectorId: string; title: string; -}): Promise> { - return await http.post( +}): Promise> { + const res = await http.post>( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -70,6 +75,7 @@ export async function getIssues({ signal, } ); + return rewriteResponseToCamelCase(res); } export async function getIssue({ @@ -82,8 +88,8 @@ export async function getIssue({ signal: AbortSignal; connectorId: string; id: string; -}): Promise> { - return await http.post( +}): Promise> { + const res = await http.post>( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -92,4 +98,5 @@ export async function getIssue({ signal, } ); + return rewriteResponseToCamelCase(res); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx index 1090414104c24..38aed2cfc6f88 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/search_issues.tsx @@ -8,7 +8,7 @@ import React, { useMemo, useEffect, useCallback, useState, memo } from 'react'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../types'; import { useGetIssues } from './use_get_issues'; import { useGetSingleIssue } from './use_get_single_issue'; @@ -17,10 +17,7 @@ import * as i18n from './translations'; interface Props { selectedValue?: string | null; http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; actionConnector?: ActionConnector; onChange: (parentIssueKey: string) => void; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts index 01165147a7c0e..6073971912acc 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/types.ts @@ -24,3 +24,18 @@ export interface JiraSecrets { email: string; apiToken: string; } + +export type IssueTypes = Array<{ id: string; name: string }>; + +export interface Issue { + id: string; + key: string; + title: string; +} + +export interface Fields { + [key: string]: { + allowedValues: Array<{ name: string; id: string }> | []; + defaultValue: { name: string; id: string } | {}; + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx index 61db73c129db6..71dafef4dca2e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_fields_by_issue_type.tsx @@ -6,24 +6,15 @@ */ import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../types'; +import { Fields } from './types'; import { getFieldsByIssueType } from './api'; import * as i18n from './translations'; -interface Fields { - [key: string]: { - allowedValues: Array<{ name: string; id: string }> | []; - defaultValue: { name: string; id: string } | {}; - }; -} - interface Props { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; issueType: string | undefined; actionConnector?: ActionConnector; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx index 11430c4c372dc..09ed90b296d06 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issue_types.tsx @@ -6,19 +6,16 @@ */ import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; + import { ActionConnector } from '../../../../types'; +import { IssueTypes } from './types'; import { getIssueTypes } from './api'; import * as i18n from './translations'; -type IssueTypes = Array<{ id: string; name: string }>; - interface Props { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; actionConnector?: ActionConnector; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx index e0423304325a3..3ad67709f82fb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_issues.tsx @@ -7,25 +7,21 @@ import { isEmpty, debounce } from 'lodash/fp'; import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../types'; +import { Issue } from './types'; import { getIssues } from './api'; import * as i18n from './translations'; -type Issues = Array<{ id: string; key: string; title: string }>; - interface Props { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; actionConnector?: ActionConnector; query: string | null; } export interface UseGetIssues { - issues: Issues; + issues: Issue[]; isLoading: boolean; } @@ -36,7 +32,7 @@ export const useGetIssues = ({ query, }: Props): UseGetIssues => { const [isLoading, setIsLoading] = useState(false); - const [issues, setIssues] = useState([]); + const [issues, setIssues] = useState([]); const abortCtrl = useRef(new AbortController()); useEffect(() => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx index e0099e24f2c5d..62ddb8b6e362b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/jira/use_get_single_issue.tsx @@ -6,23 +6,15 @@ */ import { useState, useEffect, useRef } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../types'; +import { Issue } from './types'; import { getIssue } from './api'; import * as i18n from './translations'; -interface Issue { - id: string; - key: string; - title: string; -} - interface Props { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; id?: string | null; actionConnector?: ActionConnector; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.test.ts index 0d4bf9148a92f..a345a9c81beb0 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.test.ts @@ -32,7 +32,6 @@ const incidentTypesResponse = { { id: 16, name: 'TBD / Unknown' }, { id: 15, name: 'Vendor / 3rd party error' }, ], - actionId: 'te/st', }; const severityResponse = { @@ -42,7 +41,6 @@ const severityResponse = { { id: 5, name: 'Medium' }, { id: 6, name: 'High' }, ], - actionId: 'te/st', }; describe('Resilient API', () => { @@ -53,14 +51,14 @@ describe('Resilient API', () => { describe('getIncidentTypes', () => { test('should call get choices API', async () => { const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(incidentTypesResponse); + http.post.mockResolvedValueOnce({ ...incidentTypesResponse, connector_id: 'te/st' }); const res = await getIncidentTypes({ http, signal: abortCtrl.signal, connectorId: 'te/st', }); - expect(res).toEqual(incidentTypesResponse); + expect(res).toEqual({ ...incidentTypesResponse, actionId: 'te/st' }); expect(http.post).toHaveBeenCalledWith('/api/actions/connector/te%2Fst/_execute', { body: '{"params":{"subAction":"incidentTypes","subActionParams":{}}}', signal: abortCtrl.signal, @@ -71,14 +69,15 @@ describe('Resilient API', () => { describe('getSeverity', () => { test('should call get choices API', async () => { const abortCtrl = new AbortController(); - http.post.mockResolvedValueOnce(severityResponse); + http.post.mockResolvedValueOnce({ ...severityResponse, connector_id: 'te/st' }); const res = await getSeverity({ http, signal: abortCtrl.signal, connectorId: 'te/st', }); - expect(res).toEqual(severityResponse); + expect(res).toEqual({ ...severityResponse, actionId: 'te/st' }); + expect(http.post).toHaveBeenCalledWith('/api/actions/connector/te%2Fst/_execute', { body: '{"params":{"subAction":"severity","subActionParams":{}}}', signal: abortCtrl.signal, diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.ts index 6bd9c43105cf0..e3a46c5a875c7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/resilient/api.ts @@ -7,6 +7,7 @@ import { HttpSetup } from 'kibana/public'; import { BASE_ACTION_API_PATH } from '../../../constants'; +import { rewriteResponseToCamelCase } from '../rewrite_response_body'; export async function getIncidentTypes({ http, @@ -17,7 +18,7 @@ export async function getIncidentTypes({ signal: AbortSignal; connectorId: string; }): Promise> { - return await http.post( + const res = await http.post( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -26,6 +27,7 @@ export async function getIncidentTypes({ signal, } ); + return rewriteResponseToCamelCase(res); } export async function getSeverity({ @@ -37,7 +39,7 @@ export async function getSeverity({ signal: AbortSignal; connectorId: string; }): Promise> { - return await http.post( + const res = await http.post( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -46,4 +48,5 @@ export async function getSeverity({ signal, } ); + return rewriteResponseToCamelCase(res); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/rewrite_response_body.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/rewrite_response_body.ts new file mode 100644 index 0000000000000..d9bf48c4ab854 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/rewrite_response_body.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ActionTypeExecutorResult, RewriteResponseCase } from '../../../../../actions/common'; + +export type ConnectorExecutorResult = ReturnType< + RewriteResponseCase> +>; + +export const rewriteResponseToCamelCase = ({ + connector_id: actionId, + service_message: serviceMessage, + ...data +}: ConnectorExecutorResult): ActionTypeExecutorResult => ({ + ...data, + actionId, + ...(serviceMessage && { serviceMessage }), +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/api.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/api.ts index 32a2d0296d4c9..13cd3e5313165 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/api.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/api.ts @@ -6,11 +6,15 @@ */ import { HttpSetup } from 'kibana/public'; + // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { snExternalServiceConfig } from '../../../../../../actions/server/builtin_action_types/servicenow/config'; import { BASE_ACTION_API_PATH } from '../../../constants'; import { API_INFO_ERROR } from './translations'; import { AppInfo, RESTApiError } from './types'; +import { ConnectorExecutorResult, rewriteResponseToCamelCase } from '../rewrite_response_body'; +import { ActionTypeExecutorResult } from '../../../../../../actions/common'; +import { Choice } from './types'; export async function getChoices({ http, @@ -22,8 +26,8 @@ export async function getChoices({ signal: AbortSignal; connectorId: string; fields: string[]; -}): Promise> { - return await http.post( +}): Promise> { + const res = await http.post>( `${BASE_ACTION_API_PATH}/connector/${encodeURIComponent(connectorId)}/_execute`, { body: JSON.stringify({ @@ -32,6 +36,7 @@ export async function getChoices({ signal, } ); + return rewriteResponseToCamelCase(res); } /** diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.test.ts index e40db85bcb12d..525430ea7fc64 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { isRESTApiError, isFieldInvalid } from './helpers'; +import { isRESTApiError, isFieldInvalid, isDeprecatedConnector } from './helpers'; describe('helpers', () => { describe('isRESTApiError', () => { @@ -48,4 +48,10 @@ describe('helpers', () => { expect(isFieldInvalid('description', [])).toBeFalsy(); }); }); + + describe('isDeprecatedConnector', () => { + it('returns false if the connector is not defined', () => { + expect(isDeprecatedConnector()).toBe(false); + }); + }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.ts index e6acb2e0976a8..7274c59527415 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/helpers.ts @@ -28,9 +28,9 @@ export const isFieldInvalid = ( ): boolean => error !== undefined && error.length > 0 && field != null; // TODO: Remove when the applications are certified -export const isLegacyConnector = (connector: ServiceNowActionConnector) => { +export const isDeprecatedConnector = (connector?: ServiceNowActionConnector): boolean => { if (connector == null) { - return true; + return false; } if (!ENABLE_NEW_SN_ITSM_CONNECTOR && connector.actionTypeId === '.servicenow') { @@ -41,5 +41,14 @@ export const isLegacyConnector = (connector: ServiceNowActionConnector) => { return true; } - return connector.config.isLegacy; + /** + * Connectors after the Elastic ServiceNow application use the + * Import Set API (https://developer.servicenow.com/dev.do#!/reference/api/rome/rest/c_ImportSetAPI) + * A ServiceNow connector is considered deprecated if it uses the Table API. + * + * All other connectors do not have the usesTableApi config property + * so the function will always return false for them. + */ + + return !!connector.config.usesTableApi; }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.test.tsx index eb3e1c01887c9..3f22a51b5bd53 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.test.tsx @@ -52,7 +52,7 @@ describe('servicenow connector validation', () => { isPreconfigured: false, config: { apiUrl: 'https://dev94428.service-now.com/', - isLegacy: false, + usesTableApi: false, }, } as ServiceNowActionConnector; @@ -60,7 +60,7 @@ describe('servicenow connector validation', () => { config: { errors: { apiUrl: [], - isLegacy: [], + usesTableApi: [], }, }, secrets: { @@ -88,7 +88,7 @@ describe('servicenow connector validation', () => { config: { errors: { apiUrl: ['URL is required.'], - isLegacy: [], + usesTableApi: [], }, }, secrets: { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx index 6b6d536ff303b..7267e11ae7327 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow.tsx @@ -28,7 +28,7 @@ const validateConnector = async ( const translations = await import('./translations'); const configErrors = { apiUrl: new Array(), - isLegacy: new Array(), + usesTableApi: new Array(), }; const secretsErrors = { username: new Array(), diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.test.tsx index 7c720148780a4..03acb673bf5a4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.test.tsx @@ -36,7 +36,7 @@ describe('ServiceNowActionConnectorFields renders', () => { name: 'SN', config: { apiUrl: 'https://test/', - isLegacy: true, + usesTableApi: true, }, } as ServiceNowActionConnector; @@ -44,7 +44,7 @@ describe('ServiceNowActionConnectorFields renders', () => { ...usesTableApiConnector, config: { ...usesTableApiConnector.config, - isLegacy: false, + usesTableApi: false, }, } as ServiceNowActionConnector; @@ -350,7 +350,7 @@ describe('ServiceNowActionConnectorFields renders', () => { id: usesTableApiConnector.id, connector: { name: usesTableApiConnector.name, - config: { ...usesTableApiConnector.config, isLegacy: false }, + config: { ...usesTableApiConnector.config, usesTableApi: false }, secrets: usesTableApiConnector.secrets, }, }) @@ -414,5 +414,43 @@ describe('ServiceNowActionConnectorFields renders', () => { .includes(errorMessage) ).toBeTruthy(); }); + + test('should set the usesTableApi to false when creating a connector', async () => { + const newConnector = { ...usesTableApiConnector, config: {}, secrets: {} }; + const editActionConfig = jest.fn(); + + mountWithIntl( + {}} + readOnly={false} + setCallbacks={setCallbacks} + isEdit={false} + /> + ); + + expect(editActionConfig).toHaveBeenCalledWith('usesTableApi', false); + }); + + test('it should set the legacy attribute if it is not undefined', async () => { + const editActionConfig = jest.fn(); + + mountWithIntl( + {}} + readOnly={false} + setCallbacks={setCallbacks} + isEdit={false} + /> + ); + + expect(editActionConfig).not.toHaveBeenCalled(); + }); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.tsx index 20d38cfc7cea8..db3c32755f0ed 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_connectors.tsx @@ -15,7 +15,7 @@ import { useKibana } from '../../../../common/lib/kibana'; import { DeprecatedCallout } from './deprecated_callout'; import { useGetAppInfo } from './use_get_app_info'; import { ApplicationRequiredCallout } from './application_required_callout'; -import { isRESTApiError, isLegacyConnector } from './helpers'; +import { isRESTApiError, isDeprecatedConnector } from './helpers'; import { InstallationCallout } from './installation_callout'; import { UpdateConnector } from './update_connector'; import { updateActionConnector } from '../../../lib/action_connector_api'; @@ -36,9 +36,9 @@ const ServiceNowConnectorFields: React.FC(false); + const [showApplicationRequiredCallout, setShowApplicationRequiredCallout] = + useState(false); const [applicationInfoErrorMsg, setApplicationInfoErrorMsg] = useState(null); const getApplicationInfo = useCallback(async () => { - setApplicationRequired(false); + setShowApplicationRequiredCallout(false); setApplicationInfoErrorMsg(null); try { @@ -61,7 +62,7 @@ const ServiceNowConnectorFields: React.FC { - if (!isOldConnector) { + if (requiresNewApplication) { await getApplicationInfo(); } - }, [getApplicationInfo, isOldConnector]); + }, [getApplicationInfo, requiresNewApplication]); useEffect( () => setCallbacks({ beforeActionConnectorSave }), @@ -90,13 +91,13 @@ const ServiceNowConnectorFields: React.FC { + if (usesTableApi == null) { + editActionConfig('usesTableApi', false); + } + }); + return ( <> {showUpdateConnector && ( @@ -138,8 +151,8 @@ const ServiceNowConnectorFields: React.FC )} - {!isOldConnector && } - {isOldConnector && } + {requiresNewApplication && } + {!requiresNewApplication && } - {applicationRequired && !isOldConnector && ( + {showApplicationRequiredCallout && requiresNewApplication && ( )} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_itsm_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_itsm_params.tsx index 09b04f0fa3c48..dcfdfe3af0e0e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_itsm_params.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_itsm_params.tsx @@ -23,7 +23,7 @@ import { ServiceNowITSMActionParams, Choice, Fields, ServiceNowActionConnector } import { TextAreaWithMessageVariables } from '../../text_area_with_message_variables'; import { TextFieldWithMessageVariables } from '../../text_field_with_message_variables'; import { useGetChoices } from './use_get_choices'; -import { choicesToEuiOptions, DEFAULT_CORRELATION_ID, isLegacyConnector } from './helpers'; +import { choicesToEuiOptions, DEFAULT_CORRELATION_ID, isDeprecatedConnector } from './helpers'; import * as i18n from './translations'; @@ -46,10 +46,6 @@ const ServiceNowParamsFields: React.FunctionComponent< notifications: { toasts }, } = useKibana().services; - const isDeprecatedConnector = isLegacyConnector( - actionConnector as unknown as ServiceNowActionConnector - ); - const actionConnectorRef = useRef(actionConnector?.id ?? ''); const { incident, comments } = useMemo( () => @@ -244,7 +240,7 @@ const ServiceNowParamsFields: React.FunctionComponent<
- {!isDeprecatedConnector && ( + {!isDeprecatedConnector(actionConnector as unknown as ServiceNowActionConnector) && ( <> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_sir_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_sir_params.tsx index 42758250408d9..a264ed5421c2e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_sir_params.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/servicenow_sir_params.tsx @@ -25,7 +25,7 @@ import { TextFieldWithMessageVariables } from '../../text_field_with_message_var import * as i18n from './translations'; import { useGetChoices } from './use_get_choices'; import { ServiceNowSIRActionParams, Fields, Choice, ServiceNowActionConnector } from './types'; -import { choicesToEuiOptions, isLegacyConnector, DEFAULT_CORRELATION_ID } from './helpers'; +import { choicesToEuiOptions, isDeprecatedConnector, DEFAULT_CORRELATION_ID } from './helpers'; const useGetChoicesFields = ['category', 'subcategory', 'priority']; const defaultFields: Fields = { @@ -43,10 +43,6 @@ const ServiceNowSIRParamsFields: React.FunctionComponent< notifications: { toasts }, } = useKibana().services; - const isDeprecatedConnector = isLegacyConnector( - actionConnector as unknown as ServiceNowActionConnector - ); - const actionConnectorRef = useRef(actionConnector?.id ?? ''); const { incident, comments } = useMemo( () => @@ -229,7 +225,7 @@ const ServiceNowSIRParamsFields: React.FunctionComponent< - {!isDeprecatedConnector && ( + {!isDeprecatedConnector(actionConnector as unknown as ServiceNowActionConnector) && ( <> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts index ecbb4f9de726b..40bb47543a3c8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/types.ts @@ -35,7 +35,7 @@ export interface ServiceNowITOMActionParams { export interface ServiceNowConfig { apiUrl: string; - isLegacy: boolean; + usesTableApi: boolean; } export interface ServiceNowSecrets { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/update_connector.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/update_connector.test.tsx index 2d95bfa85ceb9..ecb90051e78c2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/update_connector.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/update_connector.test.tsx @@ -22,7 +22,7 @@ const actionConnector: ServiceNowActionConnector = { name: 'servicenow', config: { apiUrl: 'https://test/', - isLegacy: true, + usesTableApi: true, }, }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.test.tsx index 48c0fb2109f55..175a80c63d4b7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.test.tsx @@ -122,7 +122,7 @@ describe('UseChoices', () => { it('it displays an error when service fails', async () => { getChoicesMock.mockResolvedValue({ status: 'error', - service_message: 'An error occurred', + serviceMessage: 'An error occurred', }); const { waitForNextUpdate } = renderHook(() => diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.tsx index 5493fdaee8bfa..bfad678f9b24b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_choices.tsx @@ -6,7 +6,7 @@ */ import { useCallback, useMemo, useState } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../types'; import { Choice, Fields } from './types'; @@ -14,10 +14,7 @@ import { useGetChoices } from './use_get_choices'; export interface UseChoicesProps { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; actionConnector?: ActionConnector; fields: string[]; } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_app_info.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_app_info.test.tsx index c6b70443ec8fb..f842f6863676a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_app_info.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_app_info.test.tsx @@ -34,7 +34,7 @@ const actionConnector = { isPreconfigured: false, config: { apiUrl: 'https://test.service-now.com/', - isLegacy: false, + usesTableApi: false, }, } as ServiceNowActionConnector; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.test.tsx index 532789385e8bd..ecbc9512a4d3a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.test.tsx @@ -121,7 +121,7 @@ describe('useGetChoices', () => { it('it displays an error when service fails', async () => { getChoicesMock.mockResolvedValue({ status: 'error', - service_message: 'An error occurred', + serviceMessage: 'An error occurred', }); const { waitForNextUpdate } = renderHook(() => diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.tsx index f4c881c633cdc..b115c84562ae6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/servicenow/use_get_choices.tsx @@ -6,7 +6,7 @@ */ import { useState, useEffect, useRef, useCallback } from 'react'; -import { HttpSetup, ToastsApi } from 'kibana/public'; +import { HttpSetup, IToasts } from 'kibana/public'; import { ActionConnector } from '../../../../types'; import { getChoices } from './api'; import { Choice } from './types'; @@ -14,10 +14,7 @@ import * as i18n from './translations'; export interface UseGetChoicesProps { http: HttpSetup; - toastNotifications: Pick< - ToastsApi, - 'get$' | 'add' | 'remove' | 'addSuccess' | 'addWarning' | 'addDanger' | 'addError' - >; + toastNotifications: IToasts; actionConnector?: ActionConnector; fields: string[]; onSuccess?: (choices: Choice[]) => void; @@ -66,7 +63,7 @@ export const useGetChoices = ({ if (res.status && res.status === 'error') { toastNotifications.addDanger({ title: i18n.CHOICES_API_ERROR, - text: `${res.service_message ?? res.message}`, + text: `${res.serviceMessage ?? res.message}`, }); } else if (onSuccess) { onSuccess(data); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx index 844f28f022547..5de21470fc19a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/actions_connectors_list/components/actions_connectors_list.tsx @@ -205,8 +205,8 @@ const ActionsConnectorsList: React.FunctionComponent = () => { const itemConfig = ( item as UserConfiguredActionConnector, Record> ).config; - const showLegacyTooltip = - itemConfig?.isLegacy && + const showDeprecatedTooltip = + itemConfig?.usesTableApi && // TODO: Remove when applications are certified ((ENABLE_NEW_SN_ITSM_CONNECTOR && item.actionTypeId === '.servicenow') || (ENABLE_NEW_SN_SIR_CONNECTOR && item.actionTypeId === '.servicenow-sir')); @@ -233,7 +233,7 @@ const ActionsConnectorsList: React.FunctionComponent = () => { position="right" /> ) : null} - {showLegacyTooltip && } + {showDeprecatedTooltip && } ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx index 4ae570a62f7d9..ffcda22195ff5 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.test.tsx @@ -64,7 +64,8 @@ export const TestExpression: FunctionComponent = () => { ); }; -describe('alert_add', () => { +// FLAKY: https://github.com/elastic/kibana/issues/g +describe.skip('alert_add', () => { let wrapper: ReactWrapper; async function setup( diff --git a/x-pack/plugins/upgrade_assistant/README.md b/x-pack/plugins/upgrade_assistant/README.md index 6570e7f8d7617..ed4381ab0cdcc 100644 --- a/x-pack/plugins/upgrade_assistant/README.md +++ b/x-pack/plugins/upgrade_assistant/README.md @@ -20,7 +20,7 @@ These surface runtime deprecations, e.g. a Painless script that uses a deprecate request to a deprecated API. These are also generally surfaced as deprecation headers within the response. Even if the cluster state is good, app maintainers need to watch the logs in case deprecations are discovered as data is migrated. Starting in 7.x, deprecation logs can be written to a file or a data stream ([#58924](https://github.com/elastic/elasticsearch/pull/58924)). When the data stream exists, the Upgrade Assistant provides a way to analyze the logs through Observability or Discover ([#106521](https://github.com/elastic/kibana/pull/106521)). -* [**Kibana deprecations API.**](https://github.com/elastic/kibana/blob/master/src/core/server/deprecations/README.mdx) This is information about deprecated features and configs in Kibana. These deprecations are only communicated to the user if the deployment is using these features. Kibana engineers are responsible for adding deprecations to the deprecations API for their respective team. +* [**Kibana deprecations API.**](https://github.com/elastic/kibana/blob/main/src/core/server/deprecations/README.mdx) This is information about deprecated features and configs in Kibana. These deprecations are only communicated to the user if the deployment is using these features. Kibana engineers are responsible for adding deprecations to the deprecations API for their respective team. ### Fixing problems @@ -109,7 +109,7 @@ To test the Elasticsearch deprecations page ([#107053](https://github.com/elasti **3. Removing deprecated index settings** - The Upgrade Assistant currently only supports fixing deprecated translog index settings. However [the code](https://github.com/elastic/kibana/blob/master/x-pack/plugins/upgrade_assistant/common/constants.ts#L22) is written in a way to add support for more if necessary. Run the following Console command to trigger the deprecation warning: + The Upgrade Assistant currently only supports fixing deprecated translog index settings. However [the code](https://github.com/elastic/kibana/blob/main/x-pack/plugins/upgrade_assistant/common/constants.ts#L22) is written in a way to add support for more if necessary. Run the following Console command to trigger the deprecation warning: ``` PUT deprecated_settings @@ -230,7 +230,7 @@ This is a non-exhaustive list of different error scenarios in Upgrade Assistant. ### Telemetry -The Upgrade Assistant tracks several triggered events in the UI, using Kibana Usage Collection service's [UI counters](https://github.com/elastic/kibana/blob/master/src/plugins/usage_collection/README.mdx#ui-counters). +The Upgrade Assistant tracks several triggered events in the UI, using Kibana Usage Collection service's [UI counters](https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#ui-counters). **Overview page** - Component loaded @@ -249,6 +249,6 @@ The Upgrade Assistant tracks several triggered events in the UI, using Kibana Us - Component loaded - Click event for "Quick resolve" button -In addition to UI counters, the Upgrade Assistant has a [custom usage collector](https://github.com/elastic/kibana/blob/master/src/plugins/usage_collection/README.mdx#custom-collector). It currently is only responsible for tracking whether the user has deprecation logging enabled or not. +In addition to UI counters, the Upgrade Assistant has a [custom usage collector](https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#custom-collector). It currently is only responsible for tracking whether the user has deprecation logging enabled or not. -For testing instructions, refer to the [Kibana Usage Collection service README](https://github.com/elastic/kibana/blob/master/src/plugins/usage_collection/README.mdx#testing). \ No newline at end of file +For testing instructions, refer to the [Kibana Usage Collection service README](https://github.com/elastic/kibana/blob/main/src/plugins/usage_collection/README.mdx#testing). \ No newline at end of file diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview/migrate_system_indices/migrate_system_indices.test.tsx b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview/migrate_system_indices/migrate_system_indices.test.tsx index f6c69c818b378..e3f6d747deaed 100644 --- a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview/migrate_system_indices/migrate_system_indices.test.tsx +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview/migrate_system_indices/migrate_system_indices.test.tsx @@ -132,5 +132,36 @@ describe('Overview - Migrate system indices', () => { expect(exists('startSystemIndicesMigrationButton')).toBe(true); expect(find('startSystemIndicesMigrationButton').props().disabled).toBe(false); }); + + test('Handles errors from migration', async () => { + httpRequestsMockHelpers.setLoadSystemIndicesMigrationStatus({ + migration_status: 'ERROR', + features: [ + { + feature_name: 'kibana', + indices: [ + { + index: '.kibana', + migration_status: 'ERROR', + failure_cause: { + error: { + type: 'mapper_parsing_exception', + }, + }, + }, + ], + }, + ], + }); + + testBed = await setupOverviewPage(); + + const { exists } = testBed; + + // Error is displayed + expect(exists('migrationFailedCallout')).toBe(true); + // CTA is enabled + expect(exists('startSystemIndicesMigrationButton')).toBe(true); + }); }); }); diff --git a/x-pack/plugins/upgrade_assistant/common/types.ts b/x-pack/plugins/upgrade_assistant/common/types.ts index 1cbcb78ccf1c4..79eaf2e97f88e 100644 --- a/x-pack/plugins/upgrade_assistant/common/types.ts +++ b/x-pack/plugins/upgrade_assistant/common/types.ts @@ -242,6 +242,12 @@ export interface SystemIndicesMigrationFeature { indices: Array<{ index: string; version: string; + failure_cause?: { + error: { + type: string; + reason: string; + }; + }; }>; } export interface SystemIndicesMigrationStatus { diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/overview/migrate_system_indices/migrate_system_indices.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/overview/migrate_system_indices/migrate_system_indices.tsx index e54568117789a..d14958148b2f8 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/overview/migrate_system_indices/migrate_system_indices.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/overview/migrate_system_indices/migrate_system_indices.tsx @@ -8,6 +8,7 @@ import React, { FunctionComponent, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; import { EuiText, EuiButton, @@ -17,9 +18,11 @@ import { EuiCallOut, EuiFlexGroup, EuiFlexItem, + EuiCode, } from '@elastic/eui'; import type { EuiStepProps } from '@elastic/eui/src/components/steps/step'; +import type { SystemIndicesMigrationFeature } from '../../../../../common/types'; import type { OverviewStepProps } from '../../types'; import { useMigrateSystemIndices } from './use_migrate_system_indices'; @@ -27,6 +30,20 @@ interface Props { setIsComplete: OverviewStepProps['setIsComplete']; } +const getFailureCause = (features: SystemIndicesMigrationFeature[]) => { + const featureWithError = features.find((feature) => feature.migration_status === 'ERROR'); + + if (featureWithError) { + const indexWithError = featureWithError.indices.find((index) => index.failure_cause); + return { + feature: featureWithError?.feature_name, + failureCause: indexWithError?.failure_cause?.error.type, + }; + } + + return {}; +}; + const i18nTexts = { title: i18n.translate('xpack.upgradeAssistant.overview.systemIndices.title', { defaultMessage: 'Migrate system indices', @@ -67,6 +84,26 @@ const i18nTexts = { loadingError: i18n.translate('xpack.upgradeAssistant.overview.systemIndices.loadingError', { defaultMessage: 'Could not retrieve the system indices status', }), + migrationFailedTitle: i18n.translate( + 'xpack.upgradeAssistant.overview.systemIndices.migrationFailedTitle', + { + defaultMessage: 'System indices migration failed', + } + ), + migrationFailedBody: (features: SystemIndicesMigrationFeature[]) => { + const { feature, failureCause } = getFailureCause(features); + + return ( + {failureCause}, + }} + /> + ); + }, }; const MigrateSystemIndicesStep: FunctionComponent = ({ setIsComplete }) => { @@ -137,6 +174,21 @@ const MigrateSystemIndicesStep: FunctionComponent = ({ setIsComplete }) = )} + {migrationStatus.data?.migration_status === 'ERROR' && ( + <> + +

{i18nTexts.migrationFailedBody(migrationStatus.data?.features)}

+
+ + + )} + - - {label} - + + {label && ( + + {label} + + )} ); }; diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx index a2858348ed59c..3fa94e45f8937 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx @@ -6,10 +6,13 @@ */ import React, { MouseEvent, useEffect } from 'react'; -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; -import { nextAriaLabel, prevAriaLabel } from './translations'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText, useEuiTheme } from '@elastic/eui'; + import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; import { ScreenshotRefImageData } from '../../../../../../common/runtime_types'; +import { useBreakpoints } from '../../../../../hooks'; + +import { nextAriaLabel, prevAriaLabel } from './translations'; export interface StepImageCaptionProps { captionContent: string; @@ -23,13 +26,6 @@ export interface StepImageCaptionProps { isLoading: boolean; } -const ImageCaption = euiStyled.div` - background-color: ${(props) => props.theme.eui.euiColorLightestShade}; - display: inline-block; - width: 100%; - text-decoration: none; -`; - export const StepImageCaption: React.FC = ({ captionContent, imgRef, @@ -41,6 +37,9 @@ export const StepImageCaption: React.FC = ({ label, onVisible, }) => { + const { euiTheme } = useEuiTheme(); + const breakpoints = useBreakpoints(); + useEffect(() => { onVisible(true); return () => { @@ -49,8 +48,10 @@ export const StepImageCaption: React.FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const isSmall = breakpoints.down('m'); + return ( - { // we don't want this to be captured by row click which leads to step list page evt.stopPropagation(); @@ -59,8 +60,9 @@ export const StepImageCaption: React.FC = ({
{(imgSrc || imgRef) && ( - + ) => { setStepNumber(stepNumber - 1); @@ -74,10 +76,11 @@ export const StepImageCaption: React.FC = ({ - {captionContent} + {captionContent} - + ) => { setStepNumber(stepNumber + 1); @@ -93,8 +96,21 @@ export const StepImageCaption: React.FC = ({ )} - {label} + + {label} +
-
+ ); }; + +const CaptionWrapper = euiStyled.div` + background-color: ${(props) => props.theme.eui.euiColorLightestShade}; + display: inline-block; + width: 100%; + text-decoration: none; +`; + +const SecondaryText = euiStyled(EuiText)((props) => ({ + color: props.theme.eui.euiTextColor, +})); diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx new file mode 100644 index 0000000000000..7934d9878b435 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { fireEvent, waitFor } from '@testing-library/dom'; +import { render } from '../../../../../lib/helper/rtl_helpers'; +import { WaterfallMarkerIcon } from './waterfall_marker_icon'; +import { TestWrapper } from './waterfall_marker_test_helper'; + +describe('', () => { + it('renders a dot icon when `field` is an empty string', () => { + const { getByLabelText } = render(); + expect(getByLabelText('An icon indicating that this marker has no field associated with it')); + }); + + it('renders an embeddable when opened', async () => { + const { getByLabelText, getByText } = render( + + + + ); + + const expandButton = getByLabelText( + 'Use this icon button to show metrics for this annotation marker.' + ); + + fireEvent.click(expandButton); + + await waitFor(() => { + getByText('Test Field'); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx index 10c9189eca2bf..4bef5fb041520 100644 --- a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_icon.tsx @@ -6,6 +6,7 @@ */ import React, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; import { EuiButtonIcon, EuiIcon, EuiPopover } from '@elastic/eui'; import { WaterfallMarkerTrend } from './waterfall_marker_trend'; @@ -13,7 +14,15 @@ export function WaterfallMarkerIcon({ field, label }: { field: string; label: st const [isOpen, setIsOpen] = useState(false); if (!field) { - return ; + return ( + + ); } return ( @@ -25,6 +34,9 @@ export function WaterfallMarkerIcon({ field, label }: { field: string; label: st zIndex={100} button={ ( +
+

{title}

+
{appendTitle}
+
{reportType}
+
{JSON.stringify(attributes)}
+
+); + +export const TestWrapper = ({ + basePath, + activeStep, + children, +}: { + basePath: string; + activeStep?: JourneyStep; + children: JSX.Element; +}) => ( + ), + }, + }} + > + + {children} + + +); diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx new file mode 100644 index 0000000000000..f77457aa6df7b --- /dev/null +++ b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.test.tsx @@ -0,0 +1,132 @@ +/* + * Copyright 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 { render } from '../../../../../lib/helper/rtl_helpers'; +import { WaterfallMarkerTrend } from './waterfall_marker_trend'; +import moment from 'moment'; +import { JourneyStep } from '../../../../../../common/runtime_types'; +import { TestWrapper } from './waterfall_marker_test_helper'; + +describe('', () => { + const mockDiff = jest.fn(); + + jest.spyOn(moment.prototype, 'diff').mockImplementation(mockDiff); + + let activeStep: JourneyStep | undefined; + beforeEach(() => { + activeStep = { + '@timestamp': '123', + _id: 'id', + synthetics: { + type: 'step/end', + step: { + index: 0, + name: 'test-name', + }, + }, + monitor: { + id: 'mon-id', + check_group: 'group', + timespan: { + gte: '1988-10-09T12:00:00.000Z', + lt: '1988-10-10T12:00:00.000Z', + }, + }, + }; + mockDiff.mockReturnValue(0); + }); + + const BASE_PATH = 'xyz'; + + it('supplies props', () => { + const { getByLabelText, getByText, getByRole } = render( + + + , + { + core: { + http: { + // @ts-expect-error incomplete implementation for testing purposes + basePath: { + get: () => BASE_PATH, + }, + }, + }, + } + ); + const heading = getByRole('heading'); + expect(heading.innerHTML).toEqual('test title'); + expect(getByLabelText('append title').innerHTML.indexOf(BASE_PATH)).not.toBe(-1); + expect(getByText('kpi-over-time')); + expect(getByLabelText('attributes').innerHTML.indexOf('0s')).not.toBe(-1); + expect(getByLabelText('attributes').innerHTML.indexOf('0h')).toBe(-1); + expect(getByLabelText('attributes').innerHTML.indexOf('0m')).toBe(-1); + expect(getByLabelText('attributes').innerHTML.indexOf('0d')).toBe(-1); + }); + + it('handles days', () => { + mockDiff.mockReturnValue(10); + const { getByLabelText } = render( + + + + ); + + const attributesText = getByLabelText('attributes').innerHTML; + + expect(attributesText.indexOf('480s')).toBe(-1); + expect(attributesText.indexOf('480h')).toBe(-1); + expect(attributesText.indexOf('480m')).toBe(-1); + expect(attributesText.indexOf('480d')).not.toBe(-1); + }); + + it('handles hours', () => { + mockDiff.mockReturnValueOnce(0); + mockDiff.mockReturnValue(10); + const { getByLabelText } = render( + + + + ); + + const attributesText = getByLabelText('attributes').innerHTML; + + expect(attributesText.indexOf('480s')).toBe(-1); + expect(attributesText.indexOf('480h')).not.toBe(-1); + expect(attributesText.indexOf('480m')).toBe(-1); + expect(attributesText.indexOf('480d')).toBe(-1); + }); + + it('handles minutes', () => { + mockDiff.mockReturnValueOnce(0); + mockDiff.mockReturnValueOnce(0); + mockDiff.mockReturnValue(10); + const { getByLabelText } = render( + + + + ); + + const attributesText = getByLabelText('attributes').innerHTML; + + expect(attributesText.indexOf('480s')).toBe(-1); + expect(attributesText.indexOf('480h')).toBe(-1); + expect(attributesText.indexOf('480m')).not.toBe(-1); + expect(attributesText.indexOf('480d')).toBe(-1); + }); + + it('returns null for missing active step', () => { + activeStep = undefined; + const { container } = render( + + + + ); + expect(container.innerHTML).toBe(''); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx index 6ff7835633914..1639e8a0d872c 100644 --- a/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/synthetics/waterfall/components/waterfall_marker_trend.tsx @@ -9,8 +9,8 @@ import React from 'react'; import { EuiButton } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import moment from 'moment'; +import { useKibana } from '../../../../../../../../../src/plugins/kibana_react/public'; import { useUptimeStartPlugins } from '../../../../../contexts/uptime_startup_plugins_context'; -import { useUptimeSettingsContext } from '../../../../../contexts/uptime_settings_context'; import { AllSeries, createExploratoryViewUrl } from '../../../../../../../observability/public'; import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; import { useWaterfallContext } from '../context/waterfall_chart'; @@ -40,9 +40,9 @@ const getLast48Intervals = (activeStep: JourneyStep) => { export function WaterfallMarkerTrend({ title, field }: { title: string; field: string }) { const { observability } = useUptimeStartPlugins(); - const EmbeddableExpVIew = observability!.ExploratoryViewEmbeddable; + const EmbeddableExpView = observability!.ExploratoryViewEmbeddable; - const { basePath } = useUptimeSettingsContext(); + const basePath = useKibana().services.http?.basePath?.get(); const { activeStep } = useWaterfallContext(); @@ -75,7 +75,7 @@ export function WaterfallMarkerTrend({ title, field }: { title: string; field: s return ( - diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx index 26ca69a5b89c7..7aa763c15ca1f 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx @@ -199,6 +199,22 @@ describe('useExpandedROw', () => { expect(Object.keys(result.current.expandedRows)).toEqual(['0']); }); + it('returns expected browser consoles', async () => { + const { result } = renderHook(() => + useExpandedRow({ + steps: defaultSteps, + allSteps: [...defaultSteps, browserConsoleStep], + loading: false, + }) + ); + + result.current.toggleExpand({ journeyStep: defaultSteps[0] }); + + expect(result.current.expandedRows[0].props.browserConsoles).toEqual([ + browserConsoleStep.synthetics.payload.text, + ]); + }); + describe('getExpandedStepCallback', () => { it('matches step index to key', () => { const callback = getExpandedStepCallback(2); @@ -207,3 +223,44 @@ describe('useExpandedROw', () => { }); }); }); + +const browserConsoleStep = { + _id: 'IvT1oXwB5ds00bB_FVXP', + observer: { + hostname: '16Elastic', + }, + agent: { + name: '16Elastic', + id: '77def92c-1a78-4353-b9e5-45d31920b1b7', + type: 'heartbeat', + ephemeral_id: '3a9ca86c-08d0-4f3f-b857-aeef540b3cac', + version: '8.0.0', + }, + '@timestamp': '2021-10-21T08:25:25.221Z', + package: { name: '@elastic/synthetics', version: '1.0.0-beta.14' }, + ecs: { version: '1.12.0' }, + os: { platform: 'darwin' }, + synthetics: { + package_version: '1.0.0-beta.14', + journey: { name: 'inline', id: 'inline' }, + payload: { + text: "Refused to execute inline script because it violates the following Content Security Policy directive: \"script-src 'unsafe-eval' 'self'\". Either the 'unsafe-inline' keyword, a hash ('sha256-P5polb1UreUSOe5V/Pv7tc+yeZuJXiOi/3fqhGsU7BE='), or a nonce ('nonce-...') is required to enable inline execution.\n", + type: 'error', + }, + index: 755, + step: { duration: { us: 0 }, name: 'goto kibana', index: 1, status: '' }, + type: 'journey/browserconsole', + isFullScreenshot: false, + isScreenshotRef: true, + }, + monitor: { + name: 'cnn-monitor - inline', + timespan: { lt: '2021-10-21T08:27:04.662Z', gte: '2021-10-21T08:26:04.662Z' }, + check_group: '70acec60-3248-11ec-9921-acde48001122', + id: 'cnn-monitor-inline', + type: 'browser', + status: 'up', + }, + event: { dataset: 'browser' }, + timestamp: '2021-10-21T08:25:25.221Z', +}; diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx index e58e1cca8660b..1b3a641033dd7 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx @@ -28,13 +28,15 @@ export const useExpandedRow = ({ loading, steps, allSteps }: HookProps) => { const { checkGroupId } = useParams<{ checkGroupId: string }>(); - const getBrowserConsole = useCallback( + const getBrowserConsoles = useCallback( (index: number) => { - return allSteps.find( - (stepF) => - stepF.synthetics?.type === 'journey/browserconsole' && - stepF.synthetics?.step?.index! === index - )?.synthetics?.payload?.text; + return allSteps + .filter( + (stepF) => + stepF.synthetics?.type === 'journey/browserconsole' && + stepF.synthetics?.step?.index! === index + ) + .map((stepF) => stepF.synthetics?.payload?.text!); }, [allSteps] ); @@ -48,7 +50,7 @@ export const useExpandedRow = ({ loading, steps, allSteps }: HookProps) => { expandedRowsN[expandedRowKey] = ( @@ -77,7 +79,7 @@ export const useExpandedRow = ({ loading, steps, allSteps }: HookProps) => { [stepIndex]: ( diff --git a/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx index 04fcf382fd861..f9876593a03db 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx @@ -71,14 +71,15 @@ describe('ExecutedStep', () => { }); it('renders accordions for console output', () => { - const browserConsole = - "Refused to execute script from because its MIME type ('image/gif') is not executable"; + const browserConsole = [ + "Refused to execute script from because its MIME type ('image/gif') is not executable", + ]; const { getByText } = render( - + ); expect(getByText('Console output')); - expect(getByText(browserConsole)); + expect(getByText(browserConsole[0])); }); }); diff --git a/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx b/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx index add34c3f71f0d..57b94544e5983 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx @@ -19,7 +19,7 @@ interface ExecutedStepProps { step: JourneyStep; index: number; loading: boolean; - browserConsole?: string; + browserConsoles?: string[]; } const Label = euiStyled.div` @@ -40,12 +40,7 @@ const ExpandedRow = euiStyled.div` width: 100%; `; -export const ExecutedStep: FC = ({ - loading, - step, - index, - browserConsole = '', -}) => { +export const ExecutedStep: FC = ({ loading, step, index, browserConsoles }) => { const isSucceeded = step.synthetics?.payload?.status === 'succeeded'; return ( @@ -94,7 +89,12 @@ export const ExecutedStep: FC = ({ initialIsOpen={!isSucceeded} > <> - {browserConsole} + {browserConsoles?.map((browserConsole) => ( + <> + {browserConsole} + + + ))} diff --git a/x-pack/plugins/uptime/public/hooks/index.ts b/x-pack/plugins/uptime/public/hooks/index.ts index 3e4714384e654..e96d746a05514 100644 --- a/x-pack/plugins/uptime/public/hooks/index.ts +++ b/x-pack/plugins/uptime/public/hooks/index.ts @@ -12,4 +12,5 @@ export * from './use_search_text'; export * from './use_cert_status'; export * from './use_telemetry'; export * from './use_url_params'; +export * from './use_breakpoints'; export { useIndexPattern } from '../contexts/uptime_index_pattern_context'; diff --git a/x-pack/plugins/uptime/public/hooks/use_breakpoints.test.ts b/x-pack/plugins/uptime/public/hooks/use_breakpoints.test.ts new file mode 100644 index 0000000000000..d417d98dcb76d --- /dev/null +++ b/x-pack/plugins/uptime/public/hooks/use_breakpoints.test.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { BREAKPOINTS } from '@elastic/eui'; +import { renderHook } from '@testing-library/react-hooks'; +import { useBreakpoints } from './use_breakpoints'; + +describe('use_breakpoints', () => { + describe('useBreakpoints', () => { + const width = global.innerWidth; + + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.runOnlyPendingTimers(); + jest.useRealTimers(); + }); + + afterAll(() => { + (global as { innerWidth: number }).innerWidth = width; + }); + + it('should only return up => false and down => true for "xs" when width is less than BREAKPOINTS.xs', () => { + (global as { innerWidth: number }).innerWidth = BREAKPOINTS.xs - 1; + const { result } = renderHook(() => useBreakpoints()); + + expect(result.current.up('xs')).toBeFalsy(); + expect(result.current.down('xs')).toBeTruthy(); + }); + + it('should only return up => true and down => false for "xs" when width is above or equal BREAKPOINTS.xs', () => { + (global as { innerWidth: number }).innerWidth = BREAKPOINTS.xs; + const { result } = renderHook(() => useBreakpoints()); + + expect(result.current.up('xs')).toBeTruthy(); + expect(result.current.down('xs')).toBeFalsy(); + }); + + it('should return down => true for "m" when width equals BREAKPOINTS.l', () => { + (global as { innerWidth: number }).innerWidth = BREAKPOINTS.l; + const { result } = renderHook(() => useBreakpoints()); + + expect(result.current.up('m')).toBeTruthy(); + expect(result.current.down('m')).toBeFalsy(); + }); + + it('should return `between` => true for "m" and "xl" when width equals BREAKPOINTS.l', () => { + (global as { innerWidth: number }).innerWidth = BREAKPOINTS.l; + const { result } = renderHook(() => useBreakpoints()); + + expect(result.current.between('m', 'xl')).toBeTruthy(); + }); + + it('should return `between` => true for "s" and "m" when width equals BREAKPOINTS.s', () => { + (global as { innerWidth: number }).innerWidth = BREAKPOINTS.s; + const { result } = renderHook(() => useBreakpoints()); + + expect(result.current.between('s', 'm')).toBeTruthy(); + }); + + it('should return up => true for all when size is > xxxl+', () => { + (global as { innerWidth: number }).innerWidth = 3000; + const { result } = renderHook(() => useBreakpoints()); + + expect(result.current.up('xs')).toBeTruthy(); + expect(result.current.up('s')).toBeTruthy(); + expect(result.current.up('m')).toBeTruthy(); + expect(result.current.up('l')).toBeTruthy(); + expect(result.current.up('xl')).toBeTruthy(); + expect(result.current.up('xxl')).toBeTruthy(); + expect(result.current.up('xxxl')).toBeTruthy(); + }); + + it('should determine `isIpad (Portrait)', () => { + (global as { innerWidth: number }).innerWidth = 768; + const { result } = renderHook(() => useBreakpoints()); + + const isIpad = result.current.up('m') && result.current.down('l'); + expect(isIpad).toEqual(true); + }); + + it('should determine `isMobile (Portrait)`', () => { + (global as { innerWidth: number }).innerWidth = 480; + const { result } = renderHook(() => useBreakpoints()); + + const isMobile = result.current.up('xs') && result.current.down('s'); + expect(isMobile).toEqual(true); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/hooks/use_breakpoints.ts b/x-pack/plugins/uptime/public/hooks/use_breakpoints.ts new file mode 100644 index 0000000000000..9398a5fcd15fe --- /dev/null +++ b/x-pack/plugins/uptime/public/hooks/use_breakpoints.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback, useState } from 'react'; +import useWindowSize from 'react-use/lib/useWindowSize'; +import useDebounce from 'react-use/lib/useDebounce'; + +import { BREAKPOINTS, EuiBreakpointSize } from '@elastic/eui'; + +// Custom breakpoints +const BREAKPOINT_XL = 1599; // Overriding the theme's default 'xl' breakpoint +const BREAKPOINT_XXL = 1599; +const BREAKPOINT_XXXL = 2000; + +export type BreakpointKey = EuiBreakpointSize | 'xxl' | 'xxxl'; + +type BreakpointPredicate = (breakpointKey: BreakpointKey) => boolean; +type BreakpointRangePredicate = (from: BreakpointKey, to: BreakpointKey) => boolean; + +/** + * Returns the predicates functions used to determine whether the current device's width is above or below the asked + * breakpoint. (Implementation inspired by React Material UI). + * + * @example + * const { breakpoints } = useBreakpoints(); + * const isMobile = breakpoint.down('m'); + * + * @example + * const { breakpoints } = useBreakpoints(); + * const isTablet = breakpoint.between('m', 'l'); + * + * @param debounce {number} Debounce interval for optimization + * + * @returns { {up: BreakpointPredicate, down: BreakpointPredicate, between: BreakpointRangePredicate} } + * Returns object containing predicates which determine whether the current device's width lies above, below or + * in-between the given breakpoint(s) + * { + * up => Returns `true` if the current width is equal or above (inclusive) the given breakpoint size, + * or `false` otherwise. + * down => Returns `true` if the current width is below (exclusive) the given breakpoint size, or `false` otherwise. + * between => Returns `true` if the current width is equal or above (inclusive) the corresponding size of + * `fromBreakpointKey` AND is below (exclusive) the corresponding width of `toBreakpointKey`. + * Returns `false` otherwise. + * } + */ +export function useBreakpoints(debounce = 50) { + const { width } = useWindowSize(); + const [debouncedWidth, setDebouncedWidth] = useState(width); + + const up = useCallback( + (breakpointKey: BreakpointKey) => isUp(debouncedWidth, breakpointKey), + [debouncedWidth] + ); + const down = useCallback( + (breakpointKey: BreakpointKey) => isDown(debouncedWidth, breakpointKey), + [debouncedWidth] + ); + + const between = useCallback( + (fromBreakpointKey: BreakpointKey, toBreakpointKey: BreakpointKey) => + isBetween(debouncedWidth, fromBreakpointKey, toBreakpointKey), + [debouncedWidth] + ); + + useDebounce( + () => { + setDebouncedWidth(width); + }, + debounce, + [width] + ); + + return { up, down, between, debouncedWidth }; +} + +/** + * Returns the corresponding device width against the provided breakpoint key, either the overridden value or the + * default value from theme. + * @param key {BreakpointKey} string key representing the device breakpoint e.g. 'xs', 's', 'xxxl' + */ +function getSizeForBreakpointKey(key: BreakpointKey): number { + switch (key) { + case 'xxxl': + return BREAKPOINT_XXXL; + case 'xxl': + return BREAKPOINT_XXL; + case 'xl': + return BREAKPOINT_XL; + case 'l': + return BREAKPOINTS.l; + case 'm': + return BREAKPOINTS.m; + case 's': + return BREAKPOINTS.s; + } + + return BREAKPOINTS.xs; +} + +function isUp(size: number, breakpointKey: BreakpointKey) { + return size >= getSizeForBreakpointKey(breakpointKey); +} + +function isDown(size: number, breakpointKey: BreakpointKey) { + return size < getSizeForBreakpointKey(breakpointKey); +} + +function isBetween(size: number, fromBreakpointKey: BreakpointKey, toBreakpointKey: BreakpointKey) { + return isUp(size, fromBreakpointKey) && isDown(size, toBreakpointKey); +} diff --git a/x-pack/plugins/uptime/server/kibana.index.ts b/x-pack/plugins/uptime/server/kibana.index.ts index 3b1001daf0515..589b09e5a13d7 100644 --- a/x-pack/plugins/uptime/server/kibana.index.ts +++ b/x-pack/plugins/uptime/server/kibana.index.ts @@ -48,6 +48,7 @@ export const initServerWithKibana = ( }, alerting: [ 'xpack.uptime.alerts.tls', + 'xpack.uptime.alerts.tlsCertificate', 'xpack.uptime.alerts.monitorStatus', 'xpack.uptime.alerts.durationAnomaly', ], @@ -64,6 +65,7 @@ export const initServerWithKibana = ( rule: { all: [ 'xpack.uptime.alerts.tls', + 'xpack.uptime.alerts.tlsCertificate', 'xpack.uptime.alerts.monitorStatus', 'xpack.uptime.alerts.durationAnomaly', ], @@ -71,6 +73,7 @@ export const initServerWithKibana = ( alert: { all: [ 'xpack.uptime.alerts.tls', + 'xpack.uptime.alerts.tlsCertificate', 'xpack.uptime.alerts.monitorStatus', 'xpack.uptime.alerts.durationAnomaly', ], @@ -93,6 +96,7 @@ export const initServerWithKibana = ( rule: { read: [ 'xpack.uptime.alerts.tls', + 'xpack.uptime.alerts.tlsCertificate', 'xpack.uptime.alerts.monitorStatus', 'xpack.uptime.alerts.durationAnomaly', ], @@ -100,6 +104,7 @@ export const initServerWithKibana = ( alert: { read: [ 'xpack.uptime.alerts.tls', + 'xpack.uptime.alerts.tlsCertificate', 'xpack.uptime.alerts.monitorStatus', 'xpack.uptime.alerts.durationAnomaly', ], diff --git a/x-pack/test/accessibility/apps/index_lifecycle_management.ts b/x-pack/test/accessibility/apps/index_lifecycle_management.ts index 65faa77fc497b..bd97fd0031515 100644 --- a/x-pack/test/accessibility/apps/index_lifecycle_management.ts +++ b/x-pack/test/accessibility/apps/index_lifecycle_management.ts @@ -7,6 +7,7 @@ import { FtrProviderContext } from '../ftr_provider_context'; +const REPO_NAME = 'test'; const POLICY_NAME = 'ilm-a11y-test'; const POLICY_ALL_PHASES = { policy: { @@ -23,7 +24,7 @@ const POLICY_ALL_PHASES = { frozen: { actions: { searchable_snapshot: { - snapshot_repository: 'test', + snapshot_repository: REPO_NAME, }, }, }, @@ -46,7 +47,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esClient = getService('es'); const a11y = getService('a11y'); + const filterByPolicyName = async (policyName: string) => { + await testSubjects.setValue('ilmSearchBar', policyName); + }; + const findPolicyLinkInListView = async (policyName: string) => { + await filterByPolicyName(policyName); const links = await testSubjects.findAll('policyTablePolicyNameLink'); for (const link of links) { const name = await link.getVisibleText(); @@ -57,11 +63,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { throw new Error(`Could not find ${policyName} in policy table`); }; - // FLAKY - // https://github.com/elastic/kibana/issues/114541 - // https://github.com/elastic/kibana/issues/114542 - describe.skip('Index Lifecycle Management', async () => { + describe('Index Lifecycle Management', async () => { before(async () => { + await esClient.snapshot.createRepository({ + repository: REPO_NAME, + body: { + type: 'fs', + settings: { + // use one of the values defined in path.repo in test/functional/config.js + location: '/tmp/', + }, + }, + verify: false, + }); await esClient.ilm.putLifecycle({ policy: POLICY_NAME, body: POLICY_ALL_PHASES }); await esClient.indices.putIndexTemplate({ name: indexTemplateName, @@ -79,6 +93,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); after(async () => { + await esClient.snapshot.deleteRepository({ + repository: REPO_NAME, + }); // @ts-expect-error @elastic/elasticsearch DeleteSnapshotLifecycleRequest.policy_id is required await esClient.ilm.deleteLifecycle({ policy: POLICY_NAME }); await esClient.indices.deleteIndexTemplate({ name: indexTemplateName }); @@ -145,6 +162,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('Add policy to index template modal', async () => { + await filterByPolicyName(POLICY_NAME); const policyRow = await testSubjects.find(`policyTableRow-${POLICY_NAME}`); const addPolicyButton = await policyRow.findByTestSubject('addPolicyToTemplate'); @@ -158,6 +176,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('Delete policy modal', async () => { + await filterByPolicyName(POLICY_NAME); const policyRow = await testSubjects.find(`policyTableRow-${POLICY_NAME}`); const deleteButton = await policyRow.findByTestSubject('deletePolicy'); @@ -171,6 +190,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('Index templates flyout', async () => { + await filterByPolicyName(POLICY_NAME); const policyRow = await testSubjects.find(`policyTableRow-${POLICY_NAME}`); const actionsButton = await policyRow.findByTestSubject('viewIndexTemplates'); diff --git a/x-pack/test/accessibility/apps/kibana_overview.ts b/x-pack/test/accessibility/apps/kibana_overview.ts index 9f5d91e5b4d54..6ea51cc0b855c 100644 --- a/x-pack/test/accessibility/apps/kibana_overview.ts +++ b/x-pack/test/accessibility/apps/kibana_overview.ts @@ -12,7 +12,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const a11y = getService('a11y'); // FLAKY: https://github.com/elastic/kibana/issues/98463 - describe.skip('Kibana overview', () => { + describe('Kibana overview', () => { const esArchiver = getService('esArchiver'); before(async () => { diff --git a/x-pack/test/accessibility/apps/ml.ts b/x-pack/test/accessibility/apps/ml.ts index e06661b000203..4babe0bd6ff88 100644 --- a/x-pack/test/accessibility/apps/ml.ts +++ b/x-pack/test/accessibility/apps/ml.ts @@ -13,8 +13,7 @@ export default function ({ getService }: FtrProviderContext) { const a11y = getService('a11y'); const ml = getService('ml'); - // Failing: See https://github.com/elastic/kibana/issues/115666 - describe.skip('ml', () => { + describe('ml', () => { const esArchiver = getService('esArchiver'); before(async () => { diff --git a/x-pack/test/accessibility/apps/upgrade_assistant.ts b/x-pack/test/accessibility/apps/upgrade_assistant.ts index 452f6051e0640..e387eed65d3fd 100644 --- a/x-pack/test/accessibility/apps/upgrade_assistant.ts +++ b/x-pack/test/accessibility/apps/upgrade_assistant.ts @@ -52,7 +52,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const es = getService('es'); const log = getService('log'); - describe('Upgrade Assistant', () => { + // Failing: See https://github.com/elastic/kibana/issues/115859 + describe.skip('Upgrade Assistant', () => { before(async () => { await PageObjects.upgradeAssistant.navigateToPage(); diff --git a/x-pack/test/accessibility/config.ts b/x-pack/test/accessibility/config.ts index 699b5b48d604c..933e8e97da397 100644 --- a/x-pack/test/accessibility/config.ts +++ b/x-pack/test/accessibility/config.ts @@ -17,10 +17,11 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { testFiles: [ require.resolve('./apps/login_page'), - require.resolve('./apps/home'), require.resolve('./apps/kibana_overview'), + require.resolve('./apps/home'), require.resolve('./apps/grok_debugger'), require.resolve('./apps/search_profiler'), + require.resolve('./apps/painless_lab'), require.resolve('./apps/uptime'), require.resolve('./apps/spaces'), require.resolve('./apps/advanced_settings'), diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/jira_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/jira_simulation.ts index 26a9c1bcadf6e..e9e6d6732327a 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/jira_simulation.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/server/jira_simulation.ts @@ -30,7 +30,6 @@ export function initPlugin(router: IRouter, path: string) { return jsonResponse(res, 200, { id: '123', key: 'CK-1', - created: '2020-04-27T14:17:45.490Z', }); } ); @@ -48,12 +47,7 @@ export function initPlugin(router: IRouter, path: string) { req: KibanaRequest, res: KibanaResponseFactory ): Promise> { - return jsonResponse(res, 200, { - id: '123', - key: 'CK-1', - created: '2020-04-27T14:17:45.490Z', - updated: '2020-04-27T14:17:45.490Z', - }); + return jsonResponse(res, 204, {}); } ); @@ -73,10 +67,12 @@ export function initPlugin(router: IRouter, path: string) { return jsonResponse(res, 200, { id: '123', key: 'CK-1', - created: '2020-04-27T14:17:45.490Z', - updated: '2020-04-27T14:17:45.490Z', - summary: 'title', - description: 'description', + fields: { + created: '2020-04-27T14:17:45.490Z', + updated: '2020-04-27T14:17:45.490Z', + summary: 'title', + description: 'description', + }, }); } ); @@ -97,6 +93,7 @@ export function initPlugin(router: IRouter, path: string) { return jsonResponse(res, 200, { id: '123', created: '2020-04-27T14:17:45.490Z', + updated: '2020-04-27T14:17:45.490Z', }); } ); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_itsm.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_itsm.ts index 82f43ed4a3040..1308959ebbacf 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_itsm.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_itsm.ts @@ -22,7 +22,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { const mockServiceNow = { config: { apiUrl: 'www.servicenowisinkibanaactions.com', - isLegacy: false, + usesTableApi: false, }, secrets: { password: 'elastic', @@ -91,6 +91,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_type_id: '.servicenow', config: { apiUrl: serviceNowSimulatorURL, + usesTableApi: false, }, secrets: mockServiceNow.secrets, }) @@ -104,7 +105,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { is_missing_secrets: false, config: { apiUrl: serviceNowSimulatorURL, - isLegacy: false, + usesTableApi: false, }, }); @@ -120,12 +121,12 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { is_missing_secrets: false, config: { apiUrl: serviceNowSimulatorURL, - isLegacy: false, + usesTableApi: false, }, }); }); - it('should set the isLegacy to false when not provided', async () => { + it('should set the usesTableApi to true when not provided', async () => { const { body: createdAction } = await supertest .post('/api/actions/connector') .set('kbn-xsrf', 'foo') @@ -143,7 +144,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { .get(`/api/actions/connector/${createdAction.id}`) .expect(200); - expect(fetchedAction.config.isLegacy).to.be(false); + expect(fetchedAction.config.usesTableApi).to.be(true); }); it('should respond with a 400 Bad Request when creating a servicenow action with no apiUrl', async () => { @@ -222,7 +223,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_type_id: '.servicenow', config: { apiUrl: serviceNowSimulatorURL, - isLegacy: false, + usesTableApi: false, }, secrets: mockServiceNow.secrets, }); @@ -382,7 +383,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { }); describe('Execution', () => { - // New connectors + // Connectors that use the Import set API describe('Import set API', () => { it('should handle creating an incident without comments', async () => { const { body: result } = await supertest @@ -413,7 +414,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { }); }); - // Legacy connectors + // Connectors that use the Table API describe('Table API', () => { before(async () => { const { body } = await supertest @@ -424,7 +425,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_type_id: '.servicenow', config: { apiUrl: serviceNowSimulatorURL, - isLegacy: true, + usesTableApi: true, }, secrets: mockServiceNow.secrets, }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_sir.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_sir.ts index 0cdb279ac0746..c27634ecf6aca 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_sir.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow_sir.ts @@ -22,7 +22,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { const mockServiceNow = { config: { apiUrl: 'www.servicenowisinkibanaactions.com', - isLegacy: false, + usesTableApi: false, }, secrets: { password: 'elastic', @@ -95,6 +95,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_type_id: '.servicenow-sir', config: { apiUrl: serviceNowSimulatorURL, + usesTableApi: false, }, secrets: mockServiceNow.secrets, }) @@ -108,7 +109,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { is_missing_secrets: false, config: { apiUrl: serviceNowSimulatorURL, - isLegacy: false, + usesTableApi: false, }, }); @@ -124,12 +125,12 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { is_missing_secrets: false, config: { apiUrl: serviceNowSimulatorURL, - isLegacy: false, + usesTableApi: false, }, }); }); - it('should set the isLegacy to false when not provided', async () => { + it('should set the usesTableApi to true when not provided', async () => { const { body: createdAction } = await supertest .post('/api/actions/connector') .set('kbn-xsrf', 'foo') @@ -147,7 +148,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { .get(`/api/actions/connector/${createdAction.id}`) .expect(200); - expect(fetchedAction.config.isLegacy).to.be(false); + expect(fetchedAction.config.usesTableApi).to.be(true); }); it('should respond with a 400 Bad Request when creating a servicenow action with no apiUrl', async () => { @@ -226,7 +227,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_type_id: '.servicenow-sir', config: { apiUrl: serviceNowSimulatorURL, - isLegacy: false, + usesTableApi: false, }, secrets: mockServiceNow.secrets, }); @@ -386,7 +387,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { }); describe('Execution', () => { - // New connectors + // Connectors that use the Import set API describe('Import set API', () => { it('should handle creating an incident without comments', async () => { const { body: result } = await supertest @@ -417,7 +418,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { }); }); - // Legacy connectors + // Connectors that use the Table API describe('Table API', () => { before(async () => { const { body } = await supertest @@ -428,7 +429,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_type_id: '.servicenow-sir', config: { apiUrl: serviceNowSimulatorURL, - isLegacy: true, + usesTableApi: true, }, secrets: mockServiceNow.secrets, }); diff --git a/x-pack/test/api_integration/apis/features/features/features.ts b/x-pack/test/api_integration/apis/features/features/features.ts index e48ac32dfd991..f8c0d47f4e419 100644 --- a/x-pack/test/api_integration/apis/features/features/features.ts +++ b/x-pack/test/api_integration/apis/features/features/features.ts @@ -104,6 +104,7 @@ export default function ({ getService }: FtrProviderContext) { 'indexPatterns', 'graph', 'monitoring', + 'observabilityCases', 'savedObjectsManagement', 'savedObjectsTagging', 'ml', diff --git a/x-pack/test/api_integration/apis/metrics_ui/constants.ts b/x-pack/test/api_integration/apis/metrics_ui/constants.ts index 2ca89f2f9ab87..90db71ae08130 100644 --- a/x-pack/test/api_integration/apis/metrics_ui/constants.ts +++ b/x-pack/test/api_integration/apis/metrics_ui/constants.ts @@ -39,4 +39,8 @@ export const DATES = { max: 1609545900000, // '2021-01-02T00:05:00Z' }, }, + ten_thousand_plus: { + min: 1634604480001, // 2021-10-19T00:48:00.001Z + max: 1634604839997, // 2021-10-19T00:53:59.997Z + }, }; diff --git a/x-pack/test/api_integration/apis/metrics_ui/metric_threshold_alert.ts b/x-pack/test/api_integration/apis/metrics_ui/metric_threshold_alert.ts index 66c40e2e6e92d..880d73a236c3b 100644 --- a/x-pack/test/api_integration/apis/metrics_ui/metric_threshold_alert.ts +++ b/x-pack/test/api_integration/apis/metrics_ui/metric_threshold_alert.ts @@ -81,10 +81,95 @@ export default function ({ getService }: FtrProviderContext) { }; describe('Metric Threshold Alerts Executor', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/infra/alerts_test_data')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/infra/alerts_test_data')); - + describe('with 10K plus docs', () => { + before(() => esArchiver.load('x-pack/test/functional/es_archives/infra/ten_thousand_plus')); + after(() => esArchiver.unload('x-pack/test/functional/es_archives/infra/ten_thousand_plus')); + describe('without group by', () => { + it('should alert on document count', async () => { + const params = { + ...baseParams, + criteria: [ + { + timeSize: 5, + timeUnit: 'm', + threshold: [10000], + comparator: Comparator.LT_OR_EQ, + aggType: Aggregators.COUNT, + } as CountMetricExpressionParams, + ], + }; + const config = { + ...configuration, + metricAlias: 'filebeat-*', + }; + const timeFrame = { end: DATES.ten_thousand_plus.max }; + const results = await evaluateAlert(esClient, params, config, [], timeFrame); + expect(results).to.eql([ + { + '*': { + timeSize: 5, + timeUnit: 'm', + threshold: [10000], + comparator: '<=', + aggType: 'count', + metric: 'Document count', + currentValue: 20895, + timestamp: '2021-10-19T00:48:59.997Z', + shouldFire: [false], + shouldWarn: [false], + isNoData: [false], + isError: false, + }, + }, + ]); + }); + }); + describe('with group by', () => { + it('should alert on document count', async () => { + const params = { + ...baseParams, + groupBy: ['event.category'], + criteria: [ + { + timeSize: 5, + timeUnit: 'm', + threshold: [10000], + comparator: Comparator.LT_OR_EQ, + aggType: Aggregators.COUNT, + } as CountMetricExpressionParams, + ], + }; + const config = { + ...configuration, + metricAlias: 'filebeat-*', + }; + const timeFrame = { end: DATES.ten_thousand_plus.max }; + const results = await evaluateAlert(esClient, params, config, [], timeFrame); + expect(results).to.eql([ + { + web: { + timeSize: 5, + timeUnit: 'm', + threshold: [10000], + comparator: '<=', + aggType: 'count', + metric: 'Document count', + currentValue: 20895, + timestamp: '2021-10-19T00:48:59.997Z', + shouldFire: [false], + shouldWarn: [false], + isNoData: [false], + isError: false, + }, + }, + ]); + }); + }); + }); describe('with gauge data', () => { + before(() => esArchiver.load('x-pack/test/functional/es_archives/infra/alerts_test_data')); + after(() => esArchiver.unload('x-pack/test/functional/es_archives/infra/alerts_test_data')); + describe('without groupBy', () => { it('should alert on document count', async () => { const params = { @@ -285,6 +370,8 @@ export default function ({ getService }: FtrProviderContext) { }); describe('with rate data', () => { + before(() => esArchiver.load('x-pack/test/functional/es_archives/infra/alerts_test_data')); + after(() => esArchiver.unload('x-pack/test/functional/es_archives/infra/alerts_test_data')); describe('without groupBy', () => { it('should alert on rate', async () => { const params = { diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_stats_with_spaces.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_stats_with_spaces.ts new file mode 100644 index 0000000000000..d15b1ab60f9ff --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_stats_with_spaces.ts @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const ml = getService('ml'); + const spacesService = getService('spaces'); + const supertest = getService('supertestWithoutAuth'); + + const jobIdSpace1 = 'fq_single_space1'; + const jobIdWildcardSpace1 = 'fq_single_space1*'; + const jobGroupSpace1 = 'space1_group'; + const jobGroupWildcardSpace1 = 'space1_group*'; + const idSpace1 = 'space1'; + const idSpace2 = 'space2'; + + async function getJobStatsById( + jobOrGroup: string | undefined, + expectedStatusCode: number, + space?: string + ) { + const { body } = await supertest + .get( + `${space ? `/s/${space}` : ''}/api/ml/anomaly_detectors${ + jobOrGroup ? `/${jobOrGroup}` : '' + }/_stats` + ) + .auth( + USER.ML_VIEWER_ALL_SPACES, + ml.securityCommon.getPasswordForUser(USER.ML_VIEWER_ALL_SPACES) + ) + .set(COMMON_REQUEST_HEADERS) + .expect(expectedStatusCode); + + return body; + } + + describe('GET anomaly_detectors stats with spaces', () => { + before(async () => { + await spacesService.create({ id: idSpace1, name: 'space_one', disabledFeatures: [] }); + await spacesService.create({ id: idSpace2, name: 'space_two', disabledFeatures: [] }); + + const jobConfig = ml.commonConfig.getADFqSingleMetricJobConfig(jobIdSpace1); + await ml.api.createAnomalyDetectionJob({ ...jobConfig, groups: [jobGroupSpace1] }, idSpace1); + + await ml.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await spacesService.delete(idSpace1); + await spacesService.delete(idSpace2); + await ml.api.cleanMlIndices(); + await ml.testResources.cleanMLSavedObjects(); + }); + + it('should fail with non-existing job', async () => { + await getJobStatsById('non-existing-job', 404); + }); + + it('should return empty list with non-existing job wildcard', async () => { + const body = await getJobStatsById('non-existing-job*', 200); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 0, + `response job stats list should be empty (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should fail with job from different space', async () => { + await getJobStatsById(jobIdSpace1, 404, idSpace2); + }); + + it('should return all job stats when not specifying id', async () => { + const body = await getJobStatsById(undefined, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response job stats list should contain correct job (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return empty list when not specifying id in difference space', async () => { + const body = await getJobStatsById(undefined, 200, idSpace2); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 0, + `response job stats list should be empty (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return job stats with job id from correct space', async () => { + const body = await getJobStatsById(jobIdSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response job stats list should contain correct job (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return job stats with job wildcard from correct space', async () => { + const body = await getJobStatsById(jobIdWildcardSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response job stats list should contain correct job (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return empty list with job wildcard from different space', async () => { + const body = await getJobStatsById(jobIdWildcardSpace1, 200, idSpace2); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 0, + `response job stats list should be empty (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return job stats by group from same space', async () => { + const body = await getJobStatsById(jobGroupSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response job stats list should have one element (got ${JSON.stringify(body.jobs)})` + ); + expect(body.jobs[0].job_id).to.eql( + jobIdSpace1, + `response job id should be ${jobIdSpace1} (got ${body.jobs[0].job_id})` + ); + }); + + it('should return job stats by group wildcard from same space', async () => { + const body = await getJobStatsById(jobGroupWildcardSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response job stats list should have one element (got ${JSON.stringify(body.jobs)})` + ); + expect(body.jobs[0].job_id).to.eql( + jobIdSpace1, + `response job id should be ${jobIdSpace1} (got ${body.jobs[0].job_id})` + ); + }); + + it('should fail with group from different space', async () => { + await getJobStatsById(jobGroupSpace1, 404, idSpace2); + }); + + it('should return empty list with group wildcard from different space', async () => { + const body = await getJobStatsById(jobGroupWildcardSpace1, 200, idSpace2); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 0, + `response job stats list should be empty (got ${JSON.stringify(body.jobs)})` + ); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_with_spaces.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_with_spaces.ts index 5392b0ef44c8a..2bebea5e63ea1 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_with_spaces.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get_with_spaces.ts @@ -22,9 +22,17 @@ export default ({ getService }: FtrProviderContext) => { const idSpace1 = 'space1'; const idSpace2 = 'space2'; - async function runRequest(jobOrGroup: string, expectedStatusCode: number, space?: string) { + async function getJobById( + jobOrGroup: string | undefined, + expectedStatusCode: number, + space?: string + ) { const { body } = await supertest - .get(`${space ? `/s/${space}` : ''}/api/ml/anomaly_detectors/${jobOrGroup}`) + .get( + `${space ? `/s/${space}` : ''}/api/ml/anomaly_detectors${ + jobOrGroup ? `/${jobOrGroup}` : '' + }` + ) .auth( USER.ML_VIEWER_ALL_SPACES, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER_ALL_SPACES) @@ -54,11 +62,11 @@ export default ({ getService }: FtrProviderContext) => { }); it('should fail with non-existing job', async () => { - await runRequest('non-existing-job', 404); + await getJobById('non-existing-job', 404); }); it('should return empty list with non-existing job wildcard', async () => { - const body = await runRequest('non-existing-job*', 200); + const body = await getJobById('non-existing-job*', 200); expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); expect(body.jobs.length).to.eql( @@ -68,11 +76,51 @@ export default ({ getService }: FtrProviderContext) => { }); it('should fail with job from different space', async () => { - await runRequest(jobIdSpace1, 404, idSpace2); + await getJobById(jobIdSpace1, 404, idSpace2); + }); + + it('should return all jobs when not specifying id', async () => { + const body = await getJobById(undefined, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response jobs list should contain correct job (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return empty list when not specifying id in difference space', async () => { + const body = await getJobById(undefined, 200, idSpace2); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 0, + `response jobs list should be empty (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return job with job id from correct space', async () => { + const body = await getJobById(jobIdSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response jobs list should contain correct job (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return job with job wildcard from correct space', async () => { + const body = await getJobById(jobIdWildcardSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.jobs.length).to.eql( + 1, + `response jobs list should contain correct job (got ${JSON.stringify(body.jobs)})` + ); }); it('should return empty list with job wildcard from different space', async () => { - const body = await runRequest(jobIdWildcardSpace1, 200, idSpace2); + const body = await getJobById(jobIdWildcardSpace1, 200, idSpace2); expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); expect(body.jobs.length).to.eql( @@ -82,7 +130,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return job by group from same space', async () => { - const body = await runRequest(jobGroupSpace1, 200, idSpace1); + const body = await getJobById(jobGroupSpace1, 200, idSpace1); expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); expect(body.jobs.length).to.eql( @@ -96,7 +144,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should return job by group wildcard from same space', async () => { - const body = await runRequest(jobGroupWildcardSpace1, 200, idSpace1); + const body = await getJobById(jobGroupWildcardSpace1, 200, idSpace1); expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); expect(body.jobs.length).to.eql( @@ -110,11 +158,11 @@ export default ({ getService }: FtrProviderContext) => { }); it('should fail with group from different space', async () => { - await runRequest(jobGroupSpace1, 404, idSpace2); + await getJobById(jobGroupSpace1, 404, idSpace2); }); it('should return empty list with group wildcard from different space', async () => { - const body = await runRequest(jobGroupWildcardSpace1, 200, idSpace2); + const body = await getJobById(jobGroupWildcardSpace1, 200, idSpace2); expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); expect(body.jobs.length).to.eql( diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts index 86649ece22551..101273405f121 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts @@ -12,6 +12,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./create')); loadTestFile(require.resolve('./get')); loadTestFile(require.resolve('./get_with_spaces')); + loadTestFile(require.resolve('./get_stats_with_spaces')); loadTestFile(require.resolve('./open_with_spaces')); loadTestFile(require.resolve('./close_with_spaces')); loadTestFile(require.resolve('./delete_with_spaces')); diff --git a/x-pack/test/api_integration/apis/ml/datafeeds/get_stats_with_spaces.ts b/x-pack/test/api_integration/apis/ml/datafeeds/get_stats_with_spaces.ts new file mode 100644 index 0000000000000..aaa60aabdfbd0 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/datafeeds/get_stats_with_spaces.ts @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const ml = getService('ml'); + const spacesService = getService('spaces'); + const supertest = getService('supertestWithoutAuth'); + + const jobIdSpace1 = 'fq_single_space1'; + const datafeedIdSpace1 = `datafeed-${jobIdSpace1}`; + const datafeedIdWildcardSpace1 = `datafeed-${jobIdSpace1}*`; + const idSpace1 = 'space1'; + const idSpace2 = 'space2'; + + async function getDatafeedStatsById( + datafeedId: string | undefined, + expectedStatusCode: number, + space?: string + ) { + const { body } = await supertest + .get( + `${space ? `/s/${space}` : ''}/api/ml/datafeeds${datafeedId ? `/${datafeedId}` : ''}/_stats` + ) + .auth( + USER.ML_VIEWER_ALL_SPACES, + ml.securityCommon.getPasswordForUser(USER.ML_VIEWER_ALL_SPACES) + ) + .set(COMMON_REQUEST_HEADERS) + .expect(expectedStatusCode); + + return body; + } + + describe('GET datafeed stats with spaces', () => { + before(async () => { + await spacesService.create({ id: idSpace1, name: 'space_one', disabledFeatures: [] }); + await spacesService.create({ id: idSpace2, name: 'space_two', disabledFeatures: [] }); + + const jobConfig = ml.commonConfig.getADFqSingleMetricJobConfig(jobIdSpace1); + await ml.api.createAnomalyDetectionJob(jobConfig, idSpace1); + const datafeedConfig = ml.commonConfig.getADFqDatafeedConfig(jobIdSpace1); + await ml.api.createDatafeed(datafeedConfig, idSpace1); + + await ml.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await spacesService.delete(idSpace1); + await spacesService.delete(idSpace2); + await ml.api.cleanMlIndices(); + await ml.testResources.cleanMLSavedObjects(); + }); + + it('should fail with non-existing datafeed', async () => { + await getDatafeedStatsById('non-existing-datafeed', 404); + }); + + it('should return datafeed stats with datafeed id from correct space', async () => { + const body = await getDatafeedStatsById(datafeedIdSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 1, + `response datafeeds list should contain correct datafeed (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return datafeed stats with datafeed wildcard from correct space', async () => { + const body = await getDatafeedStatsById(datafeedIdWildcardSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 1, + `response datafeeds list should contain correct datafeed (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return all datafeed stats when not specifying id', async () => { + const body = await getDatafeedStatsById(undefined, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 1, + `response datafeeds list should contain correct datafeed (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return empty list with non-existing datafeed wildcard', async () => { + const body = await getDatafeedStatsById('non-existing-datafeed*', 200); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 0, + `response datafeed list should be empty (got ${JSON.stringify(body.datafeeds)})` + ); + }); + + it('should fail with datafeed from different space', async () => { + await getDatafeedStatsById(datafeedIdSpace1, 404, idSpace2); + }); + + it('should return empty list with datafeed wildcard from different space', async () => { + const body = await getDatafeedStatsById(datafeedIdWildcardSpace1, 200, idSpace2); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 0, + `response datafeed list should be empty (got ${JSON.stringify(body.datafeeds)})` + ); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/datafeeds/get_with_spaces.ts b/x-pack/test/api_integration/apis/ml/datafeeds/get_with_spaces.ts new file mode 100644 index 0000000000000..a1b045832789e --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/datafeeds/get_with_spaces.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const ml = getService('ml'); + const spacesService = getService('spaces'); + const supertest = getService('supertestWithoutAuth'); + + const jobIdSpace1 = 'fq_single_space1'; + const datafeedIdSpace1 = `datafeed-${jobIdSpace1}`; + const datafeedIdWildcardSpace1 = `datafeed-${jobIdSpace1}*`; + const idSpace1 = 'space1'; + const idSpace2 = 'space2'; + + async function getDatafeedById( + datafeedId: string | undefined, + expectedStatusCode: number, + space?: string + ) { + const { body } = await supertest + .get(`${space ? `/s/${space}` : ''}/api/ml/datafeeds${datafeedId ? `/${datafeedId}` : ''}`) + .auth( + USER.ML_VIEWER_ALL_SPACES, + ml.securityCommon.getPasswordForUser(USER.ML_VIEWER_ALL_SPACES) + ) + .set(COMMON_REQUEST_HEADERS) + .expect(expectedStatusCode); + + return body; + } + + describe('GET datafeeds with spaces', () => { + before(async () => { + await spacesService.create({ id: idSpace1, name: 'space_one', disabledFeatures: [] }); + await spacesService.create({ id: idSpace2, name: 'space_two', disabledFeatures: [] }); + + const jobConfig = ml.commonConfig.getADFqSingleMetricJobConfig(jobIdSpace1); + await ml.api.createAnomalyDetectionJob(jobConfig, idSpace1); + const datafeedConfig = ml.commonConfig.getADFqDatafeedConfig(jobIdSpace1); + await ml.api.createDatafeed(datafeedConfig, idSpace1); + + await ml.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await spacesService.delete(idSpace1); + await spacesService.delete(idSpace2); + await ml.api.cleanMlIndices(); + await ml.testResources.cleanMLSavedObjects(); + }); + + it('should fail with non-existing datafeed', async () => { + await getDatafeedById('non-existing-datafeed', 404); + }); + + it('should return datafeed with datafeed id from correct space', async () => { + const body = await getDatafeedById(datafeedIdSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 1, + `response datafeeds list should contain correct datafeed (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return datafeed with datafeed wildcard from correct space', async () => { + const body = await getDatafeedById(datafeedIdWildcardSpace1, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 1, + `response datafeeds list should contain correct datafeed (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return all datafeeds when not specifying id', async () => { + const body = await getDatafeedById(undefined, 200, idSpace1); + + expect(body.count).to.eql(1, `response count should be 1 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 1, + `response datafeeds list should contain correct datafeed (got ${JSON.stringify(body.jobs)})` + ); + }); + + it('should return empty list with non-existing datafeed wildcard', async () => { + const body = await getDatafeedById('non-existing-datafeed*', 200); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 0, + `response datafeed list should be empty (got ${JSON.stringify(body.datafeeds)})` + ); + }); + + it('should fail with datafeed from different space', async () => { + await getDatafeedById(datafeedIdSpace1, 404, idSpace2); + }); + + it('should return empty list with datafeed wildcard from different space', async () => { + const body = await getDatafeedById(datafeedIdWildcardSpace1, 200, idSpace2); + + expect(body.count).to.eql(0, `response count should be 0 (got ${body.count})`); + expect(body.datafeeds.length).to.eql( + 0, + `response datafeed list should be empty (got ${JSON.stringify(body.datafeeds)})` + ); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/datafeeds/index.ts b/x-pack/test/api_integration/apis/ml/datafeeds/index.ts new file mode 100644 index 0000000000000..4e92c9969a8f4 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/datafeeds/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('anomaly detectors', function () { + loadTestFile(require.resolve('./get_with_spaces')); + loadTestFile(require.resolve('./get_stats_with_spaces')); + }); +} diff --git a/x-pack/test/api_integration/apis/ml/index.ts b/x-pack/test/api_integration/apis/ml/index.ts index e44d0cd10e9f2..06910e8fac67e 100644 --- a/x-pack/test/api_integration/apis/ml/index.ts +++ b/x-pack/test/api_integration/apis/ml/index.ts @@ -44,6 +44,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/ml/ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/categorization'); + await esArchiver.unload('x-pack/test/functional/es_archives/ml/categorization_small'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_apache'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_auditbeat'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_apm'); @@ -71,6 +72,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./annotations')); loadTestFile(require.resolve('./anomaly_detectors')); loadTestFile(require.resolve('./calendars')); + loadTestFile(require.resolve('./datafeeds')); loadTestFile(require.resolve('./data_frame_analytics')); loadTestFile(require.resolve('./data_visualizer')); loadTestFile(require.resolve('./fields_service')); diff --git a/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts b/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts index 4686787ae9b16..9d6009bbb3ea6 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts @@ -64,7 +64,7 @@ const analyzer = { ], }; const defaultRequestBody = { - indexPatternTitle: 'ft_categorization', + indexPatternTitle: 'ft_categorization_small', query: { bool: { must: [{ match_all: {} }] } }, size: 5, timeField: '@timestamp', @@ -286,7 +286,7 @@ export default ({ getService }: FtrProviderContext) => { describe('Categorization example endpoint - ', function () { before(async () => { - await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/categorization'); + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/categorization_small'); await ml.testResources.setKibanaTimeZoneToUTC(); }); diff --git a/x-pack/test/api_integration/apis/security/privileges.ts b/x-pack/test/api_integration/apis/security/privileges.ts index 4c41a4f992ab9..48361048047a7 100644 --- a/x-pack/test/api_integration/apis/security/privileges.ts +++ b/x-pack/test/api_integration/apis/security/privileges.ts @@ -28,6 +28,7 @@ export default function ({ getService }: FtrProviderContext) { savedObjectsTagging: ['all', 'read'], canvas: ['all', 'read'], maps: ['all', 'read'], + observabilityCases: ['all', 'read'], fleet: ['all', 'read'], actions: ['all', 'read'], stackAlerts: ['all', 'read'], diff --git a/x-pack/test/api_integration/apis/security/privileges_basic.ts b/x-pack/test/api_integration/apis/security/privileges_basic.ts index 108030a4e1aab..117912b902ad1 100644 --- a/x-pack/test/api_integration/apis/security/privileges_basic.ts +++ b/x-pack/test/api_integration/apis/security/privileges_basic.ts @@ -30,6 +30,7 @@ export default function ({ getService }: FtrProviderContext) { savedObjectsTagging: ['all', 'read'], graph: ['all', 'read'], maps: ['all', 'read'], + observabilityCases: ['all', 'read'], canvas: ['all', 'read'], infrastructure: ['all', 'read'], logs: ['all', 'read'], diff --git a/x-pack/test/api_integration/apis/security_solution/authentications.ts b/x-pack/test/api_integration/apis/security_solution/authentications.ts index 4ea8b8ab82e16..8254ce034d2a5 100644 --- a/x-pack/test/api_integration/apis/security_solution/authentications.ts +++ b/x-pack/test/api_integration/apis/security_solution/authentications.ts @@ -6,7 +6,10 @@ */ import expect from '@kbn/expect'; -import { HostsQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + HostAuthenticationsStrategyResponse, + HostsQueries, +} from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -22,16 +25,19 @@ const EDGE_LENGTH = 1; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('authentications', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts')); + before(async () => await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts')); + + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts') + ); it('Make sure that we get Authentication data', async () => { - const { body: authentications } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const authentications = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.authentications, timerange: { interval: '12h', @@ -47,9 +53,9 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['auditbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(authentications.edges.length).to.be(EDGE_LENGTH); expect(authentications.totalCount).to.be(TOTAL_COUNT); @@ -57,10 +63,9 @@ export default function ({ getService }: FtrProviderContext) { }); it('Make sure that pagination is working in Authentications query', async () => { - const { body: authentications } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const authentications = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.authentications, timerange: { interval: '12h', @@ -76,16 +81,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['auditbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(authentications.edges.length).to.be(EDGE_LENGTH); expect(authentications.totalCount).to.be(TOTAL_COUNT); - expect(authentications.edges[0]!.node.lastSuccess!.source!.ip).to.eql([ + expect(authentications.edges[0].node.lastSuccess?.source?.ip).to.eql([ LAST_SUCCESS_SOURCE_IP, ]); - expect(authentications.edges[0]!.node.lastSuccess!.host!.name).to.eql([HOST_NAME]); + expect(authentications.edges[0].node.lastSuccess?.host?.name).to.eql([HOST_NAME]); }); }); } diff --git a/x-pack/test/api_integration/apis/security_solution/events.ts b/x-pack/test/api_integration/apis/security_solution/events.ts index f6a668679b11d..fef37e9939fcb 100644 --- a/x-pack/test/api_integration/apis/security_solution/events.ts +++ b/x-pack/test/api_integration/apis/security_solution/events.ts @@ -11,13 +11,13 @@ import { JsonObject } from '@kbn/utility-types'; import { Direction, TimelineEventsQueries, + TimelineEventsAllStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; import { getDocValueFields, getFieldsToRequest, getFilterValue } from './utils'; const TO = '3000-01-01T00:00:00.000Z'; const FROM = '2000-01-01T00:00:00.000Z'; -const TEST_URL = '/internal/search/timelineSearchStrategy/'; // typical values that have to change after an update from "scripts/es_archiver" const DATA_COUNT = 7; const HOST_NAME = 'suricata-sensor-amsterdam'; @@ -30,6 +30,8 @@ const LIMITED_PAGE_SIZE = 2; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); + const getPostBody = (): JsonObject => ({ defaultIndex: ['auditbeat-*'], docValueFields: getDocValueFields(), @@ -66,14 +68,14 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns Timeline data', async () => { - const resp = await supertest - .post(TEST_URL) - .set('kbn-xsrf', 'true') - .set('Content-Type', 'application/json') - .send(getPostBody()) - .expect(200); + const timeline = await bsearch.send({ + supertest, + options: { + ...getPostBody(), + }, + strategy: 'timelineSearchStrategy', + }); - const timeline = resp.body; expect(timeline.edges.length).to.be(EDGE_LENGTH); expect(timeline.edges[0].node.data.length).to.be(DATA_COUNT); expect(timeline.totalCount).to.be(TOTAL_COUNT); @@ -82,20 +84,17 @@ export default function ({ getService }: FtrProviderContext) { }); it('returns paginated Timeline query', async () => { - const resp = await supertest - .post(TEST_URL) - .set('kbn-xsrf', 'true') - .set('Content-Type', 'application/json') - .send({ + const timeline = await bsearch.send({ + supertest, + options: { ...getPostBody(), pagination: { activePage: 0, querySize: LIMITED_PAGE_SIZE, }, - }) - .expect(200); - - const timeline = resp.body; + }, + strategy: 'timelineSearchStrategy', + }); expect(timeline.edges.length).to.be(LIMITED_PAGE_SIZE); expect(timeline.edges[0].node.data.length).to.be(DATA_COUNT); expect(timeline.totalCount).to.be(TOTAL_COUNT); diff --git a/x-pack/test/api_integration/apis/security_solution/host_details.ts b/x-pack/test/api_integration/apis/security_solution/host_details.ts index 114f60a21c4e3..d2de0f84a3769 100644 --- a/x-pack/test/api_integration/apis/security_solution/host_details.ts +++ b/x-pack/test/api_integration/apis/security_solution/host_details.ts @@ -7,16 +7,24 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { HostsQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + HostDetailsStrategyResponse, + HostsQueries, +} from '../../../../plugins/security_solution/common/search_strategy'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Host Details', () => { describe('With filebeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -213,12 +221,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get HostDetails data', async () => { - const { - body: { hostDetails }, - } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const { hostDetails } = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.details, timerange: { interval: '12h', @@ -229,9 +234,9 @@ export default function ({ getService }: FtrProviderContext) { docValueFields: [], hostName: 'raspberrypi', inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(hostDetails).to.eql(expectedResult.hostDetails); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/hosts.ts b/x-pack/test/api_integration/apis/security_solution/hosts.ts index 12b9ce138d175..bb2969f85a98b 100644 --- a/x-pack/test/api_integration/apis/security_solution/hosts.ts +++ b/x-pack/test/api_integration/apis/security_solution/hosts.ts @@ -10,6 +10,9 @@ import { HostsQueries, Direction, HostsFields, + HostsStrategyResponse, + HostDetailsStrategyResponse, + HostFirstLastSeenStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -26,16 +29,19 @@ const CURSOR_ID = '2ab45fc1c41e4c84bbd02202a7e5761f'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('hosts', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts')); + before(async () => await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts')); + + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts') + ); it('Make sure that we get Hosts Table data', async () => { - const { body: hosts } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const hosts = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.hosts, timerange: { interval: '12h', @@ -55,19 +61,18 @@ export default function ({ getService }: FtrProviderContext) { querySize: 1, }, inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(hosts.edges.length).to.be(EDGE_LENGTH); expect(hosts.totalCount).to.be(TOTAL_COUNT); expect(hosts.pageInfo.fakeTotalCount).to.equal(3); }); it('Make sure that pagination is working in Hosts Table query', async () => { - const { body: hosts } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const hosts = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.hosts, timerange: { interval: '12h', @@ -87,16 +92,32 @@ export default function ({ getService }: FtrProviderContext) { querySize: 2, }, inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(hosts.edges.length).to.be(EDGE_LENGTH); expect(hosts.totalCount).to.be(TOTAL_COUNT); - expect(hosts.edges[0]!.node.host!.os!.name).to.eql([HOST_NAME]); + expect(hosts.edges[0].node.host?.os?.name).to.eql([HOST_NAME]); }); it('Make sure that we get Host details data', async () => { - const expectedHostDetails = { + const { hostDetails } = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsQueries.details, + hostName: 'zeek-sensor-san-francisco', + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', + }); + expect(hostDetails).to.eql({ _id: 'zeek-sensor-san-francisco', host: { architecture: ['x86_64'], @@ -121,91 +142,66 @@ export default function ({ getService }: FtrProviderContext) { provider: ['digitalocean'], region: ['sfo2'], }, - }; - const { - body: { hostDetails }, - } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsQueries.details, - hostName: 'zeek-sensor-san-francisco', - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - - expect(hostDetails).to.eql(expectedHostDetails); + }); }); it('Make sure that we get First Seen for a Host without docValueFields', async () => { - const { body: firstLastSeenHost } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const firstLastSeenHost = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.firstOrLastSeen, defaultIndex: ['auditbeat-*'], docValueFields: [], hostName: 'zeek-sensor-san-francisco', order: 'asc', - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(firstLastSeenHost.firstSeen).to.eql('2019-02-19T19:36:23.561Z'); }); it('Make sure that we get Last Seen for a Host without docValueFields', async () => { - const { body: firstLastSeenHost } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const firstLastSeenHost = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.firstOrLastSeen, defaultIndex: ['auditbeat-*'], docValueFields: [], hostName: 'zeek-sensor-san-francisco', order: 'desc', - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(firstLastSeenHost.lastSeen).to.eql('2019-02-19T20:42:33.561Z'); }); it('Make sure that we get First Seen for a Host with docValueFields', async () => { - const { body: firstLastSeenHost } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const firstLastSeenHost = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.firstOrLastSeen, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], docValueFields: [{ field: '@timestamp', format: 'epoch_millis' }], hostName: 'zeek-sensor-san-francisco', order: 'asc', - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(firstLastSeenHost.firstSeen).to.eql(new Date('2019-02-19T19:36:23.561Z').valueOf()); }); it('Make sure that we get Last Seen for a Host with docValueFields', async () => { - const { body: firstLastSeenHost } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const firstLastSeenHost = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.firstOrLastSeen, defaultIndex: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], docValueFields: [{ field: '@timestamp', format: 'epoch_millis' }], hostName: 'zeek-sensor-san-francisco', order: 'desc', - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(firstLastSeenHost.lastSeen).to.eql(new Date('2019-02-19T20:42:33.561Z').valueOf()); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts b/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts index 632f738d85f36..f38cf406a9dbe 100644 --- a/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts +++ b/x-pack/test/api_integration/apis/security_solution/kpi_hosts.ts @@ -6,18 +6,27 @@ */ import expect from '@kbn/expect'; -import { HostsKpiQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + HostsKpiAuthenticationsStrategyResponse, + HostsKpiHostsStrategyResponse, + HostsKpiQueries, + HostsKpiUniqueIpsStrategyResponse, +} from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { - const retry = getService('retry'); const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Kpi Hosts', () => { describe('With filebeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/kpi_hosts')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/kpi_hosts')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/kpi_hosts') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/kpi_hosts') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -50,88 +59,80 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get KpiHosts data', async () => { - await retry.try(async () => { - const { body: kpiHosts } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiHosts, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['filebeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - - expect(kpiHosts.hostsHistogram!).to.eql(expectedResult.hostsHistogram); - expect(kpiHosts.hosts!).to.eql(expectedResult.hosts); + const kpiHosts = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsKpiQueries.kpiHosts, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['filebeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(kpiHosts.hostsHistogram).to.eql(expectedResult.hostsHistogram); + expect(kpiHosts.hosts).to.eql(expectedResult.hosts); }); it('Make sure that we get KpiAuthentications data', async () => { - await retry.try(async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiAuthentications, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['filebeat-*'], - docValueFields: [], - inspect: false, - /* We need a very long timeout to avoid returning just partial data. - ** https://github.com/elastic/kibana/blob/master/x-pack/test/api_integration/apis/search/search.ts#L18 - */ - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.authenticationsSuccess!).to.eql(expectedResult.authSuccess); - expect(body.authenticationsSuccessHistogram!).to.eql(expectedResult.authSuccessHistogram); - expect(body.authenticationsFailure!).to.eql(expectedResult.authFailure); - expect(body.authenticationsFailureHistogram!).to.eql(expectedResult.authFailureHistogram); + const body = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsKpiQueries.kpiAuthentications, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['filebeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(body.authenticationsSuccess).to.eql(expectedResult.authSuccess); + expect(body.authenticationsSuccessHistogram).to.eql(expectedResult.authSuccessHistogram); + expect(body.authenticationsFailure).to.eql(expectedResult.authFailure); + expect(body.authenticationsFailureHistogram).to.eql(expectedResult.authFailureHistogram); }); it('Make sure that we get KpiUniqueIps data', async () => { - await retry.try(async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiUniqueIps, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['filebeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); - expect(body.uniqueDestinationIpsHistogram!).to.eql( - expectedResult.uniqueDestinationIpsHistogram - ); - expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); - expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); + const body = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsKpiQueries.kpiUniqueIps, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['filebeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(body.uniqueDestinationIps).to.eql(expectedResult.uniqueDestinationIps); + expect(body.uniqueDestinationIpsHistogram).to.eql( + expectedResult.uniqueDestinationIpsHistogram + ); + expect(body.uniqueSourceIps).to.eql(expectedResult.uniqueSourceIps); + expect(body.uniqueSourceIpsHistogram).to.eql(expectedResult.uniqueSourceIpsHistogram); }); }); describe('With auditbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/auditbeat/kpi_hosts')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/kpi_hosts')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/kpi_hosts') + ); + after( + async () => + await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/kpi_hosts') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -188,79 +189,69 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get KpiHosts data', async () => { - await retry.try(async () => { - const { body: kpiHosts } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiHosts, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - - expect(kpiHosts.hostsHistogram!).to.eql(expectedResult.hostsHistogram); - expect(kpiHosts.hosts!).to.eql(expectedResult.hosts); + const kpiHosts = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsKpiQueries.kpiHosts, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(kpiHosts.hostsHistogram).to.eql(expectedResult.hostsHistogram); + expect(kpiHosts.hosts).to.eql(expectedResult.hosts); }); it('Make sure that we get KpiAuthentications data', async () => { - await retry.try(async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiAuthentications, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.authenticationsSuccess!).to.eql(expectedResult.authSuccess); - expect(body.authenticationsSuccessHistogram!).to.eql(expectedResult.authSuccessHistogram); - expect(body.authenticationsFailure!).to.eql(expectedResult.authFailure); - expect(body.authenticationsFailureHistogram!).to.eql(expectedResult.authFailureHistogram); + const body = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsKpiQueries.kpiAuthentications, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(body.authenticationsSuccess).to.eql(expectedResult.authSuccess); + expect(body.authenticationsSuccessHistogram).to.eql(expectedResult.authSuccessHistogram); + expect(body.authenticationsFailure).to.eql(expectedResult.authFailure); + expect(body.authenticationsFailureHistogram).to.eql(expectedResult.authFailureHistogram); }); it('Make sure that we get KpiUniqueIps data', async () => { - await retry.try(async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsKpiQueries.kpiUniqueIps, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-*'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); - expect(body.uniqueDestinationIpsHistogram!).to.eql( - expectedResult.uniqueDestinationIpsHistogram - ); - expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); - expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); + const body = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsKpiQueries.kpiUniqueIps, + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-*'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(body.uniqueDestinationIps!).to.eql(expectedResult.uniqueDestinationIps); + expect(body.uniqueDestinationIpsHistogram!).to.eql( + expectedResult.uniqueDestinationIpsHistogram + ); + expect(body.uniqueSourceIps!).to.eql(expectedResult.uniqueSourceIps); + expect(body.uniqueSourceIpsHistogram!).to.eql(expectedResult.uniqueSourceIpsHistogram); }); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/kpi_network.ts b/x-pack/test/api_integration/apis/security_solution/kpi_network.ts index 53b099bbe18d3..637b69ff1daaa 100644 --- a/x-pack/test/api_integration/apis/security_solution/kpi_network.ts +++ b/x-pack/test/api_integration/apis/security_solution/kpi_network.ts @@ -7,16 +7,28 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { NetworkKpiQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + NetworkKpiDnsStrategyResponse, + NetworkKpiNetworkEventsStrategyResponse, + NetworkKpiQueries, + NetworkKpiTlsHandshakesStrategyResponse, + NetworkKpiUniqueFlowsStrategyResponse, + NetworkKpiUniquePrivateIpsStrategyResponse, +} from '../../../../plugins/security_solution/common/search_strategy'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Kpi Network', () => { describe('With filebeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -66,10 +78,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get KpiNetwork uniqueFlows data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.uniqueFlows, timerange: { interval: '12h', @@ -79,18 +90,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['filebeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.uniqueFlowId).to.eql(expectedResult.uniqueFlowId); }); it('Make sure that we get KpiNetwork networkEvents data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.networkEvents, timerange: { interval: '12h', @@ -100,18 +109,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['filebeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.networkEvents).to.eql(expectedResult.networkEvents); }); it('Make sure that we get KpiNetwork DNS data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.dns, timerange: { interval: '12h', @@ -121,18 +128,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['filebeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.dnsQueries).to.eql(expectedResult.dnsQueries); }); it('Make sure that we get KpiNetwork networkEvents data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.networkEvents, timerange: { interval: '12h', @@ -142,18 +147,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['filebeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.networkEvents).to.eql(expectedResult.networkEvents); }); it('Make sure that we get KpiNetwork tlsHandshakes data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.tlsHandshakes, timerange: { interval: '12h', @@ -163,18 +166,17 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['filebeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.tlsHandshakes).to.eql(expectedResult.tlsHandshakes); }); it('Make sure that we get KpiNetwork uniquePrivateIps data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.uniquePrivateIps, timerange: { interval: '12h', @@ -184,9 +186,9 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['filebeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.uniqueDestinationPrivateIps).to.eql( expectedResult.uniqueDestinationPrivateIps @@ -202,8 +204,12 @@ export default function ({ getService }: FtrProviderContext) { }); describe('With packetbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/packetbeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/packetbeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/default') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -219,10 +225,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get KpiNetwork uniqueFlows data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.uniqueFlows, timerange: { interval: '12h', @@ -232,18 +237,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.uniqueFlowId).to.eql(expectedResult.uniqueFlowId); }); it('Make sure that we get KpiNetwork DNS data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.dns, timerange: { interval: '12h', @@ -253,18 +256,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.dnsQueries).to.eql(expectedResult.dnsQueries); }); it('Make sure that we get KpiNetwork networkEvents data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.networkEvents, timerange: { interval: '12h', @@ -274,18 +275,17 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.networkEvents).to.eql(expectedResult.networkEvents); }); it('Make sure that we get KpiNetwork tlsHandshakes data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.tlsHandshakes, timerange: { interval: '12h', @@ -295,18 +295,16 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.tlsHandshakes).to.eql(expectedResult.tlsHandshakes); }); it('Make sure that we get KpiNetwork uniquePrivateIps data', async () => { - const { body: kpiNetwork } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const kpiNetwork = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkKpiQueries.uniquePrivateIps, timerange: { interval: '12h', @@ -316,9 +314,9 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(kpiNetwork.uniqueDestinationPrivateIps).to.eql( expectedResult.uniqueDestinationPrivateIps diff --git a/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts b/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts index 6040ecd1001d9..c7b6bbb84436f 100644 --- a/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts +++ b/x-pack/test/api_integration/apis/security_solution/matrix_dns_histogram.ts @@ -6,54 +6,43 @@ */ import expect from '@kbn/expect'; -import request from 'superagent'; import { MatrixHistogramQuery, MatrixHistogramType, + NetworkDnsStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; -/** - * Function copied from here: - * test/api_integration/apis/search/bsearch.ts - * - * Splits the JSON lines from bsearch - */ -export const parseBfetchResponse = (resp: request.Response): Array> => { - return resp.text - .trim() - .split('\n') - .map((item) => JSON.parse(item)); -}; - export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - const retry = getService('retry'); + const bsearch = getService('bsearch'); describe('Matrix DNS Histogram', () => { describe('Large data set', () => { - before(() => - esArchiver.load( - 'x-pack/test/functional/es_archives/security_solution/matrix_dns_histogram/large_dns_query' - ) + before( + async () => + await esArchiver.load( + 'x-pack/test/functional/es_archives/security_solution/matrix_dns_histogram/large_dns_query' + ) ); - after(() => - esArchiver.unload( - 'x-pack/test/functional/es_archives/security_solution/matrix_dns_histogram/large_dns_query' - ) + + after( + async () => + await esArchiver.unload( + 'x-pack/test/functional/es_archives/security_solution/matrix_dns_histogram/large_dns_query' + ) ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; it('Make sure that we get dns data without getting bucket errors when querying large volume of data', async () => { - const { body: networkDns } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkDns = await bsearch.send({ + supertest, + options: { defaultIndex: ['large_volume_dns_data'], docValueFields: [], factoryQueryType: MatrixHistogramQuery, @@ -62,56 +51,14 @@ export default function ({ getService }: FtrProviderContext) { '{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[]}}', isPtrIncluded: false, timerange: { - interval: '12h', + interval: '12', to: TO, from: FROM, }, - }) - .expect(200); - - if (networkDns.isRunning === true) { - await retry.waitForWithTimeout('bsearch to give us results', 5000, async () => { - const resp = await supertest - .post('/internal/bsearch') - .set('kbn-xsrf', 'true') - .send({ - batch: [ - { - request: { - id: networkDns.id, - defaultIndex: ['large_volume_dns_data'], - docValueFields: [], - factoryQueryType: MatrixHistogramQuery, - histogramType: MatrixHistogramType.dns, - filterQuery: - '{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[]}}', - isPtrIncluded: false, - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - }, - options: { - strategy: 'securitySolutionSearchStrategy', - }, - }, - ], - }); - const parsedResponse = parseBfetchResponse(resp); - // NOTE: I would like this test to be ".to.equal(6604)" but that is flakey as sometimes the query - // does not give me that exact value. It gives me failures as seen here with notes: https://github.com/elastic/kibana/issues/97365 - // I don't think this is a bug with the query but possibly a consistency view issue with interacting with the archive - // so we instead loosen this test up a bit to avoid flake. - expect(parsedResponse[0].result.rawResponse.aggregations.dns_count.value).to.be.above( - 0 - ); - return true; - }); - } else { - expect(networkDns.isRunning).to.equal(false); - expect(networkDns.rawResponse.aggregations.dns_count.value).to.equal(6604); - } + }, + strategy: 'securitySolutionSearchStrategy', + }); + expect(networkDns.rawResponse.aggregations?.dns_count).to.eql({ value: 6604 }); }); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/network_details.ts b/x-pack/test/api_integration/apis/security_solution/network_details.ts index 0397e7550c935..07e526c7c4bf5 100644 --- a/x-pack/test/api_integration/apis/security_solution/network_details.ts +++ b/x-pack/test/api_integration/apis/security_solution/network_details.ts @@ -6,59 +6,70 @@ */ import expect from '@kbn/expect'; -import { NetworkQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + NetworkDetailsStrategyResponse, + NetworkQueries, +} from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); + describe('Network details', () => { describe('With filebeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default') + ); it('Make sure that we get Network details data', async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const body = await bsearch.send({ + supertest, + options: { ip: '151.205.0.17', defaultIndex: ['filebeat-*'], factoryQueryType: NetworkQueries.details, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); - expect(body.networkDetails!.source!.geo!.continent_name).to.be('North America'); - expect(body.networkDetails!.source!.geo!.location!.lat!).to.be(37.751); - expect(body.networkDetails!.host.os!.platform!).to.eql(['raspbian']); + expect(body.networkDetails.source?.geo.continent_name).to.be('North America'); + expect(body.networkDetails.source?.geo.location?.lat!).to.be(37.751); + expect(body.networkDetails.host?.os?.platform).to.eql(['raspbian']); }); }); describe('With packetbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/packetbeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/packetbeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/default') + ); it('Make sure that we get Network details data', async () => { - const { body } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const body = await bsearch.send({ + supertest, + options: { ip: '185.53.91.88', defaultIndex: ['packetbeat-*'], factoryQueryType: NetworkQueries.details, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); - expect(body.networkDetails!.host.id!).to.eql(['2ce8b1e7d69e4a1d9c6bcddc473da9d9']); - expect(body.networkDetails!.host.name!).to.eql(['zeek-sensor-amsterdam']); - expect(body.networkDetails!.host.os!.platform!).to.eql(['ubuntu']); + expect(body.networkDetails.host?.id).to.eql(['2ce8b1e7d69e4a1d9c6bcddc473da9d9']); + expect(body.networkDetails.host?.name).to.eql(['zeek-sensor-amsterdam']); + expect(body.networkDetails.host?.os?.platform!).to.eql(['ubuntu']); }); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/network_dns.ts b/x-pack/test/api_integration/apis/security_solution/network_dns.ts index 80660860a164b..474c6261babf0 100644 --- a/x-pack/test/api_integration/apis/security_solution/network_dns.ts +++ b/x-pack/test/api_integration/apis/security_solution/network_dns.ts @@ -11,6 +11,7 @@ import { NetworkDnsEdges, Direction, NetworkDnsFields, + NetworkDnsStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -18,20 +19,24 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Network DNS', () => { describe('With packetbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/packetbeat/dns')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/dns')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/packetbeat/dns') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/dns') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; it('Make sure that we get Dns data and sorting by uniqueDomains ascending', async () => { - const { body: networkDns } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkDns = await bsearch.send({ + supertest, + options: { defaultIndex: ['packetbeat-*'], docValueFields: [], factoryQueryType: NetworkQueries.dns, @@ -45,9 +50,9 @@ export default function ({ getService }: FtrProviderContext) { to: TO, from: FROM, }, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(networkDns.edges.length).to.be(10); expect(networkDns.totalCount).to.be(44); @@ -58,10 +63,9 @@ export default function ({ getService }: FtrProviderContext) { }); it('Make sure that we get Dns data and sorting by uniqueDomains descending', async () => { - const { body: networkDns } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkDns = await bsearch.send({ + supertest, + options: { ip: '151.205.0.17', defaultIndex: ['packetbeat-*'], factoryQueryType: NetworkQueries.dns, @@ -80,9 +84,9 @@ export default function ({ getService }: FtrProviderContext) { to: TO, from: FROM, }, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(networkDns.edges.length).to.be(10); expect(networkDns.totalCount).to.be(44); diff --git a/x-pack/test/api_integration/apis/security_solution/network_top_n_flow.ts b/x-pack/test/api_integration/apis/security_solution/network_top_n_flow.ts index af8e543907492..41b083ab90578 100644 --- a/x-pack/test/api_integration/apis/security_solution/network_top_n_flow.ts +++ b/x-pack/test/api_integration/apis/security_solution/network_top_n_flow.ts @@ -12,6 +12,7 @@ import { Direction, FlowTargetSourceDest, NetworkTopTablesFields, + NetworkTopNFlowStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -21,20 +22,24 @@ const EDGE_LENGTH = 10; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Network Top N Flow', () => { describe('With filebeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default') + ); const FROM = '2019-02-09T01:57:24.870Z'; const TO = '2019-02-12T01:57:24.870Z'; it('Make sure that we get Source NetworkTopNFlow data with bytes_in descending sort', async () => { - const { body: networkTopNFlow } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkTopNFlow = await bsearch.send({ + supertest, + options: { defaultIndex: ['filebeat-*'], factoryQueryType: NetworkQueries.topNFlow, flowTarget: FlowTargetSourceDest.source, @@ -52,9 +57,9 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(121); @@ -70,10 +75,9 @@ export default function ({ getService }: FtrProviderContext) { }); it('Make sure that we get Source NetworkTopNFlow data with bytes_in ascending sort ', async () => { - const { body: networkTopNFlow } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkTopNFlow = await bsearch.send({ + supertest, + options: { defaultIndex: ['filebeat-*'], factoryQueryType: 'topNFlow', filterQuery: @@ -93,9 +97,9 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(121); @@ -111,10 +115,9 @@ export default function ({ getService }: FtrProviderContext) { }); it('Make sure that we get Destination NetworkTopNFlow data', async () => { - const { body: networkTopNFlow } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkTopNFlow = await bsearch.send({ + supertest, + options: { defaultIndex: ['filebeat-*'], factoryQueryType: 'topNFlow', filterQuery: @@ -134,9 +137,10 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); + expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(154); expect(networkTopNFlow.edges[0].node.destination!.flows).to.be(19); @@ -146,10 +150,9 @@ export default function ({ getService }: FtrProviderContext) { }); it('Make sure that pagination is working in NetworkTopNFlow query', async () => { - const { body: networkTopNFlow } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const networkTopNFlow = await bsearch.send({ + supertest, + options: { defaultIndex: ['filebeat-*'], factoryQueryType: 'topNFlow', filterQuery: @@ -169,9 +172,9 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(networkTopNFlow.edges.length).to.be(EDGE_LENGTH); expect(networkTopNFlow.totalCount).to.be(121); diff --git a/x-pack/test/api_integration/apis/security_solution/overview_host.ts b/x-pack/test/api_integration/apis/security_solution/overview_host.ts index 09bd09782d2f2..b2a32ac46c3f3 100644 --- a/x-pack/test/api_integration/apis/security_solution/overview_host.ts +++ b/x-pack/test/api_integration/apis/security_solution/overview_host.ts @@ -8,16 +8,24 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { HostsQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + HostsQueries, + HostsOverviewStrategyResponse, +} from '../../../../plugins/security_solution/common/search_strategy'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Overview Host', () => { describe('With auditbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/auditbeat/overview')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/overview')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/overview') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/overview') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -41,12 +49,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get OverviewHost data', async () => { - const { - body: { overviewHost }, - } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const { overviewHost } = await bsearch.send({ + supertest, + options: { defaultIndex: ['auditbeat-*'], factoryQueryType: HostsQueries.overview, timerange: { @@ -56,9 +61,9 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(overviewHost).to.eql(expectedResult); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/overview_network.ts b/x-pack/test/api_integration/apis/security_solution/overview_network.ts index 00adc903d5733..ffee9b851ffc0 100644 --- a/x-pack/test/api_integration/apis/security_solution/overview_network.ts +++ b/x-pack/test/api_integration/apis/security_solution/overview_network.ts @@ -7,16 +7,24 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -import { NetworkQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + NetworkOverviewStrategyResponse, + NetworkQueries, +} from '../../../../plugins/security_solution/common/search_strategy'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Overview Network', () => { describe('With filebeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -34,12 +42,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get OverviewNetwork data', async () => { - const { - body: { overviewNetwork }, - } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const { overviewNetwork } = await bsearch.send({ + supertest, + options: { defaultIndex: ['filebeat-*'], factoryQueryType: NetworkQueries.overview, timerange: { @@ -49,16 +54,21 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(overviewNetwork).to.eql(expectedResult); }); }); describe('With packetbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/packetbeat/overview')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/overview')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/packetbeat/overview') + ); + after( + async () => + await esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/overview') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -75,12 +85,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get OverviewNetwork data', async () => { - const { - body: { overviewNetwork }, - } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const { overviewNetwork } = await bsearch.send({ + supertest, + options: { defaultIndex: ['packetbeat-*'], factoryQueryType: NetworkQueries.overview, timerange: { @@ -90,17 +97,20 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(overviewNetwork).to.eql(expectedResult); }); }); describe('With auditbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/auditbeat/overview')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/overview')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/overview') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/overview') + ); const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -117,12 +127,9 @@ export default function ({ getService }: FtrProviderContext) { }; it('Make sure that we get OverviewNetwork data', async () => { - const { - body: { overviewNetwork }, - } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const { overviewNetwork } = await bsearch.send({ + supertest, + options: { defaultIndex: ['auditbeat-*'], factoryQueryType: NetworkQueries.overview, timerange: { @@ -132,9 +139,9 @@ export default function ({ getService }: FtrProviderContext) { }, docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(overviewNetwork).to.eql(expectedResult); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/timeline_details.ts b/x-pack/test/api_integration/apis/security_solution/timeline_details.ts index 37a14847b6d99..49124bca42ffe 100644 --- a/x-pack/test/api_integration/apis/security_solution/timeline_details.ts +++ b/x-pack/test/api_integration/apis/security_solution/timeline_details.ts @@ -7,7 +7,11 @@ import expect from '@kbn/expect'; import { sortBy } from 'lodash'; -import { TimelineEventsQueries } from '../../../../plugins/security_solution/common/search_strategy'; +import { + TimelineEventsQueries, + TimelineEventsDetailsStrategyResponse, + TimelineKpiStrategyResponse, +} from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -675,54 +679,49 @@ const EXPECTED_KPI_COUNTS = { }; export default function ({ getService }: FtrProviderContext) { - const retry = getService('retry'); const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Timeline Details', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/filebeat/default')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/filebeat/default') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/filebeat/default') + ); it('Make sure that we get Event Details data', async () => { - await retry.try(async () => { - const { - body: { data: detailsData }, - } = await supertest - .post('/internal/search/timelineSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: TimelineEventsQueries.details, - docValueFields: [], - indexName: INDEX_NAME, - inspect: false, - eventId: ID, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(sortBy(detailsData, 'field')).to.eql(sortBy(EXPECTED_DATA, 'field')); + const { data: detailsData } = await bsearch.send({ + supertest, + options: { + factoryQueryType: TimelineEventsQueries.details, + docValueFields: [], + indexName: INDEX_NAME, + inspect: false, + eventId: ID, + }, + strategy: 'timelineSearchStrategy', }); + expect(sortBy(detailsData, 'field')).to.eql(sortBy(EXPECTED_DATA, 'field')); }); it('Make sure that we get kpi data', async () => { - await retry.try(async () => { - const { - body: { destinationIpCount, hostCount, processCount, sourceIpCount, userCount }, - } = await supertest - .post('/internal/search/timelineSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const { destinationIpCount, hostCount, processCount, sourceIpCount, userCount } = + await bsearch.send({ + supertest, + options: { factoryQueryType: TimelineEventsQueries.kpi, docValueFields: [], indexName: INDEX_NAME, inspect: false, eventId: ID, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect({ destinationIpCount, hostCount, processCount, sourceIpCount, userCount }).to.eql( - EXPECTED_KPI_COUNTS - ); - }); + }, + strategy: 'timelineSearchStrategy', + }); + expect({ destinationIpCount, hostCount, processCount, sourceIpCount, userCount }).to.eql( + EXPECTED_KPI_COUNTS + ); }); }); } diff --git a/x-pack/test/api_integration/apis/security_solution/tls.ts b/x-pack/test/api_integration/apis/security_solution/tls.ts index 9fa251ded4e6b..c872844cb3d46 100644 --- a/x-pack/test/api_integration/apis/security_solution/tls.ts +++ b/x-pack/test/api_integration/apis/security_solution/tls.ts @@ -11,6 +11,7 @@ import { Direction, NetworkTlsFields, FlowTarget, + NetworkTlsStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -83,17 +84,21 @@ const expectedOverviewSourceResult = { export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('Tls Test with Packetbeat', () => { describe('Tls Test', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/packetbeat/tls')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/tls')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/packetbeat/tls') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/tls') + ); it('Ensure data is returned for FlowTarget.Source', async () => { - const { body: tls } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const tls = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkQueries.tls, timerange: { interval: '12h', @@ -112,19 +117,18 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(tls.edges.length).to.be(1); expect(tls.totalCount).to.be(1); expect(tls.edges[0].node).to.eql(expectedResult); }); it('Ensure data is returned for FlowTarget.Destination', async () => { - const { body: tls } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const tls = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkQueries.tls, timerange: { interval: '12h', @@ -143,9 +147,9 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); expect(tls.edges.length).to.be(1); expect(tls.totalCount).to.be(1); expect(tls.edges[0].node).to.eql(expectedResult); @@ -153,14 +157,17 @@ export default function ({ getService }: FtrProviderContext) { }); describe('Tls Overview Test', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/packetbeat/tls')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/tls')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/packetbeat/tls') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/packetbeat/tls') + ); it('Ensure data is returned for FlowTarget.Source', async () => { - const { body: tls } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const tls = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkQueries.tls, timerange: { interval: '12h', @@ -179,18 +186,18 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); + expect(tls.pageInfo).to.eql(expectedOverviewSourceResult.pageInfo); expect(tls.edges[0]).to.eql(expectedOverviewSourceResult.edges[0]); }); it('Ensure data is returned for FlowTarget.Destination', async () => { - const { body: tls } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const tls = await bsearch.send({ + supertest, + options: { factoryQueryType: NetworkQueries.tls, timerange: { interval: '12h', @@ -209,9 +216,10 @@ export default function ({ getService }: FtrProviderContext) { defaultIndex: ['packetbeat-*'], docValueFields: [], inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + }, + strategy: 'securitySolutionSearchStrategy', + }); + expect(tls.pageInfo).to.eql(expectedOverviewDestinationResult.pageInfo); expect(tls.edges[0]).to.eql(expectedOverviewDestinationResult.edges[0]); }); diff --git a/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts b/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts index d39cc0afb6461..a6749b27030e1 100644 --- a/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts +++ b/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts @@ -13,10 +13,6 @@ import { } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; -interface UncommonProcessesResponse { - body: HostsUncommonProcessesStrategyResponse; -} - const FROM = '2000-01-01T00:00:00.000Z'; const TO = '3000-01-01T00:00:00.000Z'; @@ -24,24 +20,51 @@ const TO = '3000-01-01T00:00:00.000Z'; const TOTAL_COUNT = 3; export default function ({ getService }: FtrProviderContext) { - const retry = getService('retry'); const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); describe('uncommon_processes', () => { - before(() => - esArchiver.load('x-pack/test/functional/es_archives/auditbeat/uncommon_processes') + before( + async () => + await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/uncommon_processes') ); - after(() => - esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/uncommon_processes') + after( + async () => + await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/uncommon_processes') ); it('should return an edge of length 1 when given a pagination of length 1', async () => { - await retry.try(async () => { - const response = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ + const response = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsQueries.uncommonProcesses, + sourceId: 'default', + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, + }, + defaultIndex: ['auditbeat-uncommon-processes'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', + }); + expect(response.edges.length).to.be(1); + }); + + describe('when given a pagination of length 2', () => { + it('should return an edge of length 2 ', async () => { + const response = await bsearch.send({ + supertest, + options: { factoryQueryType: HostsQueries.uncommonProcesses, sourceId: 'default', timerange: { @@ -53,84 +76,51 @@ export default function ({ getService }: FtrProviderContext) { activePage: 0, cursorStart: 0, fakePossibleCount: 3, - querySize: 1, + querySize: 2, }, defaultIndex: ['auditbeat-uncommon-processes'], docValueFields: [], inspect: false, - }) - .expect(200); - expect(response!.body.edges.length).to.be(1); - }); - }); - - describe('when given a pagination of length 2', () => { - it('should return an edge of length 2 ', async () => { - await retry.try(async () => { - const response = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsQueries.uncommonProcesses, - sourceId: 'default', - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - pagination: { - activePage: 0, - cursorStart: 0, - fakePossibleCount: 3, - querySize: 2, - }, - defaultIndex: ['auditbeat-uncommon-processes'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(response!.body.edges.length).to.be(2); + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(response.edges.length).to.be(2); }); }); describe('when given a pagination of length 1', () => { - let response: null | UncommonProcessesResponse = null; + let response: HostsUncommonProcessesStrategyResponse | null = null; before(async () => { - await retry.try(async () => { - response = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: HostsQueries.uncommonProcesses, - sourceId: 'default', - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - pagination: { - activePage: 0, - cursorStart: 0, - fakePossibleCount: 3, - querySize: 1, - }, - defaultIndex: ['auditbeat-uncommon-processes'], - docValueFields: [], - inspect: false, - wait_for_completion_timeout: '10s', - }) - .expect(200); + response = await bsearch.send({ + supertest, + options: { + factoryQueryType: HostsQueries.uncommonProcesses, + sourceId: 'default', + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 3, + querySize: 1, + }, + defaultIndex: ['auditbeat-uncommon-processes'], + docValueFields: [], + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); }); it('should return an edge of length 1 ', () => { - expect(response!.body.edges.length).to.be(1); + expect(response?.edges.length).to.be(1); }); it('should return a total count of elements', () => { - expect(response!.body.totalCount).to.be(TOTAL_COUNT); + expect(response?.totalCount).to.be(TOTAL_COUNT); }); it('should return a single data set with pagination of 1', () => { @@ -152,7 +142,7 @@ export default function ({ getService }: FtrProviderContext) { }, ], }; - expect(response!.body.edges[0].node).to.eql(expected); + expect(response?.edges[0].node).to.eql(expected); }); }); }); diff --git a/x-pack/test/api_integration/apis/security_solution/users.ts b/x-pack/test/api_integration/apis/security_solution/users.ts index 84335cc2695ce..d592c99bf006f 100644 --- a/x-pack/test/api_integration/apis/security_solution/users.ts +++ b/x-pack/test/api_integration/apis/security_solution/users.ts @@ -11,6 +11,7 @@ import { Direction, NetworkUsersFields, FlowTarget, + NetworkUsersStrategyResponse, } from '../../../../plugins/security_solution/common/search_strategy'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -20,53 +21,52 @@ const TO = '3000-01-01T00:00:00.000Z'; const IP = '0.0.0.0'; export default function ({ getService }: FtrProviderContext) { - const retry = getService('retry'); const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); + const bsearch = getService('bsearch'); + describe('Users', () => { describe('With auditbeat', () => { - before(() => esArchiver.load('x-pack/test/functional/es_archives/auditbeat/users')); - after(() => esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/users')); + before( + async () => await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/users') + ); + after( + async () => await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/users') + ); it('Ensure data is returned from auditbeat', async () => { - await retry.try(async () => { - const { body: users } = await supertest - .post('/internal/search/securitySolutionSearchStrategy/') - .set('kbn-xsrf', 'true') - .send({ - factoryQueryType: NetworkQueries.users, - sourceId: 'default', - timerange: { - interval: '12h', - to: TO, - from: FROM, - }, - defaultIndex: ['auditbeat-users'], - docValueFields: [], - ip: IP, - flowTarget: FlowTarget.destination, - sort: { field: NetworkUsersFields.name, direction: Direction.asc }, - pagination: { - activePage: 0, - cursorStart: 0, - fakePossibleCount: 30, - querySize: 10, - }, - inspect: false, - /* We need a very long timeout to avoid returning just partial data. - ** https://github.com/elastic/kibana/blob/master/x-pack/test/api_integration/apis/search/search.ts#L18 - */ - wait_for_completion_timeout: '10s', - }) - .expect(200); - expect(users.edges.length).to.be(1); - expect(users.totalCount).to.be(1); - expect(users.edges[0].node.user!.id).to.eql(['0']); - expect(users.edges[0].node.user!.name).to.be('root'); - expect(users.edges[0].node.user!.groupId).to.eql(['0']); - expect(users.edges[0].node.user!.groupName).to.eql(['root']); - expect(users.edges[0].node.user!.count).to.be(1); + const users = await bsearch.send({ + supertest, + options: { + factoryQueryType: NetworkQueries.users, + sourceId: 'default', + timerange: { + interval: '12h', + to: TO, + from: FROM, + }, + defaultIndex: ['auditbeat-users'], + docValueFields: [], + ip: IP, + flowTarget: FlowTarget.destination, + sort: { field: NetworkUsersFields.name, direction: Direction.asc }, + pagination: { + activePage: 0, + cursorStart: 0, + fakePossibleCount: 30, + querySize: 10, + }, + inspect: false, + }, + strategy: 'securitySolutionSearchStrategy', }); + expect(users.edges.length).to.be(1); + expect(users.totalCount).to.be(1); + expect(users.edges[0].node.user?.id).to.eql(['0']); + expect(users.edges[0].node.user?.name).to.be('root'); + expect(users.edges[0].node.user?.groupId).to.eql(['0']); + expect(users.edges[0].node.user?.groupName).to.eql(['root']); + expect(users.edges[0].node.user?.count).to.be(1); }); }); }); diff --git a/x-pack/test/apm_api_integration/common/config.ts b/x-pack/test/apm_api_integration/common/config.ts index 574cfe811bc67..978f3f0d68673 100644 --- a/x-pack/test/apm_api_integration/common/config.ts +++ b/x-pack/test/apm_api_integration/common/config.ts @@ -15,7 +15,7 @@ import { createApmUser, APM_TEST_PASSWORD, ApmUser } from './authentication'; import { APMFtrConfigName } from '../configs'; import { createApmApiClient } from './apm_api_supertest'; import { registry } from './registry'; -import { traceData } from './trace_data'; +import { synthtraceEsClient } from './synthtrace_es_client'; interface Config { name: APMFtrConfigName; @@ -77,7 +77,7 @@ export function createTestConfig(config: Config) { servers, services: { ...services, - traceData, + synthtraceEsClient, apmApiClient: async (context: InheritedFtrProviderContext) => { const security = context.getService('security'); await security.init(); diff --git a/x-pack/test/apm_api_integration/common/fixtures/es_archiver/apm_8.0.0_empty/mappings.json b/x-pack/test/apm_api_integration/common/fixtures/es_archiver/apm_mappings_only_8.0.0/mappings.json similarity index 100% rename from x-pack/test/apm_api_integration/common/fixtures/es_archiver/apm_8.0.0_empty/mappings.json rename to x-pack/test/apm_api_integration/common/fixtures/es_archiver/apm_mappings_only_8.0.0/mappings.json diff --git a/x-pack/test/apm_api_integration/common/registry.ts b/x-pack/test/apm_api_integration/common/registry.ts index 78c5bcb383c93..55b5863e6d444 100644 --- a/x-pack/test/apm_api_integration/common/registry.ts +++ b/x-pack/test/apm_api_integration/common/registry.ts @@ -15,7 +15,7 @@ import { FtrProviderContext } from './ftr_provider_context'; type ArchiveName = | 'apm_8.0.0' - | 'apm_8.0.0_empty' + | 'apm_mappings_only_8.0.0' | '8.0.0' | 'metrics_8.0.0' | 'ml_8.0.0' diff --git a/x-pack/test/apm_api_integration/common/trace_data.ts b/x-pack/test/apm_api_integration/common/synthtrace_es_client.ts similarity index 76% rename from x-pack/test/apm_api_integration/common/trace_data.ts rename to x-pack/test/apm_api_integration/common/synthtrace_es_client.ts index 84bbb4beea4f4..6e313f3be912e 100644 --- a/x-pack/test/apm_api_integration/common/trace_data.ts +++ b/x-pack/test/apm_api_integration/common/synthtrace_es_client.ts @@ -10,25 +10,31 @@ import { getSpanDestinationMetrics, getTransactionMetrics, toElasticsearchOutput, -} from '@elastic/apm-generator'; +} from '@elastic/apm-synthtrace'; import { chunk } from 'lodash'; import pLimit from 'p-limit'; import { inspect } from 'util'; +import { PromiseReturnType } from '../../../plugins/observability/typings/common'; import { InheritedFtrProviderContext } from './ftr_provider_context'; -export async function traceData(context: InheritedFtrProviderContext) { +export async function synthtraceEsClient(context: InheritedFtrProviderContext) { const es = context.getService('es'); return { index: (events: any[]) => { - const esEvents = toElasticsearchOutput( - [ + const esEvents = toElasticsearchOutput({ + events: [ ...events, ...getTransactionMetrics(events), ...getSpanDestinationMetrics(events), ...getBreakdownMetrics(events), ], - '7.14.0' - ); + writeTargets: { + transaction: 'apm-7.14.0-transaction', + span: 'apm-7.14.0-span', + error: 'apm-7.14.0-error', + metric: 'apm-7.14.0-metric', + }, + }); const batches = chunk(esEvents, 1000); const limiter = pLimit(1); @@ -69,3 +75,5 @@ export async function traceData(context: InheritedFtrProviderContext) { }, }; } + +export type SynthtraceEsClient = PromiseReturnType; diff --git a/x-pack/test/apm_api_integration/tests/dependencies/generate_data.ts b/x-pack/test/apm_api_integration/tests/dependencies/generate_data.ts new file mode 100644 index 0000000000000..7e369f5db4b06 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/dependencies/generate_data.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { service, timerange } from '@elastic/apm-synthtrace'; +import type { SynthtraceEsClient } from '../../common/synthtrace_es_client'; + +export const dataConfig = { + spanType: 'db', +}; + +export async function generateData({ + synthtraceEsClient, + backendName, + start, + end, +}: { + synthtraceEsClient: SynthtraceEsClient; + backendName: string; + start: number; + end: number; +}) { + const instance = service('synth-go', 'production', 'go').instance('instance-a'); + const transactionName = 'GET /api/product/list'; + const spanName = 'GET apm-*/_search'; + + await synthtraceEsClient.index( + timerange(start, end) + .interval('1m') + .rate(10) + .flatMap((timestamp) => + instance + .transaction(transactionName) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span(spanName, dataConfig.spanType, backendName) + .duration(1000) + .success() + .destination(backendName) + .timestamp(timestamp) + ) + .serialize() + ) + ); +} diff --git a/x-pack/test/apm_api_integration/tests/dependencies/metadata.ts b/x-pack/test/apm_api_integration/tests/dependencies/metadata.ts new file mode 100644 index 0000000000000..bad737fd51b53 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/dependencies/metadata.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { registry } from '../../common/registry'; +import { dataConfig, generateData } from './generate_data'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const apmApiClient = getService('apmApiClient'); + const synthtraceEsClient = getService('synthtraceEsClient'); + + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; + const backendName = 'elasticsearch'; + + async function callApi() { + return await apmApiClient.readUser({ + endpoint: `GET /internal/apm/backends/metadata`, + params: { + query: { + backendName, + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + }, + }, + }); + } + + registry.when( + 'Dependency metadata when data is not loaded', + { config: 'basic', archives: [] }, + () => { + it('handles empty state', async () => { + const { status, body } = await callApi(); + + expect(status).to.be(200); + expect(body.metadata).to.empty(); + }); + } + ); + + registry.when( + 'Dependency metadata when data is loaded', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + it('returns correct metadata for the dependency', async () => { + await generateData({ synthtraceEsClient, backendName, start, end }); + const { status, body } = await callApi(); + + expect(status).to.be(200); + expect(body.metadata.spanType).to.equal(dataConfig.spanType); + expect(body.metadata.spanSubtype).to.equal(backendName); + }); + } + ); +} diff --git a/x-pack/test/apm_api_integration/tests/error_rate/service_apis.ts b/x-pack/test/apm_api_integration/tests/error_rate/service_apis.ts index 75ea10ed4d9d4..f0f917e865fa9 100644 --- a/x-pack/test/apm_api_integration/tests/error_rate/service_apis.ts +++ b/x-pack/test/apm_api_integration/tests/error_rate/service_apis.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { mean, meanBy, sumBy } from 'lodash'; import { LatencyAggregationType } from '../../../../plugins/apm/common/latency_aggregation_types'; @@ -15,7 +15,7 @@ import { registry } from '../../common/registry'; export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -114,7 +114,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let errorRateMetricValues: PromiseReturnType; let errorTransactionValues: PromiseReturnType; - registry.when('Services APIs', { config: 'basic', archives: ['apm_8.0.0_empty'] }, () => { + registry.when('Services APIs', { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, () => { describe('when data is loaded ', () => { const GO_PROD_LIST_RATE = 75; const GO_PROD_LIST_ERROR_RATE = 25; @@ -128,7 +128,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const transactionNameProductList = 'GET /api/product/list'; const transactionNameProductId = 'GET /api/product/:id'; - await traceData.index([ + await synthtraceEsClient.index([ ...timerange(start, end) .interval('1m') .rate(GO_PROD_LIST_RATE) @@ -176,7 +176,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]); }); - after(() => traceData.clean()); + after(() => synthtraceEsClient.clean()); describe('compare error rate value between service inventory, error rate chart, service inventory and transactions apis', () => { before(async () => { diff --git a/x-pack/test/apm_api_integration/tests/errors/distribution.ts b/x-pack/test/apm_api_integration/tests/errors/distribution.ts new file mode 100644 index 0000000000000..4f4b457de86bd --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/errors/distribution.ts @@ -0,0 +1,204 @@ +/* + * Copyright 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 { service, timerange } from '@elastic/apm-synthtrace'; +import expect from '@kbn/expect'; +import { first, last, sumBy } from 'lodash'; +import { isFiniteNumber } from '../../../../plugins/apm/common/utils/is_finite_number'; +import { + APIClientRequestParamsOf, + APIReturnType, +} from '../../../../plugins/apm/public/services/rest/createCallApmApi'; +import { RecursivePartial } from '../../../../plugins/apm/typings/common'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { registry } from '../../common/registry'; + +type ErrorsDistribution = + APIReturnType<'GET /internal/apm/services/{serviceName}/errors/distribution'>; + +export default function ApiTest({ getService }: FtrProviderContext) { + const apmApiClient = getService('apmApiClient'); + const synthtraceEsClient = getService('synthtraceEsClient'); + + const serviceName = 'synth-go'; + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; + + async function callApi( + overrides?: RecursivePartial< + APIClientRequestParamsOf<'GET /internal/apm/services/{serviceName}/errors/distribution'>['params'] + > + ) { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/services/{serviceName}/errors/distribution', + params: { + path: { + serviceName, + ...overrides?.path, + }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + environment: 'ENVIRONMENT_ALL', + kuery: '', + ...overrides?.query, + }, + }, + }); + return response; + } + + registry.when('when data is not loaded', { config: 'basic', archives: [] }, () => { + it('handles the empty state', async () => { + const response = await callApi(); + expect(response.status).to.be(200); + expect(response.body.currentPeriod.length).to.be(0); + expect(response.body.previousPeriod.length).to.be(0); + }); + }); + + registry.when( + 'when data is loaded', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + describe('errors distribution', () => { + const appleTransaction = { + name: 'GET /apple 🍎 ', + successRate: 75, + failureRate: 25, + }; + const bananaTransaction = { + name: 'GET /banana 🍌', + successRate: 50, + failureRate: 50, + }; + + before(async () => { + const serviceGoProdInstance = service(serviceName, 'production', 'go').instance( + 'instance-a' + ); + + const interval = '1m'; + + const indices = [appleTransaction, bananaTransaction] + .map((transaction, index) => { + return [ + ...timerange(start, end) + .interval(interval) + .rate(transaction.successRate) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transaction.name) + .timestamp(timestamp) + .duration(1000) + .success() + .serialize() + ), + ...timerange(start, end) + .interval(interval) + .rate(transaction.failureRate) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transaction.name) + .errors( + serviceGoProdInstance + .error(`Error ${index}`, transaction.name) + .timestamp(timestamp) + ) + .duration(1000) + .timestamp(timestamp) + .failure() + .serialize() + ), + ]; + }) + .flatMap((_) => _); + + await synthtraceEsClient.index(indices); + }); + + after(() => synthtraceEsClient.clean()); + + describe('without comparison', () => { + let errorsDistribution: ErrorsDistribution; + before(async () => { + const response = await callApi(); + errorsDistribution = response.body; + }); + + it('displays combined number of occurrences', () => { + const countSum = sumBy(errorsDistribution.currentPeriod, 'y'); + const numberOfBuckets = 15; + expect(countSum).to.equal( + (appleTransaction.failureRate + bananaTransaction.failureRate) * numberOfBuckets + ); + }); + }); + + describe('displays occurrences for type "apple transaction" only', () => { + let errorsDistribution: ErrorsDistribution; + before(async () => { + const response = await callApi({ + query: { kuery: `error.exception.type:"${appleTransaction.name}"` }, + }); + errorsDistribution = response.body; + }); + it('displays combined number of occurrences', () => { + const countSum = sumBy(errorsDistribution.currentPeriod, 'y'); + const numberOfBuckets = 15; + expect(countSum).to.equal(appleTransaction.failureRate * numberOfBuckets); + }); + }); + + describe('with comparison', () => { + let errorsDistribution: ErrorsDistribution; + before(async () => { + const fiveMinutes = 5 * 60 * 1000; + const response = await callApi({ + query: { + start: new Date(end - fiveMinutes).toISOString(), + end: new Date(end).toISOString(), + comparisonStart: new Date(start).toISOString(), + comparisonEnd: new Date(start + fiveMinutes).toISOString(), + }, + }); + errorsDistribution = response.body; + }); + it('returns some data', () => { + const hasCurrentPeriodData = errorsDistribution.currentPeriod.some(({ y }) => + isFiniteNumber(y) + ); + + const hasPreviousPeriodData = errorsDistribution.previousPeriod.some(({ y }) => + isFiniteNumber(y) + ); + + expect(hasCurrentPeriodData).to.equal(true); + expect(hasPreviousPeriodData).to.equal(true); + }); + + it('has same start time for both periods', () => { + expect(first(errorsDistribution.currentPeriod)?.x).to.equal( + first(errorsDistribution.previousPeriod)?.x + ); + }); + + it('has same end time for both periods', () => { + expect(last(errorsDistribution.currentPeriod)?.x).to.equal( + last(errorsDistribution.previousPeriod)?.x + ); + }); + + it('returns same number of buckets for both periods', () => { + expect(errorsDistribution.currentPeriod.length).to.equal( + errorsDistribution.previousPeriod.length + ); + }); + }); + }); + } + ); +} diff --git a/x-pack/test/apm_api_integration/tests/metadata/event_metadata.ts b/x-pack/test/apm_api_integration/tests/event_metadata/event_metadata.ts similarity index 95% rename from x-pack/test/apm_api_integration/tests/metadata/event_metadata.ts rename to x-pack/test/apm_api_integration/tests/event_metadata/event_metadata.ts index d979f0bad1ec6..78f7ca1337166 100644 --- a/x-pack/test/apm_api_integration/tests/metadata/event_metadata.ts +++ b/x-pack/test/apm_api_integration/tests/event_metadata/event_metadata.ts @@ -36,7 +36,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { } registry.when('Event metadata', { config: 'basic', archives: ['apm_8.0.0'] }, () => { - it('fetches transaction metadata', async () => { + it('fetches transaction event metadata', async () => { const id = await getLastDocId(ProcessorEvent.transaction); const { body } = await apmApiClient.readUser({ @@ -66,7 +66,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); }); - it('fetches error metadata', async () => { + it('fetches error event metadata', async () => { const id = await getLastDocId(ProcessorEvent.error); const { body } = await apmApiClient.readUser({ @@ -96,7 +96,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); }); - it('fetches span metadata', async () => { + it('fetches span event metadata', async () => { const id = await getLastDocId(ProcessorEvent.span); const { body } = await apmApiClient.readUser({ diff --git a/x-pack/test/apm_api_integration/tests/index.ts b/x-pack/test/apm_api_integration/tests/index.ts index f68a49658f2ee..46998efbed81b 100644 --- a/x-pack/test/apm_api_integration/tests/index.ts +++ b/x-pack/test/apm_api_integration/tests/index.ts @@ -37,8 +37,8 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte loadTestFile(require.resolve('./correlations/latency')); }); - describe('metadata/event_metadata', function () { - loadTestFile(require.resolve('./metadata/event_metadata')); + describe('event_metadata/event_metadata', function () { + loadTestFile(require.resolve('./event_metadata/event_metadata')); }); describe('metrics_charts/metrics_charts', function () { @@ -113,11 +113,11 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte }); describe('services/error_groups_main_statistics', function () { - loadTestFile(require.resolve('./services/error_groups_main_statistics')); + loadTestFile(require.resolve('./services/error_groups/error_groups_main_statistics')); }); describe('services/error_groups_detailed_statistics', function () { - loadTestFile(require.resolve('./services/error_groups_detailed_statistics')); + loadTestFile(require.resolve('./services/error_groups/error_groups_detailed_statistics')); }); describe('services/detailed_statistics', function () { @@ -241,6 +241,15 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte loadTestFile(require.resolve('./latency/service_apis')); }); + describe('errors/distribution', function () { + loadTestFile(require.resolve('./errors/distribution')); + }); + + // Dependencies + describe('dependencies/metadata', function () { + loadTestFile(require.resolve('./dependencies/metadata')); + }); + registry.run(providerContext); }); } diff --git a/x-pack/test/apm_api_integration/tests/latency/service_apis.ts b/x-pack/test/apm_api_integration/tests/latency/service_apis.ts index a09442cd73a2a..aa8282ccb0cc5 100644 --- a/x-pack/test/apm_api_integration/tests/latency/service_apis.ts +++ b/x-pack/test/apm_api_integration/tests/latency/service_apis.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { meanBy, sumBy } from 'lodash'; import { LatencyAggregationType } from '../../../../plugins/apm/common/latency_aggregation_types'; @@ -15,7 +15,7 @@ import { registry } from '../../common/registry'; export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -116,7 +116,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let latencyMetricValues: PromiseReturnType; let latencyTransactionValues: PromiseReturnType; - registry.when('Services APIs', { config: 'basic', archives: ['apm_8.0.0_empty'] }, () => { + registry.when('Services APIs', { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, () => { describe('when data is loaded ', () => { const GO_PROD_RATE = 80; const GO_DEV_RATE = 20; @@ -129,7 +129,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const serviceGoDevInstance = service(serviceName, 'development', 'go').instance( 'instance-b' ); - await traceData.index([ + await synthtraceEsClient.index([ ...timerange(start, end) .interval('1m') .rate(GO_PROD_RATE) @@ -153,7 +153,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]); }); - after(() => traceData.clean()); + after(() => synthtraceEsClient.clean()); describe('compare latency value between service inventory, latency chart, service inventory and transactions apis', () => { before(async () => { diff --git a/x-pack/test/apm_api_integration/tests/observability_overview/observability_overview.ts b/x-pack/test/apm_api_integration/tests/observability_overview/observability_overview.ts index 458372196452a..9082c5dec3b79 100644 --- a/x-pack/test/apm_api_integration/tests/observability_overview/observability_overview.ts +++ b/x-pack/test/apm_api_integration/tests/observability_overview/observability_overview.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { meanBy, sumBy } from 'lodash'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -15,7 +15,7 @@ import { roundNumber } from '../../utils'; export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const start = new Date('2021-01-01T00:00:00.000Z').getTime(); const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; @@ -83,89 +83,95 @@ export default function ApiTest({ getService }: FtrProviderContext) { } ); - registry.when('data is loaded', { config: 'basic', archives: ['apm_8.0.0_empty'] }, () => { - describe('Observability overview api ', () => { - const GO_PROD_RATE = 50; - const GO_DEV_RATE = 5; - const JAVA_PROD_RATE = 45; - before(async () => { - const serviceGoProdInstance = service('synth-go', 'production', 'go').instance( - 'instance-a' - ); - const serviceGoDevInstance = service('synth-go', 'development', 'go').instance( - 'instance-b' - ); - const serviceJavaInstance = service('synth-java', 'production', 'java').instance( - 'instance-c' - ); + registry.when( + 'data is loaded', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + describe('Observability overview api ', () => { + const GO_PROD_RATE = 50; + const GO_DEV_RATE = 5; + const JAVA_PROD_RATE = 45; + before(async () => { + const serviceGoProdInstance = service('synth-go', 'production', 'go').instance( + 'instance-a' + ); + const serviceGoDevInstance = service('synth-go', 'development', 'go').instance( + 'instance-b' + ); + const serviceJavaInstance = service('synth-java', 'production', 'java').instance( + 'instance-c' + ); - await traceData.index([ - ...timerange(start, end) - .interval('1m') - .rate(GO_PROD_RATE) - .flatMap((timestamp) => - serviceGoProdInstance - .transaction('GET /api/product/list') - .duration(1000) - .timestamp(timestamp) - .serialize() - ), - ...timerange(start, end) - .interval('1m') - .rate(GO_DEV_RATE) - .flatMap((timestamp) => - serviceGoDevInstance - .transaction('GET /api/product/:id') - .duration(1000) - .timestamp(timestamp) - .serialize() - ), - ...timerange(start, end) - .interval('1m') - .rate(JAVA_PROD_RATE) - .flatMap((timestamp) => - serviceJavaInstance - .transaction('POST /api/product/buy') - .duration(1000) - .timestamp(timestamp) - .serialize() - ), - ]); - }); + await synthtraceEsClient.index([ + ...timerange(start, end) + .interval('1m') + .rate(GO_PROD_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction('GET /api/product/list') + .duration(1000) + .timestamp(timestamp) + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(GO_DEV_RATE) + .flatMap((timestamp) => + serviceGoDevInstance + .transaction('GET /api/product/:id') + .duration(1000) + .timestamp(timestamp) + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(JAVA_PROD_RATE) + .flatMap((timestamp) => + serviceJavaInstance + .transaction('POST /api/product/buy') + .duration(1000) + .timestamp(timestamp) + .serialize() + ), + ]); + }); - after(() => traceData.clean()); + after(() => synthtraceEsClient.clean()); - describe('compare throughput values', () => { - let throughputValues: PromiseReturnType; - before(async () => { - throughputValues = await getThroughputValues(); - }); + describe('compare throughput values', () => { + let throughputValues: PromiseReturnType; + before(async () => { + throughputValues = await getThroughputValues(); + }); - it('returns same number of service as shown on service inventory API', () => { - const { serviceInventoryCount, observabilityOverview } = throughputValues; - [serviceInventoryCount, observabilityOverview.serviceCount].forEach((value) => - expect(value).to.be.equal(2) - ); - }); + it('returns same number of service as shown on service inventory API', () => { + const { serviceInventoryCount, observabilityOverview } = throughputValues; + [serviceInventoryCount, observabilityOverview.serviceCount].forEach((value) => + expect(value).to.be.equal(2) + ); + }); - it('returns same throughput value on service inventory and obs throughput count', () => { - const { serviceInventoryThroughputSum, observabilityOverview } = throughputValues; - const obsThroughputCount = roundNumber(observabilityOverview.transactionPerMinute.value); - [serviceInventoryThroughputSum, obsThroughputCount].forEach((value) => - expect(value).to.be.equal(roundNumber(GO_PROD_RATE + GO_DEV_RATE + JAVA_PROD_RATE)) - ); - }); + it('returns same throughput value on service inventory and obs throughput count', () => { + const { serviceInventoryThroughputSum, observabilityOverview } = throughputValues; + const obsThroughputCount = roundNumber( + observabilityOverview.transactionPerMinute.value + ); + [serviceInventoryThroughputSum, obsThroughputCount].forEach((value) => + expect(value).to.be.equal(roundNumber(GO_PROD_RATE + GO_DEV_RATE + JAVA_PROD_RATE)) + ); + }); - it('returns same throughput value on service inventory and obs mean throughput timeseries', () => { - const { serviceInventoryThroughputSum, observabilityOverview } = throughputValues; - const obsThroughputMean = roundNumber( - meanBy(observabilityOverview.transactionPerMinute.timeseries, 'y') - ); - [serviceInventoryThroughputSum, obsThroughputMean].forEach((value) => - expect(value).to.be.equal(roundNumber(GO_PROD_RATE + GO_DEV_RATE + JAVA_PROD_RATE)) - ); + it('returns same throughput value on service inventory and obs mean throughput timeseries', () => { + const { serviceInventoryThroughputSum, observabilityOverview } = throughputValues; + const obsThroughputMean = roundNumber( + meanBy(observabilityOverview.transactionPerMinute.timeseries, 'y') + ); + [serviceInventoryThroughputSum, obsThroughputMean].forEach((value) => + expect(value).to.be.equal(roundNumber(GO_PROD_RATE + GO_DEV_RATE + JAVA_PROD_RATE)) + ); + }); }); }); - }); - }); + } + ); } diff --git a/x-pack/test/apm_api_integration/tests/service_maps/__snapshots__/service_maps.snap b/x-pack/test/apm_api_integration/tests/service_maps/__snapshots__/service_maps.snap deleted file mode 100644 index 9e32f311e8d11..0000000000000 --- a/x-pack/test/apm_api_integration/tests/service_maps/__snapshots__/service_maps.snap +++ /dev/null @@ -1,2755 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`APM API tests trial apm_8.0.0 Service Map with data /internal/apm/service-map returns the correct data 3`] = ` -Array [ - Object { - "data": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - }, - Object { - "data": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - Object { - "data": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">elasticsearch", - "label": "elasticsearch", - "span.destination.service.resource": "elasticsearch", - "span.subtype": "elasticsearch", - "span.type": "db", - }, - }, - Object { - "data": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">sqlite", - "label": "sqlite", - "span.destination.service.resource": "sqlite", - "span.subtype": "sqlite", - "span.type": "db", - }, - }, - Object { - "data": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">redis", - "label": "redis", - "span.destination.service.resource": "redis", - "span.subtype": "redis", - "span.type": "cache", - }, - }, - Object { - "data": Object { - "agent.name": "go", - "id": "auditbeat", - "service.environment": null, - "service.name": "auditbeat", - }, - }, - Object { - "data": Object { - "id": "opbeans-dotnet~>sqlite", - "source": "opbeans-dotnet", - "sourceData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - "target": ">sqlite", - "targetData": Object { - "id": ">sqlite", - "label": "sqlite", - "span.destination.service.resource": "sqlite", - "span.subtype": "sqlite", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-go~>postgresql", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-go~opbeans-dotnet", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-java", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-node", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-python", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-python", - "targetData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-ruby", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-java~>postgresql", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-java~opbeans-dotnet", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-java~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-java~opbeans-node", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-java~opbeans-ruby", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~>postgresql", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~>redis", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": ">redis", - "targetData": Object { - "id": ">redis", - "label": "redis", - "span.destination.service.resource": "redis", - "span.subtype": "redis", - "span.type": "cache", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~opbeans-java", - "isInverseEdge": true, - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-node~opbeans-python", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-python", - "targetData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-node~opbeans-ruby", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~>elasticsearch", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": ">elasticsearch", - "targetData": Object { - "id": ">elasticsearch", - "label": "elasticsearch", - "span.destination.service.resource": "elasticsearch", - "span.subtype": "elasticsearch", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~>postgresql", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~>redis", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": ">redis", - "targetData": Object { - "id": ">redis", - "label": "redis", - "span.destination.service.resource": "redis", - "span.subtype": "redis", - "span.type": "cache", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~opbeans-java", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~opbeans-node", - "isInverseEdge": true, - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-python~opbeans-ruby", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~>postgresql", - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-dotnet", - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-java", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-node", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-python", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-python", - "targetData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-dotnet", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-go", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-java", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-node", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-ruby", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, -] -`; - -exports[`APM API tests trial apm_8.0.0 Service Map with data /internal/apm/service-map with ML data with the default apm user returns the correct anomaly stats 3`] = ` -Object { - "elements": Array [ - Object { - "data": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - }, - Object { - "data": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - Object { - "data": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">elasticsearch", - "label": "elasticsearch", - "span.destination.service.resource": "elasticsearch", - "span.subtype": "elasticsearch", - "span.type": "db", - }, - }, - Object { - "data": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">sqlite", - "label": "sqlite", - "span.destination.service.resource": "sqlite", - "span.subtype": "sqlite", - "span.type": "db", - }, - }, - Object { - "data": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "id": ">redis", - "label": "redis", - "span.destination.service.resource": "redis", - "span.subtype": "redis", - "span.type": "cache", - }, - }, - Object { - "data": Object { - "agent.name": "go", - "id": "auditbeat", - "service.environment": null, - "service.name": "auditbeat", - }, - }, - Object { - "data": Object { - "id": "opbeans-dotnet~>sqlite", - "source": "opbeans-dotnet", - "sourceData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - "target": ">sqlite", - "targetData": Object { - "id": ">sqlite", - "label": "sqlite", - "span.destination.service.resource": "sqlite", - "span.subtype": "sqlite", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-go~>postgresql", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-go~opbeans-dotnet", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-java", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-node", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-python", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-python", - "targetData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-go~opbeans-ruby", - "source": "opbeans-go", - "sourceData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-java~>postgresql", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-java~opbeans-dotnet", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-java~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-java~opbeans-node", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-java~opbeans-ruby", - "source": "opbeans-java", - "sourceData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~>postgresql", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~>redis", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": ">redis", - "targetData": Object { - "id": ">redis", - "label": "redis", - "span.destination.service.resource": "redis", - "span.subtype": "redis", - "span.type": "cache", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-node~opbeans-java", - "isInverseEdge": true, - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-node~opbeans-python", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-python", - "targetData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-node~opbeans-ruby", - "source": "opbeans-node", - "sourceData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~>elasticsearch", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": ">elasticsearch", - "targetData": Object { - "id": ">elasticsearch", - "label": "elasticsearch", - "span.destination.service.resource": "elasticsearch", - "span.subtype": "elasticsearch", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~>postgresql", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~>redis", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": ">redis", - "targetData": Object { - "id": ">redis", - "label": "redis", - "span.destination.service.resource": "redis", - "span.subtype": "redis", - "span.type": "cache", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~opbeans-java", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-python~opbeans-node", - "isInverseEdge": true, - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "bidirectional": true, - "id": "opbeans-python~opbeans-ruby", - "source": "opbeans-python", - "sourceData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~>postgresql", - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": ">postgresql", - "targetData": Object { - "id": ">postgresql", - "label": "postgresql", - "span.destination.service.resource": "postgresql", - "span.subtype": "postgresql", - "span.type": "db", - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-dotnet", - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-go", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-java", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-node", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-ruby~opbeans-python", - "isInverseEdge": true, - "source": "opbeans-ruby", - "sourceData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - "target": "opbeans-python", - "targetData": Object { - "agent.name": "python", - "id": "opbeans-python", - "service.environment": "production", - "service.name": "opbeans-python", - "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-dotnet", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-dotnet", - "targetData": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-go", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-go", - "targetData": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-java", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-java", - "targetData": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-node", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-node", - "targetData": Object { - "agent.name": "nodejs", - "id": "opbeans-node", - "service.environment": "testing", - "service.name": "opbeans-node", - "serviceAnomalyStats": Object { - "actualValue": 24819.2962962963, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-node", - "transactionType": "request", - }, - }, - }, - }, - Object { - "data": Object { - "id": "opbeans-rum~opbeans-ruby", - "source": "opbeans-rum", - "sourceData": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", - "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", - }, - }, - "target": "opbeans-ruby", - "targetData": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", - "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", - "transactionType": "request", - }, - }, - }, - }, - ], -} -`; diff --git a/x-pack/test/apm_api_integration/tests/service_maps/service_maps.ts b/x-pack/test/apm_api_integration/tests/service_maps/service_maps.ts index ab1be97e0fd8a..2da57c0a25779 100644 --- a/x-pack/test/apm_api_integration/tests/service_maps/service_maps.ts +++ b/x-pack/test/apm_api_integration/tests/service_maps/service_maps.ts @@ -8,7 +8,7 @@ import querystring from 'querystring'; import url from 'url'; import expect from '@kbn/expect'; -import { isEmpty, uniq } from 'lodash'; +import { isEmpty, orderBy, uniq } from 'lodash'; import archives_metadata from '../../common/fixtures/es_archiver/archives_metadata'; import { PromiseReturnType } from '../../../../plugins/observability/typings/common'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -76,14 +76,15 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) }); }); - describe('/internal/apm/service-map/backend/{backendName}', () => { + describe('/internal/apm/service-map/backend', () => { it('returns an object with nulls', async () => { const q = querystring.stringify({ + backendName: 'postgres', start: metadata.start, end: metadata.end, environment: 'ENVIRONMENT_ALL', }); - const response = await supertest.get(`/internal/apm/service-map/backend/postgres?${q}`); + const response = await supertest.get(`/internal/apm/service-map/backend?${q}`); expect(response.status).to.be(200); @@ -151,8 +152,6 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) ">sqlite", ] `); - - expectSnapshot(elements).toMatch(); }); describe('with ML data', () => { @@ -186,60 +185,58 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) expect(dataWithAnomalies).not.to.be.empty(); expectSnapshot(dataWithAnomalies.length).toMatchInline(`7`); - expectSnapshot(dataWithAnomalies.slice(0, 3)).toMatchInline(` + expectSnapshot(orderBy(dataWithAnomalies, 'data.id').slice(0, 3)).toMatchInline(` Array [ Object { "data": Object { - "agent.name": "rum-js", - "id": "opbeans-rum", - "service.environment": "testing", - "service.name": "opbeans-rum", + "agent.name": "dotnet", + "id": "opbeans-dotnet", + "service.environment": "production", + "service.name": "opbeans-dotnet", "serviceAnomalyStats": Object { - "actualValue": 1020870.96774194, + "actualValue": 868025.86875, "anomalyScore": 0, "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-rum", - "transactionType": "page-load", + "jobId": "apm-production-6117-high_mean_transaction_duration", + "serviceName": "opbeans-dotnet", + "transactionType": "request", }, }, }, Object { "data": Object { - "agent.name": "ruby", - "id": "opbeans-ruby", - "service.environment": "production", - "service.name": "opbeans-ruby", + "agent.name": "go", + "id": "opbeans-go", + "service.environment": "testing", + "service.name": "opbeans-go", "serviceAnomalyStats": Object { - "actualValue": 62009.3356643357, + "actualValue": 102786.319148936, "anomalyScore": 0, "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-ruby", + "jobId": "apm-testing-41e5-high_mean_transaction_duration", + "serviceName": "opbeans-go", "transactionType": "request", }, }, }, Object { "data": Object { - "agent.name": "python", - "id": "opbeans-python", + "agent.name": "java", + "id": "opbeans-java", "service.environment": "production", - "service.name": "opbeans-python", + "service.name": "opbeans-java", "serviceAnomalyStats": Object { - "actualValue": 38862.7831325301, - "anomalyScore": 0.0725701910161626, + "actualValue": 175568.855769231, + "anomalyScore": 0, "healthStatus": "healthy", "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-python", + "serviceName": "opbeans-java", "transactionType": "request", }, }, }, ] `); - - expectSnapshot(response.body).toMatch(); }); }); @@ -309,14 +306,15 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) }); }); - describe('/internal/apm/service-map/backend/{backendName}', () => { + describe('/internal/apm/service-map/backend', () => { it('returns an object with data', async () => { const q = querystring.stringify({ + backendName: 'postgresql', start: metadata.start, end: metadata.end, environment: 'ENVIRONMENT_ALL', }); - const response = await supertest.get(`/internal/apm/service-map/backend/postgresql?${q}`); + const response = await supertest.get(`/internal/apm/service-map/backend?${q}`); expect(response.status).to.be(200); diff --git a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts index 5585a292d317e..7d4efa14b2d85 100644 --- a/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/service_overview/instances_main_statistics.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import { pick, sortBy } from 'lodash'; import moment from 'moment'; -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import { APIReturnType } from '../../../../plugins/apm/public/services/rest/createCallApmApi'; import { isFiniteNumber } from '../../../../plugins/apm/common/utils/is_finite_number'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -21,7 +21,7 @@ import { SERVICE_NODE_NAME_MISSING } from '../../../../plugins/apm/common/servic export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const archiveName = 'apm_8.0.0'; const { start, end } = archives[archiveName]; @@ -285,7 +285,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when( 'Service overview instances main statistics when data is generated', - { config: 'basic', archives: ['apm_8.0.0_empty'] }, + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, () => { describe('for two go instances and one java instance', () => { const GO_A_INSTANCE_RATE_SUCCESS = 10; @@ -320,7 +320,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); } - return traceData.index([ + return synthtraceEsClient.index([ ...interval.rate(GO_A_INSTANCE_RATE_SUCCESS).flatMap((timestamp) => goInstanceA .transaction('GET /api/product/list') @@ -361,7 +361,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - return traceData.clean(); + return synthtraceEsClient.clean(); }); describe('for the go service', () => { diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups/error_groups_detailed_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups/error_groups_detailed_statistics.ts new file mode 100644 index 0000000000000..54bbd4eb0bf71 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/services/error_groups/error_groups_detailed_statistics.ts @@ -0,0 +1,199 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { first, last, sumBy } from 'lodash'; +import moment from 'moment'; +import { isFiniteNumber } from '../../../../../plugins/apm/common/utils/is_finite_number'; +import { + APIClientRequestParamsOf, + APIReturnType, +} from '../../../../../plugins/apm/public/services/rest/createCallApmApi'; +import { RecursivePartial } from '../../../../../plugins/apm/typings/common'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { registry } from '../../../common/registry'; +import { config, generateData } from './generate_data'; +import { getErrorGroupIds } from './get_error_group_ids'; + +type ErrorGroupsDetailedStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/error_groups/detailed_statistics'>; + +export default function ApiTest({ getService }: FtrProviderContext) { + const apmApiClient = getService('apmApiClient'); + const synthtraceEsClient = getService('synthtraceEsClient'); + + const serviceName = 'synth-go'; + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; + + async function callApi( + overrides?: RecursivePartial< + APIClientRequestParamsOf<'GET /internal/apm/services/{serviceName}/error_groups/detailed_statistics'>['params'] + > + ) { + return await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/error_groups/detailed_statistics`, + params: { + path: { serviceName, ...overrides?.path }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + numBuckets: 20, + transactionType: 'request', + groupIds: JSON.stringify(['foo']), + environment: 'ENVIRONMENT_ALL', + kuery: '', + ...overrides?.query, + }, + }, + }); + } + + registry.when( + 'Error groups detailed statistics when data is not loaded', + { config: 'basic', archives: [] }, + () => { + it('handles empty state', async () => { + const response = await callApi(); + expect(response.status).to.be(200); + expect(response.body).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); + }); + } + ); + + registry.when( + 'Error groups detailed statistics', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + describe('when data is loaded', () => { + const { PROD_LIST_ERROR_RATE, PROD_ID_ERROR_RATE } = config; + before(async () => { + await generateData({ serviceName, start, end, synthtraceEsClient }); + }); + + after(() => synthtraceEsClient.clean()); + + describe('without data comparison', () => { + let errorGroupsDetailedStatistics: ErrorGroupsDetailedStatistics; + let errorIds: string[] = []; + before(async () => { + errorIds = await getErrorGroupIds({ serviceName, start, end, apmApiClient }); + const response = await callApi({ + query: { + groupIds: JSON.stringify(errorIds), + }, + }); + errorGroupsDetailedStatistics = response.body; + }); + + it('return detailed statistics for all errors found', () => { + expect(Object.keys(errorGroupsDetailedStatistics.currentPeriod).sort()).to.eql( + errorIds + ); + }); + + it('returns correct number of occurrencies', () => { + const numberOfBuckets = 15; + const detailedStatisticsOccurrenciesSum = Object.values( + errorGroupsDetailedStatistics.currentPeriod + ) + .sort() + .map(({ timeseries }) => { + return sumBy(timeseries, 'y'); + }); + + expect(detailedStatisticsOccurrenciesSum).to.eql([ + PROD_ID_ERROR_RATE * numberOfBuckets, + PROD_LIST_ERROR_RATE * numberOfBuckets, + ]); + }); + }); + + describe('return empty state when invalid group id', () => { + let errorGroupsDetailedStatistics: ErrorGroupsDetailedStatistics; + before(async () => { + const response = await callApi({ + query: { + groupIds: JSON.stringify(['foo']), + }, + }); + errorGroupsDetailedStatistics = response.body; + }); + + it('returns empty state', () => { + expect(errorGroupsDetailedStatistics).to.be.eql({ + currentPeriod: {}, + previousPeriod: {}, + }); + }); + }); + + describe('with comparison', () => { + let errorGroupsDetailedStatistics: ErrorGroupsDetailedStatistics; + let errorIds: string[] = []; + before(async () => { + errorIds = await getErrorGroupIds({ serviceName, start, end, apmApiClient }); + const response = await callApi({ + query: { + groupIds: JSON.stringify(errorIds), + start: moment(end).subtract(7, 'minutes').toISOString(), + end: new Date(end).toISOString(), + comparisonStart: new Date(start).toISOString(), + comparisonEnd: moment(start).add(7, 'minutes').toISOString(), + }, + }); + errorGroupsDetailedStatistics = response.body; + }); + + it('returns some data', () => { + expect( + Object.keys(errorGroupsDetailedStatistics.currentPeriod).length + ).to.be.greaterThan(0); + expect( + Object.keys(errorGroupsDetailedStatistics.previousPeriod).length + ).to.be.greaterThan(0); + + const hasCurrentPeriodData = Object.values( + errorGroupsDetailedStatistics.currentPeriod + )[0].timeseries.some(({ y }) => isFiniteNumber(y)); + + const hasPreviousPeriodData = Object.values( + errorGroupsDetailedStatistics.previousPeriod + )[0].timeseries.some(({ y }) => isFiniteNumber(y)); + + expect(hasCurrentPeriodData).to.equal(true); + expect(hasPreviousPeriodData).to.equal(true); + }); + + it('has same start time for both periods', () => { + expect( + first(Object.values(errorGroupsDetailedStatistics.currentPeriod)[0].timeseries)?.x + ).to.equal( + first(Object.values(errorGroupsDetailedStatistics.previousPeriod)[0].timeseries)?.x + ); + }); + + it('has same end time for both periods', () => { + expect( + last(Object.values(errorGroupsDetailedStatistics.currentPeriod)[0].timeseries)?.x + ).to.equal( + last(Object.values(errorGroupsDetailedStatistics.previousPeriod)[0].timeseries)?.x + ); + }); + + it('returns same number of buckets for both periods', () => { + expect( + Object.values(errorGroupsDetailedStatistics.currentPeriod)[0].timeseries.length + ).to.equal( + Object.values(errorGroupsDetailedStatistics.previousPeriod)[0].timeseries.length + ); + }); + }); + }); + } + ); +} diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups/error_groups_main_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups/error_groups_main_statistics.ts new file mode 100644 index 0000000000000..bc6bd023a0f5e --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/services/error_groups/error_groups_main_statistics.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import moment from 'moment'; +import { + APIClientRequestParamsOf, + APIReturnType, +} from '../../../../../plugins/apm/public/services/rest/createCallApmApi'; +import { RecursivePartial } from '../../../../../plugins/apm/typings/common'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; +import { registry } from '../../../common/registry'; +import { generateData, config } from './generate_data'; + +type ErrorGroupsMainStatistics = + APIReturnType<'GET /internal/apm/services/{serviceName}/error_groups/main_statistics'>; + +export default function ApiTest({ getService }: FtrProviderContext) { + const apmApiClient = getService('apmApiClient'); + const synthtraceEsClient = getService('synthtraceEsClient'); + + const serviceName = 'synth-go'; + const start = new Date('2021-01-01T00:00:00.000Z').getTime(); + const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; + + async function callApi( + overrides?: RecursivePartial< + APIClientRequestParamsOf<'GET /internal/apm/services/{serviceName}/error_groups/main_statistics'>['params'] + > + ) { + return await apmApiClient.readUser({ + endpoint: `GET /internal/apm/services/{serviceName}/error_groups/main_statistics`, + params: { + path: { serviceName, ...overrides?.path }, + query: { + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), + transactionType: 'request', + environment: 'ENVIRONMENT_ALL', + kuery: '', + ...overrides?.query, + }, + }, + }); + } + + registry.when( + 'Error groups main statistics when data is not loaded', + { config: 'basic', archives: [] }, + () => { + it('handles empty state', async () => { + const response = await callApi(); + expect(response.status).to.be(200); + expect(response.body.error_groups).to.empty(); + expect(response.body.is_aggregation_accurate).to.eql(true); + }); + } + ); + + registry.when( + 'Error groups main statistics', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + describe('when data is loaded', () => { + const { PROD_LIST_ERROR_RATE, PROD_ID_ERROR_RATE, ERROR_NAME_1, ERROR_NAME_2 } = config; + + before(async () => { + await generateData({ serviceName, start, end, synthtraceEsClient }); + }); + + after(() => synthtraceEsClient.clean()); + + describe('returns the correct data', () => { + let errorGroupMainStatistics: ErrorGroupsMainStatistics; + before(async () => { + const response = await callApi(); + errorGroupMainStatistics = response.body; + }); + + it('returns correct number of occurrencies', () => { + expect(errorGroupMainStatistics.error_groups.length).to.equal(2); + expect(errorGroupMainStatistics.error_groups.map((error) => error.name).sort()).to.eql([ + ERROR_NAME_1, + ERROR_NAME_2, + ]); + }); + + it('returns correct occurences', () => { + const numberOfBuckets = 15; + expect( + errorGroupMainStatistics.error_groups.map((error) => error.occurrences).sort() + ).to.eql([ + PROD_LIST_ERROR_RATE * numberOfBuckets, + PROD_ID_ERROR_RATE * numberOfBuckets, + ]); + }); + + it('has same last seen value as end date', () => { + errorGroupMainStatistics.error_groups.map((error) => { + expect(error.lastSeen).to.equal(moment(end).startOf('minute').valueOf()); + }); + }); + }); + }); + } + ); +} diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups/generate_data.ts b/x-pack/test/apm_api_integration/tests/services/error_groups/generate_data.ts new file mode 100644 index 0000000000000..1a9d6683244e1 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/services/error_groups/generate_data.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { service, timerange } from '@elastic/apm-synthtrace'; +import type { SynthtraceEsClient } from '../../../common/synthtrace_es_client'; + +export const config = { + PROD_LIST_RATE: 75, + PROD_LIST_ERROR_RATE: 25, + PROD_ID_RATE: 50, + PROD_ID_ERROR_RATE: 50, + ERROR_NAME_1: 'Error test 1', + ERROR_NAME_2: 'Error test 2', +}; + +export async function generateData({ + synthtraceEsClient, + serviceName, + start, + end, +}: { + synthtraceEsClient: SynthtraceEsClient; + serviceName: string; + start: number; + end: number; +}) { + const serviceGoProdInstance = service(serviceName, 'production', 'go').instance('instance-a'); + + const transactionNameProductList = 'GET /api/product/list'; + const transactionNameProductId = 'GET /api/product/:id'; + + const { + PROD_LIST_RATE, + PROD_LIST_ERROR_RATE, + PROD_ID_RATE, + PROD_ID_ERROR_RATE, + ERROR_NAME_1, + ERROR_NAME_2, + } = config; + + await synthtraceEsClient.index([ + ...timerange(start, end) + .interval('1m') + .rate(PROD_LIST_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transactionNameProductList) + .timestamp(timestamp) + .duration(1000) + .success() + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(PROD_LIST_ERROR_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transactionNameProductList) + .errors(serviceGoProdInstance.error(ERROR_NAME_1, 'foo').timestamp(timestamp)) + .duration(1000) + .timestamp(timestamp) + .failure() + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(PROD_ID_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transactionNameProductId) + .timestamp(timestamp) + .duration(1000) + .success() + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(PROD_ID_ERROR_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transactionNameProductId) + .errors(serviceGoProdInstance.error(ERROR_NAME_2, 'bar').timestamp(timestamp)) + .duration(1000) + .timestamp(timestamp) + .failure() + .serialize() + ), + ]); +} diff --git a/x-pack/test/apm_api_integration/tests/services/get_error_group_ids.ts b/x-pack/test/apm_api_integration/tests/services/error_groups/get_error_group_ids.ts similarity index 66% rename from x-pack/test/apm_api_integration/tests/services/get_error_group_ids.ts rename to x-pack/test/apm_api_integration/tests/services/error_groups/get_error_group_ids.ts index 9fa7232240db1..cfc0867fdcfb9 100644 --- a/x-pack/test/apm_api_integration/tests/services/get_error_group_ids.ts +++ b/x-pack/test/apm_api_integration/tests/services/error_groups/get_error_group_ids.ts @@ -5,28 +5,29 @@ * 2.0. */ import { take } from 'lodash'; -import { ApmApiSupertest } from '../../common/apm_api_supertest'; +import { PromiseReturnType } from '../../../../../plugins/observability/typings/common'; +import { ApmServices } from '../../../common/config'; export async function getErrorGroupIds({ - apmApiSupertest, + apmApiClient, start, end, serviceName = 'opbeans-java', count = 5, }: { - apmApiSupertest: ApmApiSupertest; - start: string; - end: string; + apmApiClient: PromiseReturnType; + start: number; + end: number; serviceName?: string; count?: number; }) { - const { body } = await apmApiSupertest({ + const { body } = await apmApiClient.readUser({ endpoint: `GET /internal/apm/services/{serviceName}/error_groups/main_statistics`, params: { path: { serviceName }, query: { - start, - end, + start: new Date(start).toISOString(), + end: new Date(end).toISOString(), transactionType: 'request', environment: 'ENVIRONMENT_ALL', kuery: '', diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups_detailed_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups_detailed_statistics.ts deleted file mode 100644 index 3587a3e96c0d1..0000000000000 --- a/x-pack/test/apm_api_integration/tests/services/error_groups_detailed_statistics.ts +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import url from 'url'; -import expect from '@kbn/expect'; -import moment from 'moment'; -import archives_metadata from '../../common/fixtures/es_archiver/archives_metadata'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { registry } from '../../common/registry'; -import { APIReturnType } from '../../../../plugins/apm/public/services/rest/createCallApmApi'; -import { createApmApiClient } from '../../common/apm_api_supertest'; -import { getErrorGroupIds } from './get_error_group_ids'; - -type ErrorGroupsDetailedStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/error_groups/detailed_statistics'>; - -export default function ApiTest({ getService }: FtrProviderContext) { - const supertest = getService('legacySupertestAsApmReadUser'); - const apmApiSupertest = createApmApiClient(supertest); - - const archiveName = 'apm_8.0.0'; - const metadata = archives_metadata[archiveName]; - const { start, end } = metadata; - - registry.when( - 'Error groups detailed statistics when data is not loaded', - { config: 'basic', archives: [] }, - () => { - it('handles empty state', async () => { - const groupIds = await getErrorGroupIds({ apmApiSupertest, start, end }); - - const response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/detailed_statistics`, - query: { - start, - end, - numBuckets: 20, - transactionType: 'request', - groupIds: JSON.stringify(groupIds), - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - expect(response.body).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); - }); - } - ); - - registry.when( - 'Error groups detailed statistics when data is loaded', - { config: 'basic', archives: [archiveName] }, - () => { - it('returns the correct data', async () => { - const groupIds = await getErrorGroupIds({ apmApiSupertest, start, end }); - - const response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/detailed_statistics`, - query: { - start, - end, - numBuckets: 20, - transactionType: 'request', - groupIds: JSON.stringify(groupIds), - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - - const errorGroupsComparisonStatistics = response.body as ErrorGroupsDetailedStatistics; - expect(Object.keys(errorGroupsComparisonStatistics.currentPeriod).sort()).to.eql( - groupIds.sort() - ); - - groupIds.forEach((groupId) => { - expect(errorGroupsComparisonStatistics.currentPeriod[groupId]).not.to.be.empty(); - }); - - const errorgroupsComparisonStatistics = - errorGroupsComparisonStatistics.currentPeriod[groupIds[0]]; - expect( - errorgroupsComparisonStatistics.timeseries.map(({ y }) => y && isFinite(y)).length - ).to.be.greaterThan(0); - expectSnapshot(errorgroupsComparisonStatistics).toMatch(); - }); - - it('returns an empty state when requested groupIds are not available in the given time range', async () => { - const response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/detailed_statistics`, - query: { - start, - end, - numBuckets: 20, - transactionType: 'request', - groupIds: JSON.stringify(['foo']), - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - expect(response.body).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); - }); - } - ); - - registry.when( - 'Error groups detailed statistics when data is loaded with previous data', - { config: 'basic', archives: [archiveName] }, - () => { - describe('returns the correct data', async () => { - let response: { - status: number; - body: ErrorGroupsDetailedStatistics; - }; - let groupIds: string[]; - - before(async () => { - groupIds = await getErrorGroupIds({ apmApiSupertest, start, end }); - - response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/detailed_statistics`, - query: { - numBuckets: 20, - transactionType: 'request', - groupIds: JSON.stringify(groupIds), - start: moment(end).subtract(15, 'minutes').toISOString(), - end, - comparisonStart: start, - comparisonEnd: moment(start).add(15, 'minutes').toISOString(), - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - }); - - it('returns correct timeseries', () => { - const errorGroupsComparisonStatistics = response.body as ErrorGroupsDetailedStatistics; - const errorgroupsComparisonStatistics = - errorGroupsComparisonStatistics.currentPeriod[groupIds[0]]; - expect( - errorgroupsComparisonStatistics.timeseries.map(({ y }) => y && isFinite(y)).length - ).to.be.greaterThan(0); - expectSnapshot(errorgroupsComparisonStatistics).toMatch(); - }); - - it('matches x-axis on current period and previous period', () => { - const errorGroupsComparisonStatistics = response.body as ErrorGroupsDetailedStatistics; - - const currentPeriodItems = Object.values(errorGroupsComparisonStatistics.currentPeriod); - const previousPeriodItems = Object.values(errorGroupsComparisonStatistics.previousPeriod); - - const currentPeriodFirstItem = currentPeriodItems[0]; - const previousPeriodFirstItem = previousPeriodItems[0]; - - expect(currentPeriodFirstItem.timeseries.map(({ x }) => x)).to.be.eql( - previousPeriodFirstItem.timeseries.map(({ x }) => x) - ); - }); - }); - - it('returns an empty state when requested groupIds are not available in the given time range', async () => { - const response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/detailed_statistics`, - query: { - numBuckets: 20, - transactionType: 'request', - groupIds: JSON.stringify(['foo']), - start: moment(end).subtract(15, 'minutes').toISOString(), - end, - comparisonStart: start, - comparisonEnd: moment(start).add(15, 'minutes').toISOString(), - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - expect(response.body).to.be.eql({ currentPeriod: {}, previousPeriod: {} }); - }); - } - ); -} diff --git a/x-pack/test/apm_api_integration/tests/services/error_groups_main_statistics.ts b/x-pack/test/apm_api_integration/tests/services/error_groups_main_statistics.ts deleted file mode 100644 index b6fb0696f3f74..0000000000000 --- a/x-pack/test/apm_api_integration/tests/services/error_groups_main_statistics.ts +++ /dev/null @@ -1,123 +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 url from 'url'; -import expect from '@kbn/expect'; -import archives_metadata from '../../common/fixtures/es_archiver/archives_metadata'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { registry } from '../../common/registry'; -import { APIReturnType } from '../../../../plugins/apm/public/services/rest/createCallApmApi'; - -type ErrorGroupsMainStatistics = - APIReturnType<'GET /internal/apm/services/{serviceName}/error_groups/main_statistics'>; - -export default function ApiTest({ getService }: FtrProviderContext) { - const supertest = getService('legacySupertestAsApmReadUser'); - - const archiveName = 'apm_8.0.0'; - const metadata = archives_metadata[archiveName]; - const { start, end } = metadata; - - registry.when( - 'Error groups main statistics when data is not loaded', - { config: 'basic', archives: [] }, - () => { - it('handles empty state', async () => { - const response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/main_statistics`, - query: { - start, - end, - transactionType: 'request', - environment: 'ENVIRONMENT_ALL', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - - expect(response.status).to.be(200); - expect(response.body.error_groups).to.empty(); - expect(response.body.is_aggregation_accurate).to.eql(true); - }); - } - ); - - registry.when( - 'Error groups main statistics when data is loaded', - { config: 'basic', archives: [archiveName] }, - () => { - it('returns the correct data', async () => { - const response = await supertest.get( - url.format({ - pathname: `/internal/apm/services/opbeans-java/error_groups/main_statistics`, - query: { - start, - end, - transactionType: 'request', - environment: 'production', - kuery: '', - }, - }) - ); - - expect(response.status).to.be(200); - - const errorGroupMainStatistics = response.body as ErrorGroupsMainStatistics; - - expect(errorGroupMainStatistics.is_aggregation_accurate).to.eql(true); - expect(errorGroupMainStatistics.error_groups.length).to.be.greaterThan(0); - - expectSnapshot(errorGroupMainStatistics.error_groups.map(({ name }) => name)) - .toMatchInline(` - Array [ - "Response status 404", - "No converter found for return value of type: class com.sun.proxy.$Proxy162", - "Response status 404", - "Broken pipe", - "java.io.IOException: Connection reset by peer", - "Request method 'POST' not supported", - "java.io.IOException: Connection reset by peer", - "null", - ] - `); - - const occurences = errorGroupMainStatistics.error_groups.map( - ({ occurrences }) => occurrences - ); - - occurences.forEach((occurence) => expect(occurence).to.be.greaterThan(0)); - - expectSnapshot(occurences).toMatchInline(` - Array [ - 17, - 12, - 4, - 4, - 3, - 2, - 1, - 1, - ] - `); - - const firstItem = errorGroupMainStatistics.error_groups[0]; - - expectSnapshot(firstItem).toMatchInline(` - Object { - "group_id": "d16d39e7fa133b8943cea035430a7b4e", - "lastSeen": 1627975146078, - "name": "Response status 404", - "occurrences": 17, - } - `); - }); - } - ); -} diff --git a/x-pack/test/apm_api_integration/tests/services/throughput.ts b/x-pack/test/apm_api_integration/tests/services/throughput.ts index 561680e2725cf..a9865a0c3bb38 100644 --- a/x-pack/test/apm_api_integration/tests/services/throughput.ts +++ b/x-pack/test/apm_api_integration/tests/services/throughput.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { first, last, meanBy } from 'lodash'; import moment from 'moment'; @@ -23,7 +23,7 @@ type ThroughputReturn = APIReturnType<'GET /internal/apm/services/{serviceName}/ export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -63,217 +63,223 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - registry.when('data is loaded', { config: 'basic', archives: ['apm_8.0.0_empty'] }, () => { - describe('Throughput chart api', () => { - const GO_PROD_RATE = 50; - const GO_DEV_RATE = 5; - const JAVA_PROD_RATE = 45; - - before(async () => { - const serviceGoProdInstance = service(serviceName, 'production', 'go').instance( - 'instance-a' - ); - const serviceGoDevInstance = service(serviceName, 'development', 'go').instance( - 'instance-b' - ); - - const serviceJavaInstance = service('synth-java', 'development', 'java').instance( - 'instance-c' - ); - - await traceData.index([ - ...timerange(start, end) - .interval('1m') - .rate(GO_PROD_RATE) - .flatMap((timestamp) => - serviceGoProdInstance - .transaction('GET /api/product/list') - .duration(1000) - .timestamp(timestamp) - .serialize() - ), - ...timerange(start, end) - .interval('1m') - .rate(GO_DEV_RATE) - .flatMap((timestamp) => - serviceGoDevInstance - .transaction('GET /api/product/:id') - .duration(1000) - .timestamp(timestamp) - .serialize() - ), - ...timerange(start, end) - .interval('1m') - .rate(JAVA_PROD_RATE) - .flatMap((timestamp) => - serviceJavaInstance - .transaction('POST /api/product/buy') - .duration(1000) - .timestamp(timestamp) - .serialize() - ), - ]); - }); + registry.when( + 'data is loaded', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + describe('Throughput chart api', () => { + const GO_PROD_RATE = 50; + const GO_DEV_RATE = 5; + const JAVA_PROD_RATE = 45; - after(() => traceData.clean()); + before(async () => { + const serviceGoProdInstance = service(serviceName, 'production', 'go').instance( + 'instance-a' + ); + const serviceGoDevInstance = service(serviceName, 'development', 'go').instance( + 'instance-b' + ); - describe('compare transactions and metrics based throughput', () => { - let throughputMetrics: ThroughputReturn; - let throughputTransactions: ThroughputReturn; + const serviceJavaInstance = service('synth-java', 'development', 'java').instance( + 'instance-c' + ); - before(async () => { - const [throughputMetricsResponse, throughputTransactionsResponse] = await Promise.all([ - callApi({ query: { kuery: 'processor.event : "metric"' } }), - callApi({ query: { kuery: 'processor.event : "transaction"' } }), + await synthtraceEsClient.index([ + ...timerange(start, end) + .interval('1m') + .rate(GO_PROD_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction('GET /api/product/list') + .duration(1000) + .timestamp(timestamp) + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(GO_DEV_RATE) + .flatMap((timestamp) => + serviceGoDevInstance + .transaction('GET /api/product/:id') + .duration(1000) + .timestamp(timestamp) + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(JAVA_PROD_RATE) + .flatMap((timestamp) => + serviceJavaInstance + .transaction('POST /api/product/buy') + .duration(1000) + .timestamp(timestamp) + .serialize() + ), ]); - throughputMetrics = throughputMetricsResponse.body; - throughputTransactions = throughputTransactionsResponse.body; }); - it('returns some transactions data', () => { - expect(throughputTransactions.currentPeriod.length).to.be.greaterThan(0); - const hasData = throughputTransactions.currentPeriod.some(({ y }) => isFiniteNumber(y)); - expect(hasData).to.equal(true); - }); + after(() => synthtraceEsClient.clean()); - it('returns some metrics data', () => { - expect(throughputMetrics.currentPeriod.length).to.be.greaterThan(0); - const hasData = throughputMetrics.currentPeriod.some(({ y }) => isFiniteNumber(y)); - expect(hasData).to.equal(true); - }); + describe('compare transactions and metrics based throughput', () => { + let throughputMetrics: ThroughputReturn; + let throughputTransactions: ThroughputReturn; - it('has same mean value for metrics and transactions data', () => { - const transactionsMean = meanBy(throughputTransactions.currentPeriod, 'y'); - const metricsMean = meanBy(throughputMetrics.currentPeriod, 'y'); - [transactionsMean, metricsMean].forEach((value) => - expect(roundNumber(value)).to.be.equal(roundNumber(GO_PROD_RATE + GO_DEV_RATE)) - ); - }); + before(async () => { + const [throughputMetricsResponse, throughputTransactionsResponse] = await Promise.all([ + callApi({ query: { kuery: 'processor.event : "metric"' } }), + callApi({ query: { kuery: 'processor.event : "transaction"' } }), + ]); + throughputMetrics = throughputMetricsResponse.body; + throughputTransactions = throughputTransactionsResponse.body; + }); - it('has a bucket size of 10 seconds for transactions data', () => { - const firstTimerange = throughputTransactions.currentPeriod[0].x; - const secondTimerange = throughputTransactions.currentPeriod[1].x; - const timeIntervalAsSeconds = (secondTimerange - firstTimerange) / 1000; - expect(timeIntervalAsSeconds).to.equal(10); - }); + it('returns some transactions data', () => { + expect(throughputTransactions.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputTransactions.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); - it('has a bucket size of 1 minute for metrics data', () => { - const firstTimerange = throughputMetrics.currentPeriod[0].x; - const secondTimerange = throughputMetrics.currentPeriod[1].x; - const timeIntervalAsMinutes = (secondTimerange - firstTimerange) / 1000 / 60; - expect(timeIntervalAsMinutes).to.equal(1); - }); - }); + it('returns some metrics data', () => { + expect(throughputMetrics.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughputMetrics.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); - describe('production environment', () => { - let throughput: ThroughputReturn; + it('has same mean value for metrics and transactions data', () => { + const transactionsMean = meanBy(throughputTransactions.currentPeriod, 'y'); + const metricsMean = meanBy(throughputMetrics.currentPeriod, 'y'); + [transactionsMean, metricsMean].forEach((value) => + expect(roundNumber(value)).to.be.equal(roundNumber(GO_PROD_RATE + GO_DEV_RATE)) + ); + }); - before(async () => { - const throughputResponse = await callApi({ query: { environment: 'production' } }); - throughput = throughputResponse.body; - }); + it('has a bucket size of 10 seconds for transactions data', () => { + const firstTimerange = throughputTransactions.currentPeriod[0].x; + const secondTimerange = throughputTransactions.currentPeriod[1].x; + const timeIntervalAsSeconds = (secondTimerange - firstTimerange) / 1000; + expect(timeIntervalAsSeconds).to.equal(10); + }); - it('returns some data', () => { - expect(throughput.currentPeriod.length).to.be.greaterThan(0); - const hasData = throughput.currentPeriod.some(({ y }) => isFiniteNumber(y)); - expect(hasData).to.equal(true); + it('has a bucket size of 1 minute for metrics data', () => { + const firstTimerange = throughputMetrics.currentPeriod[0].x; + const secondTimerange = throughputMetrics.currentPeriod[1].x; + const timeIntervalAsMinutes = (secondTimerange - firstTimerange) / 1000 / 60; + expect(timeIntervalAsMinutes).to.equal(1); + }); }); - it('returns correct average throughput', () => { - const throughputMean = meanBy(throughput.currentPeriod, 'y'); - expect(roundNumber(throughputMean)).to.be.equal(roundNumber(GO_PROD_RATE)); - }); - }); + describe('production environment', () => { + let throughput: ThroughputReturn; - describe('when synth-java is selected', () => { - let throughput: ThroughputReturn; + before(async () => { + const throughputResponse = await callApi({ query: { environment: 'production' } }); + throughput = throughputResponse.body; + }); - before(async () => { - const throughputResponse = await callApi({ path: { serviceName: 'synth-java' } }); - throughput = throughputResponse.body; - }); + it('returns some data', () => { + expect(throughput.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughput.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); - it('returns some data', () => { - expect(throughput.currentPeriod.length).to.be.greaterThan(0); - const hasData = throughput.currentPeriod.some(({ y }) => isFiniteNumber(y)); - expect(hasData).to.equal(true); + it('returns correct average throughput', () => { + const throughputMean = meanBy(throughput.currentPeriod, 'y'); + expect(roundNumber(throughputMean)).to.be.equal(roundNumber(GO_PROD_RATE)); + }); }); - it('returns throughput related to java agent', () => { - const throughputMean = meanBy(throughput.currentPeriod, 'y'); - expect(roundNumber(throughputMean)).to.be.equal(roundNumber(JAVA_PROD_RATE)); - }); - }); + describe('when synth-java is selected', () => { + let throughput: ThroughputReturn; - describe('time comparisons', () => { - let throughputResponse: ThroughputReturn; + before(async () => { + const throughputResponse = await callApi({ path: { serviceName: 'synth-java' } }); + throughput = throughputResponse.body; + }); - before(async () => { - const response = await callApi({ - query: { - start: moment(end).subtract(7, 'minutes').toISOString(), - end: new Date(end).toISOString(), - comparisonStart: new Date(start).toISOString(), - comparisonEnd: moment(start).add(7, 'minutes').toISOString(), - }, + it('returns some data', () => { + expect(throughput.currentPeriod.length).to.be.greaterThan(0); + const hasData = throughput.currentPeriod.some(({ y }) => isFiniteNumber(y)); + expect(hasData).to.equal(true); + }); + + it('returns throughput related to java agent', () => { + const throughputMean = meanBy(throughput.currentPeriod, 'y'); + expect(roundNumber(throughputMean)).to.be.equal(roundNumber(JAVA_PROD_RATE)); }); - throughputResponse = response.body; }); - it('returns some data', () => { - expect(throughputResponse.currentPeriod.length).to.be.greaterThan(0); - expect(throughputResponse.previousPeriod.length).to.be.greaterThan(0); + describe('time comparisons', () => { + let throughputResponse: ThroughputReturn; + + before(async () => { + const response = await callApi({ + query: { + start: moment(end).subtract(7, 'minutes').toISOString(), + end: new Date(end).toISOString(), + comparisonStart: new Date(start).toISOString(), + comparisonEnd: moment(start).add(7, 'minutes').toISOString(), + }, + }); + throughputResponse = response.body; + }); - const hasCurrentPeriodData = throughputResponse.currentPeriod.some(({ y }) => - isFiniteNumber(y) - ); - const hasPreviousPeriodData = throughputResponse.previousPeriod.some(({ y }) => - isFiniteNumber(y) - ); + it('returns some data', () => { + expect(throughputResponse.currentPeriod.length).to.be.greaterThan(0); + expect(throughputResponse.previousPeriod.length).to.be.greaterThan(0); - expect(hasCurrentPeriodData).to.equal(true); - expect(hasPreviousPeriodData).to.equal(true); - }); + const hasCurrentPeriodData = throughputResponse.currentPeriod.some(({ y }) => + isFiniteNumber(y) + ); + const hasPreviousPeriodData = throughputResponse.previousPeriod.some(({ y }) => + isFiniteNumber(y) + ); - it('has same start time for both periods', () => { - expect(first(throughputResponse.currentPeriod)?.x).to.equal( - first(throughputResponse.previousPeriod)?.x - ); - }); + expect(hasCurrentPeriodData).to.equal(true); + expect(hasPreviousPeriodData).to.equal(true); + }); - it('has same end time for both periods', () => { - expect(last(throughputResponse.currentPeriod)?.x).to.equal( - last(throughputResponse.previousPeriod)?.x - ); - }); + it('has same start time for both periods', () => { + expect(first(throughputResponse.currentPeriod)?.x).to.equal( + first(throughputResponse.previousPeriod)?.x + ); + }); - it('returns same number of buckets for both periods', () => { - expect(throughputResponse.currentPeriod.length).to.be( - throughputResponse.previousPeriod.length - ); - }); + it('has same end time for both periods', () => { + expect(last(throughputResponse.currentPeriod)?.x).to.equal( + last(throughputResponse.previousPeriod)?.x + ); + }); - it('has same mean value for both periods', () => { - const currentPeriodMean = meanBy( - throughputResponse.currentPeriod.filter((item) => isFiniteNumber(item.y) && item.y > 0), - 'y' - ); - const previousPeriodMean = meanBy( - throughputResponse.previousPeriod.filter( - (item) => isFiniteNumber(item.y) && item.y > 0 - ), - 'y' - ); - const currentPeriod = throughputResponse.currentPeriod; - const bucketSize = currentPeriod[1].x - currentPeriod[0].x; - const durationAsMinutes = bucketSize / 1000 / 60; - [currentPeriodMean, previousPeriodMean].every((value) => - expect(roundNumber(value)).to.be.equal( - roundNumber((GO_PROD_RATE + GO_DEV_RATE) / durationAsMinutes) - ) - ); + it('returns same number of buckets for both periods', () => { + expect(throughputResponse.currentPeriod.length).to.be( + throughputResponse.previousPeriod.length + ); + }); + + it('has same mean value for both periods', () => { + const currentPeriodMean = meanBy( + throughputResponse.currentPeriod.filter( + (item) => isFiniteNumber(item.y) && item.y > 0 + ), + 'y' + ); + const previousPeriodMean = meanBy( + throughputResponse.previousPeriod.filter( + (item) => isFiniteNumber(item.y) && item.y > 0 + ), + 'y' + ); + const currentPeriod = throughputResponse.currentPeriod; + const bucketSize = currentPeriod[1].x - currentPeriod[0].x; + const durationAsMinutes = bucketSize / 1000 / 60; + [currentPeriodMean, previousPeriodMean].every((value) => + expect(roundNumber(value)).to.be.equal( + roundNumber((GO_PROD_RATE + GO_DEV_RATE) / durationAsMinutes) + ) + ); + }); }); }); - }); - }); + } + ); } diff --git a/x-pack/test/apm_api_integration/tests/throughput/dependencies_apis.ts b/x-pack/test/apm_api_integration/tests/throughput/dependencies_apis.ts index 4b3820ee7f033..4cc9b2f0679fe 100644 --- a/x-pack/test/apm_api_integration/tests/throughput/dependencies_apis.ts +++ b/x-pack/test/apm_api_integration/tests/throughput/dependencies_apis.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { meanBy, sumBy } from 'lodash'; import { BackendNode, ServiceNode } from '../../../../plugins/apm/common/connections'; @@ -15,7 +15,7 @@ import { roundNumber } from '../../utils'; export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const start = new Date('2021-01-01T00:00:00.000Z').getTime(); const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1; @@ -39,21 +39,21 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }), apmApiClient.readUser({ - endpoint: `GET /internal/apm/backends/{backendName}/charts/throughput`, + endpoint: `GET /internal/apm/backends/charts/throughput`, params: { - path: { backendName: overrides?.backendName || 'elasticsearch' }, query: { ...commonQuery, + backendName: overrides?.backendName || 'elasticsearch', kuery: '', }, }, }), apmApiClient.readUser({ - endpoint: `GET /internal/apm/backends/{backendName}/upstream_services`, + endpoint: `GET /internal/apm/backends/upstream_services`, params: { - path: { backendName: overrides?.backendName || 'elasticsearch' }, query: { ...commonQuery, + backendName: overrides?.backendName || 'elasticsearch', numBuckets: 20, offset: '1d', kuery: '', @@ -88,7 +88,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when( 'Dependencies throughput value', - { config: 'basic', archives: ['apm_8.0.0_empty'] }, + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, () => { describe('when data is loaded', () => { const GO_PROD_RATE = 75; @@ -101,7 +101,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { 'instance-c' ); - await traceData.index([ + await synthtraceEsClient.index([ ...timerange(start, end) .interval('1m') .rate(GO_PROD_RATE) @@ -159,7 +159,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]); }); - after(() => traceData.clean()); + after(() => synthtraceEsClient.clean()); describe('verify top dependencies', () => { before(async () => { diff --git a/x-pack/test/apm_api_integration/tests/throughput/service_apis.ts b/x-pack/test/apm_api_integration/tests/throughput/service_apis.ts index 6bf0e8c14fb23..c4fffd8d79afb 100644 --- a/x-pack/test/apm_api_integration/tests/throughput/service_apis.ts +++ b/x-pack/test/apm_api_integration/tests/throughput/service_apis.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { meanBy, sumBy } from 'lodash'; import { LatencyAggregationType } from '../../../../plugins/apm/common/latency_aggregation_types'; @@ -15,7 +15,7 @@ import { roundNumber } from '../../utils'; export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -104,7 +104,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { let throughputMetricValues: PromiseReturnType; let throughputTransactionValues: PromiseReturnType; - registry.when('Services APIs', { config: 'basic', archives: ['apm_8.0.0_empty'] }, () => { + registry.when('Services APIs', { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, () => { describe('when data is loaded ', () => { const GO_PROD_RATE = 80; const GO_DEV_RATE = 20; @@ -115,7 +115,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const serviceGoDevInstance = service(serviceName, 'development', 'go').instance( 'instance-b' ); - await traceData.index([ + await synthtraceEsClient.index([ ...timerange(start, end) .interval('1m') .rate(GO_PROD_RATE) @@ -139,7 +139,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { ]); }); - after(() => traceData.clean()); + after(() => synthtraceEsClient.clean()); describe('compare throughput value between service inventory, throughput chart, service inventory and transactions apis', () => { before(async () => { diff --git a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts index 100d3c306b7de..e877afc070050 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/transactions_groups_detailed_statistics.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { service, timerange } from '@elastic/apm-generator'; +import { service, timerange } from '@elastic/apm-synthtrace'; import expect from '@kbn/expect'; import { first, isEmpty, last, meanBy } from 'lodash'; import moment from 'moment'; @@ -20,7 +20,7 @@ type TransactionsGroupsDetailedStatistics = export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); - const traceData = getService('traceData'); + const synthtraceEsClient = getService('synthtraceEsClient'); const serviceName = 'synth-go'; const start = new Date('2021-01-01T00:00:00.000Z').getTime(); @@ -76,175 +76,181 @@ export default function ApiTest({ getService }: FtrProviderContext) { } ); - registry.when('data is loaded', { config: 'basic', archives: ['apm_8.0.0_empty'] }, () => { - describe('transactions groups detailed stats', () => { - const GO_PROD_RATE = 75; - const GO_PROD_ERROR_RATE = 25; - before(async () => { - const serviceGoProdInstance = service(serviceName, 'production', 'go').instance( - 'instance-a' - ); - - const transactionName = 'GET /api/product/list'; - - await traceData.index([ - ...timerange(start, end) - .interval('1m') - .rate(GO_PROD_RATE) - .flatMap((timestamp) => - serviceGoProdInstance - .transaction(transactionName) - .timestamp(timestamp) - .duration(1000) - .success() - .serialize() - ), - ...timerange(start, end) - .interval('1m') - .rate(GO_PROD_ERROR_RATE) - .flatMap((timestamp) => - serviceGoProdInstance - .transaction(transactionName) - .duration(1000) - .timestamp(timestamp) - .failure() - .serialize() - ), - ]); - }); + registry.when( + 'data is loaded', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + describe('transactions groups detailed stats', () => { + const GO_PROD_RATE = 75; + const GO_PROD_ERROR_RATE = 25; + before(async () => { + const serviceGoProdInstance = service(serviceName, 'production', 'go').instance( + 'instance-a' + ); - after(() => traceData.clean()); + const transactionName = 'GET /api/product/list'; - describe('without comparisons', () => { - let transactionsStatistics: TransactionsGroupsDetailedStatistics; - let metricsStatistics: TransactionsGroupsDetailedStatistics; - before(async () => { - [metricsStatistics, transactionsStatistics] = await Promise.all([ - callApi({ query: { kuery: 'processor.event : "metric"' } }), - callApi({ query: { kuery: 'processor.event : "transaction"' } }), + await synthtraceEsClient.index([ + ...timerange(start, end) + .interval('1m') + .rate(GO_PROD_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transactionName) + .timestamp(timestamp) + .duration(1000) + .success() + .serialize() + ), + ...timerange(start, end) + .interval('1m') + .rate(GO_PROD_ERROR_RATE) + .flatMap((timestamp) => + serviceGoProdInstance + .transaction(transactionName) + .duration(1000) + .timestamp(timestamp) + .failure() + .serialize() + ), ]); }); - it('returns some transactions data', () => { - expect(isEmpty(transactionsStatistics.currentPeriod)).to.be.equal(false); - }); + after(() => synthtraceEsClient.clean()); - it('returns some metrics data', () => { - expect(isEmpty(metricsStatistics.currentPeriod)).to.be.equal(false); - }); + describe('without comparisons', () => { + let transactionsStatistics: TransactionsGroupsDetailedStatistics; + let metricsStatistics: TransactionsGroupsDetailedStatistics; + before(async () => { + [metricsStatistics, transactionsStatistics] = await Promise.all([ + callApi({ query: { kuery: 'processor.event : "metric"' } }), + callApi({ query: { kuery: 'processor.event : "transaction"' } }), + ]); + }); - it('has same latency mean value for metrics and transactions data', () => { - const transactionsCurrentPeriod = - transactionsStatistics.currentPeriod[transactionNames[0]]; - const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; - const transactionsLatencyMean = meanBy(transactionsCurrentPeriod.latency, 'y'); - const metricsLatencyMean = meanBy(metricsCurrentPeriod.latency, 'y'); - [transactionsLatencyMean, metricsLatencyMean].forEach((value) => - expect(value).to.be.equal(1000000) - ); - }); + it('returns some transactions data', () => { + expect(isEmpty(transactionsStatistics.currentPeriod)).to.be.equal(false); + }); - it('has same error rate mean value for metrics and transactions data', () => { - const transactionsCurrentPeriod = - transactionsStatistics.currentPeriod[transactionNames[0]]; - const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; + it('returns some metrics data', () => { + expect(isEmpty(metricsStatistics.currentPeriod)).to.be.equal(false); + }); - const transactionsErrorRateMean = meanBy(transactionsCurrentPeriod.errorRate, 'y'); - const metricsErrorRateMean = meanBy(metricsCurrentPeriod.errorRate, 'y'); - [transactionsErrorRateMean, metricsErrorRateMean].forEach((value) => - expect(asPercent(value, 1)).to.be.equal(`${GO_PROD_ERROR_RATE}%`) - ); - }); + it('has same latency mean value for metrics and transactions data', () => { + const transactionsCurrentPeriod = + transactionsStatistics.currentPeriod[transactionNames[0]]; + const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; + const transactionsLatencyMean = meanBy(transactionsCurrentPeriod.latency, 'y'); + const metricsLatencyMean = meanBy(metricsCurrentPeriod.latency, 'y'); + [transactionsLatencyMean, metricsLatencyMean].forEach((value) => + expect(value).to.be.equal(1000000) + ); + }); - it('has same throughput mean value for metrics and transactions data', () => { - const transactionsCurrentPeriod = - transactionsStatistics.currentPeriod[transactionNames[0]]; - const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; - const transactionsThroughputMean = roundNumber( - meanBy(transactionsCurrentPeriod.throughput, 'y') - ); - const metricsThroughputMean = roundNumber(meanBy(metricsCurrentPeriod.throughput, 'y')); - [transactionsThroughputMean, metricsThroughputMean].forEach((value) => - expect(value).to.be.equal(roundNumber(GO_PROD_RATE + GO_PROD_ERROR_RATE)) - ); - }); + it('has same error rate mean value for metrics and transactions data', () => { + const transactionsCurrentPeriod = + transactionsStatistics.currentPeriod[transactionNames[0]]; + const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; - it('has same impact value for metrics and transactions data', () => { - const transactionsCurrentPeriod = - transactionsStatistics.currentPeriod[transactionNames[0]]; - const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; + const transactionsErrorRateMean = meanBy(transactionsCurrentPeriod.errorRate, 'y'); + const metricsErrorRateMean = meanBy(metricsCurrentPeriod.errorRate, 'y'); + [transactionsErrorRateMean, metricsErrorRateMean].forEach((value) => + expect(asPercent(value, 1)).to.be.equal(`${GO_PROD_ERROR_RATE}%`) + ); + }); - const transactionsImpact = transactionsCurrentPeriod.impact; - const metricsImpact = metricsCurrentPeriod.impact; - [transactionsImpact, metricsImpact].forEach((value) => expect(value).to.be.equal(100)); - }); - }); + it('has same throughput mean value for metrics and transactions data', () => { + const transactionsCurrentPeriod = + transactionsStatistics.currentPeriod[transactionNames[0]]; + const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; + const transactionsThroughputMean = roundNumber( + meanBy(transactionsCurrentPeriod.throughput, 'y') + ); + const metricsThroughputMean = roundNumber(meanBy(metricsCurrentPeriod.throughput, 'y')); + [transactionsThroughputMean, metricsThroughputMean].forEach((value) => + expect(value).to.be.equal(roundNumber(GO_PROD_RATE + GO_PROD_ERROR_RATE)) + ); + }); - describe('with comparisons', () => { - let transactionsStatistics: TransactionsGroupsDetailedStatistics; - before(async () => { - transactionsStatistics = await callApi({ - query: { - start: moment(end).subtract(7, 'minutes').toISOString(), - end: new Date(end).toISOString(), - comparisonStart: new Date(start).toISOString(), - comparisonEnd: moment(start).add(7, 'minutes').toISOString(), - }, + it('has same impact value for metrics and transactions data', () => { + const transactionsCurrentPeriod = + transactionsStatistics.currentPeriod[transactionNames[0]]; + const metricsCurrentPeriod = metricsStatistics.currentPeriod[transactionNames[0]]; + + const transactionsImpact = transactionsCurrentPeriod.impact; + const metricsImpact = metricsCurrentPeriod.impact; + [transactionsImpact, metricsImpact].forEach((value) => expect(value).to.be.equal(100)); }); }); - it('returns some data for both periods', () => { - expect(isEmpty(transactionsStatistics.currentPeriod)).to.be.equal(false); - expect(isEmpty(transactionsStatistics.previousPeriod)).to.be.equal(false); - }); + describe('with comparisons', () => { + let transactionsStatistics: TransactionsGroupsDetailedStatistics; + before(async () => { + transactionsStatistics = await callApi({ + query: { + start: moment(end).subtract(7, 'minutes').toISOString(), + end: new Date(end).toISOString(), + comparisonStart: new Date(start).toISOString(), + comparisonEnd: moment(start).add(7, 'minutes').toISOString(), + }, + }); + }); - it('has same start time for both periods', () => { - const currentPeriod = transactionsStatistics.currentPeriod[transactionNames[0]]; - const previousPeriod = transactionsStatistics.previousPeriod[transactionNames[0]]; - [ - [currentPeriod.latency, previousPeriod.latency], - [currentPeriod.errorRate, previousPeriod.errorRate], - [currentPeriod.throughput, previousPeriod.throughput], - ].forEach(([currentTimeseries, previousTimeseries]) => { - const firstCurrentPeriodDate = new Date( - first(currentTimeseries)?.x ?? NaN - ).toISOString(); - const firstPreviousPeriodDate = new Date( - first(previousPeriod.latency)?.x ?? NaN - ).toISOString(); - - expect(firstCurrentPeriodDate).to.equal(firstPreviousPeriodDate); + it('returns some data for both periods', () => { + expect(isEmpty(transactionsStatistics.currentPeriod)).to.be.equal(false); + expect(isEmpty(transactionsStatistics.previousPeriod)).to.be.equal(false); }); - }); - it('has same end time for both periods', () => { - const currentPeriod = transactionsStatistics.currentPeriod[transactionNames[0]]; - const previousPeriod = transactionsStatistics.previousPeriod[transactionNames[0]]; - [ - [currentPeriod.latency, previousPeriod.latency], - [currentPeriod.errorRate, previousPeriod.errorRate], - [currentPeriod.throughput, previousPeriod.throughput], - ].forEach(([currentTimeseries, previousTimeseries]) => { - const lastCurrentPeriodDate = new Date(last(currentTimeseries)?.x ?? NaN).toISOString(); - const lastPreviousPeriodDate = new Date( - last(previousPeriod.latency)?.x ?? NaN - ).toISOString(); - - expect(lastCurrentPeriodDate).to.equal(lastPreviousPeriodDate); + + it('has same start time for both periods', () => { + const currentPeriod = transactionsStatistics.currentPeriod[transactionNames[0]]; + const previousPeriod = transactionsStatistics.previousPeriod[transactionNames[0]]; + [ + [currentPeriod.latency, previousPeriod.latency], + [currentPeriod.errorRate, previousPeriod.errorRate], + [currentPeriod.throughput, previousPeriod.throughput], + ].forEach(([currentTimeseries, previousTimeseries]) => { + const firstCurrentPeriodDate = new Date( + first(currentTimeseries)?.x ?? NaN + ).toISOString(); + const firstPreviousPeriodDate = new Date( + first(previousPeriod.latency)?.x ?? NaN + ).toISOString(); + + expect(firstCurrentPeriodDate).to.equal(firstPreviousPeriodDate); + }); }); - }); + it('has same end time for both periods', () => { + const currentPeriod = transactionsStatistics.currentPeriod[transactionNames[0]]; + const previousPeriod = transactionsStatistics.previousPeriod[transactionNames[0]]; + [ + [currentPeriod.latency, previousPeriod.latency], + [currentPeriod.errorRate, previousPeriod.errorRate], + [currentPeriod.throughput, previousPeriod.throughput], + ].forEach(([currentTimeseries, previousTimeseries]) => { + const lastCurrentPeriodDate = new Date( + last(currentTimeseries)?.x ?? NaN + ).toISOString(); + const lastPreviousPeriodDate = new Date( + last(previousPeriod.latency)?.x ?? NaN + ).toISOString(); - it('returns same number of buckets for both periods', () => { - const currentPeriod = transactionsStatistics.currentPeriod[transactionNames[0]]; - const previousPeriod = transactionsStatistics.previousPeriod[transactionNames[0]]; - [ - [currentPeriod.latency, previousPeriod.latency], - [currentPeriod.errorRate, previousPeriod.errorRate], - [currentPeriod.throughput, previousPeriod.throughput], - ].forEach(([currentTimeseries, previousTimeseries]) => { - expect(currentTimeseries.length).to.equal(previousTimeseries.length); + expect(lastCurrentPeriodDate).to.equal(lastPreviousPeriodDate); + }); + }); + + it('returns same number of buckets for both periods', () => { + const currentPeriod = transactionsStatistics.currentPeriod[transactionNames[0]]; + const previousPeriod = transactionsStatistics.previousPeriod[transactionNames[0]]; + [ + [currentPeriod.latency, previousPeriod.latency], + [currentPeriod.errorRate, previousPeriod.errorRate], + [currentPeriod.throughput, previousPeriod.throughput], + ].forEach(([currentTimeseries, previousTimeseries]) => { + expect(currentTimeseries.length).to.equal(previousTimeseries.length); + }); }); }); }); - }); - }); + } + ); } diff --git a/x-pack/test/case_api_integration/common/lib/utils.ts b/x-pack/test/case_api_integration/common/lib/utils.ts index f34d7398db0c2..9d48aed32d55c 100644 --- a/x-pack/test/case_api_integration/common/lib/utils.ts +++ b/x-pack/test/case_api_integration/common/lib/utils.ts @@ -329,6 +329,7 @@ export const getServiceNowConnector = () => ({ }, config: { apiUrl: 'http://some.non.existent.com', + usesTableApi: false, }, }); @@ -385,6 +386,7 @@ export const getServiceNowSIRConnector = () => ({ }, config: { apiUrl: 'http://some.non.existent.com', + usesTableApi: false, }, }); diff --git a/x-pack/test/case_api_integration/security_and_spaces/tests/trial/configure/get_connectors.ts b/x-pack/test/case_api_integration/security_and_spaces/tests/trial/configure/get_connectors.ts index c3e737464f19b..a4e69ab928325 100644 --- a/x-pack/test/case_api_integration/security_and_spaces/tests/trial/configure/get_connectors.ts +++ b/x-pack/test/case_api_integration/security_and_spaces/tests/trial/configure/get_connectors.ts @@ -109,7 +109,7 @@ export default ({ getService }: FtrProviderContext): void => { name: 'ServiceNow Connector', config: { apiUrl: 'http://some.non.existent.com', - isLegacy: false, + usesTableApi: false, }, isPreconfigured: false, isMissingSecrets: false, @@ -121,7 +121,7 @@ export default ({ getService }: FtrProviderContext): void => { name: 'ServiceNow Connector', config: { apiUrl: 'http://some.non.existent.com', - isLegacy: false, + usesTableApi: false, }, isPreconfigured: false, isMissingSecrets: false, diff --git a/x-pack/test/case_api_integration/spaces_only/tests/trial/configure/get_connectors.ts b/x-pack/test/case_api_integration/spaces_only/tests/trial/configure/get_connectors.ts index 7b6848d1f301e..02b91c9f0b918 100644 --- a/x-pack/test/case_api_integration/spaces_only/tests/trial/configure/get_connectors.ts +++ b/x-pack/test/case_api_integration/spaces_only/tests/trial/configure/get_connectors.ts @@ -109,7 +109,7 @@ export default ({ getService }: FtrProviderContext): void => { name: 'ServiceNow Connector', config: { apiUrl: 'http://some.non.existent.com', - isLegacy: false, + usesTableApi: false, }, isPreconfigured: false, isMissingSecrets: false, @@ -121,7 +121,7 @@ export default ({ getService }: FtrProviderContext): void => { name: 'ServiceNow Connector', config: { apiUrl: 'http://some.non.existent.com', - isLegacy: false, + usesTableApi: false, }, isPreconfigured: false, isMissingSecrets: false, diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_endpoint_exceptions.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_endpoint_exceptions.ts index 6d04ffc67c573..6c6fcc366782a 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_endpoint_exceptions.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_endpoint_exceptions.ts @@ -69,7 +69,6 @@ export const getHostHits = async ( export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for endpoints', () => { before(async () => { @@ -94,7 +93,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts index 0d1e353447e99..1882f488e5a17 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_exceptions.ts @@ -79,7 +79,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); describe('elastic admin', () => { @@ -550,7 +550,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should be able to execute against an exception list that does not include valid entries and get back 10 signals', async () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_index.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_index.ts index 4748e39cd3a46..56802a48adabe 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_index.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_index.ts @@ -20,6 +20,8 @@ import { createUserAndRole, deleteUserAndRole } from '../../../common/services/s export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const supertestWithoutAuth = getService('supertestWithoutAuth'); + const esArchiver = getService('esArchiver'); + const es = getService('es'); describe('create_index', () => { afterEach(async () => { @@ -27,6 +29,65 @@ export default ({ getService }: FtrProviderContext) => { }); describe('elastic admin', () => { + describe('with another index that shares index alias', () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/signals/index_alias_clash'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/signals/index_alias_clash'); + }); + + it('should report that signals index does not exist', async () => { + const { body } = await supertest.get(DETECTION_ENGINE_INDEX_URL).send().expect(404); + expect(body).to.eql({ message: 'index for this space does not exist', status_code: 404 }); + }); + + it('should return 200 for create_index', async () => { + const { body } = await supertest + .post(DETECTION_ENGINE_INDEX_URL) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body).to.eql({ acknowledged: true }); + }); + }); + + describe('with an outdated signals index', () => { + beforeEach(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/signals'); + }); + + afterEach(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/endpoint/resolver/signals'); + }); + + it('should report that signals index is outdated', async () => { + const { body } = await supertest.get(DETECTION_ENGINE_INDEX_URL).send().expect(200); + expect(body).to.eql({ + index_mapping_outdated: true, + name: `${DEFAULT_SIGNALS_INDEX}-default`, + }); + }); + + it('should return 200 for create_index and add field aliases', async () => { + const { body } = await supertest + .post(DETECTION_ENGINE_INDEX_URL) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body).to.eql({ acknowledged: true }); + + const { body: mappings } = await es.indices.get({ + index: '.siem-signals-default-000001', + }); + // Make sure that aliases_version has been updated on the existing index + expect(mappings['.siem-signals-default-000001'].mappings?._meta?.aliases_version).to.eql( + 1 + ); + }); + }); + it('should return a 404 when the signal index has never been created', async () => { const { body } = await supertest.get(DETECTION_ENGINE_INDEX_URL).send().expect(404); expect(body).to.eql({ message: 'index for this space does not exist', status_code: 404 }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts index c78ef18635de7..50e0d200acf3b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts @@ -212,9 +212,10 @@ export default ({ getService }: FtrProviderContext) => { const signalsOpen = await getOpenSignals(supertest, es, createdRule); expect(signalsOpen.hits.hits.length).eql(7); }); + describe('with non-value list exception', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('generates no signals when an exception is added for an ML rule', async () => { const createdRule = await createRuleWithExceptionEntries(supertest, testRule, [ @@ -239,7 +240,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteListsIndex(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('generates no signals when a value list exception is added for an ML rule', async () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/date.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/date.ts index c2c7313762ae7..742bbf7285e95 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/date.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/date.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type date', () => { before(async () => { @@ -49,7 +48,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/double.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/double.ts index 7f659d6795f9a..a2639ea522447 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/double.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/double.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type double', () => { before(async () => { @@ -53,7 +52,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/float.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/float.ts index 912596ed7ca00..288e2353166ee 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/float.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/float.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type float', () => { before(async () => { @@ -51,7 +50,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/integer.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/integer.ts index da9219e4b52f6..459034cd06569 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/integer.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/integer.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type integer', () => { before(async () => { @@ -53,7 +52,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip.ts index 3a65a0f0a67e5..2497bf096550a 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type ip', () => { before(async () => { @@ -49,7 +48,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip_array.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip_array.ts index 526c6d1c988ce..5df01ff80d67b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip_array.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/ip_array.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type ip', () => { before(async () => { @@ -49,7 +48,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword.ts index 4c70dbdf170c7..8a184025b00e2 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type keyword', () => { before(async () => { @@ -49,7 +48,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword_array.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword_array.ts index 8571aa8eeaa60..092b81bf446b8 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword_array.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/keyword_array.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type keyword', () => { before(async () => { @@ -51,7 +50,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/long.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/long.ts index 8d5f1515e4ab6..f5bf3b627bc2f 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/long.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/long.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type long', () => { before(async () => { @@ -51,7 +50,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text.ts index 367e68f7f9ed1..ff2f680654047 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text.ts @@ -31,7 +31,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type text', () => { before(async () => { @@ -52,7 +51,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text_array.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text_array.ts index 3eedabd41d663..3bcf8692d58f9 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text_array.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/exception_operators_data_types/text_array.ts @@ -30,7 +30,6 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - const es = getService('es'); describe('Rule exception operators for data type text', () => { before(async () => { @@ -49,7 +48,7 @@ export default ({ getService }: FtrProviderContext) => { afterEach(async () => { await deleteSignalsIndex(supertest); await deleteAllAlerts(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); await deleteListsIndex(supertest); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts index 03b1beffa7993..0f4c42fd7ab39 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts @@ -17,6 +17,7 @@ import { deleteSignalsIndex, getSimpleRule, getSimpleRuleOutput, + getWebHookAction, removeServerGeneratedProperties, } from '../../utils'; @@ -109,6 +110,411 @@ export default ({ getService }: FtrProviderContext): void => { getSimpleRuleOutput('rule-1'), ]); }); + + it('should export multiple actions attached to 1 rule', async () => { + // 1st action + const { body: hookAction1 } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // 2nd action + const { body: hookAction2 } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const action1 = { + group: 'default', + id: hookAction1.id, + action_type_id: hookAction1.actionTypeId, + params: {}, + }; + const action2 = { + group: 'default', + id: hookAction2.id, + action_type_id: hookAction2.actionTypeId, + params: {}, + }; + + const rule1: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [action1, action2], + }; + + await createRule(supertest, rule1); + + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_export`) + .set('kbn-xsrf', 'true') + .send() + .expect(200) + .parse(binaryToString); + + const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); + const firstRule = removeServerGeneratedProperties(firstRuleParsed); + + const outputRule1: ReturnType = { + ...getSimpleRuleOutput('rule-1'), + actions: [action1, action2], + throttle: 'rule', + }; + expect(firstRule).to.eql(outputRule1); + }); + + it('should export actions attached to 2 rules', async () => { + // create a new action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const action = { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }; + + const rule1: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [action], + }; + + const rule2: ReturnType = { + ...getSimpleRule('rule-2'), + actions: [action], + }; + + await createRule(supertest, rule1); + await createRule(supertest, rule2); + + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_export`) + .set('kbn-xsrf', 'true') + .send() + .expect(200) + .parse(binaryToString); + + const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); + const secondRuleParsed = JSON.parse(body.toString().split(/\n/)[1]); + const firstRule = removeServerGeneratedProperties(firstRuleParsed); + const secondRule = removeServerGeneratedProperties(secondRuleParsed); + + const outputRule1: ReturnType = { + ...getSimpleRuleOutput('rule-2'), + actions: [action], + throttle: 'rule', + }; + const outputRule2: ReturnType = { + ...getSimpleRuleOutput('rule-1'), + actions: [action], + throttle: 'rule', + }; + expect(firstRule).to.eql(outputRule1); + expect(secondRule).to.eql(outputRule2); + }); + + /** + * Tests the legacy actions to ensure we can export legacy notifications + * @deprecated Once the legacy notification system is removed, remove this test too. + */ + describe('legacy_notification_system', () => { + it('should be able to export 1 legacy action on 1 rule', async () => { + // create an action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create a rule without actions + const rule = await createRule(supertest, getSimpleRule('rule-1')); + + // attach the legacy notification + await supertest + .post(`/internal/api/detection/legacy/notifications?alert_id=${rule.id}`) + .set('kbn-xsrf', 'true') + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: hookAction.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction.actionTypeId, + }, + ], + }) + .expect(200); + + // export the rule + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_export`) + .set('kbn-xsrf', 'true') + .send() + .expect(200) + .parse(binaryToString); + + const outputRule1: ReturnType = { + ...getSimpleRuleOutput('rule-1'), + actions: [ + { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ], + throttle: '1h', + }; + const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); + const firstRule = removeServerGeneratedProperties(firstRuleParsed); + + expect(firstRule).to.eql(outputRule1); + }); + + it('should be able to export 2 legacy actions on 1 rule', async () => { + // create 1st action/connector + const { body: hookAction1 } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create 2nd action/connector + const { body: hookAction2 } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create a rule without actions + const rule = await createRule(supertest, getSimpleRule('rule-1')); + + // attach the legacy notification with actions + await supertest + .post(`/internal/api/detection/legacy/notifications?alert_id=${rule.id}`) + .set('kbn-xsrf', 'true') + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: hookAction1.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction1.actionTypeId, + }, + { + id: hookAction2.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction2.actionTypeId, + }, + ], + }) + .expect(200); + + // export the rule + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_export`) + .set('kbn-xsrf', 'true') + .send() + .expect(200) + .parse(binaryToString); + + const outputRule1: ReturnType = { + ...getSimpleRuleOutput('rule-1'), + actions: [ + { + group: 'default', + id: hookAction1.id, + action_type_id: hookAction1.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + { + group: 'default', + id: hookAction2.id, + action_type_id: hookAction2.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ], + throttle: '1h', + }; + const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); + const firstRule = removeServerGeneratedProperties(firstRuleParsed); + + expect(firstRule).to.eql(outputRule1); + }); + + it('should be able to export 2 legacy actions on 2 rules', async () => { + // create 1st action/connector + const { body: hookAction1 } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create 2nd action/connector + const { body: hookAction2 } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create 2 rules without actions + const rule1 = await createRule(supertest, getSimpleRule('rule-1')); + const rule2 = await createRule(supertest, getSimpleRule('rule-2')); + + // attach the legacy notification with actions to the first rule + await supertest + .post(`/internal/api/detection/legacy/notifications?alert_id=${rule1.id}`) + .set('kbn-xsrf', 'true') + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: hookAction1.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction1.actionTypeId, + }, + { + id: hookAction2.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction2.actionTypeId, + }, + ], + }) + .expect(200); + + // attach the legacy notification with actions to the 2nd rule + await supertest + .post(`/internal/api/detection/legacy/notifications?alert_id=${rule2.id}`) + .set('kbn-xsrf', 'true') + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: hookAction1.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction1.actionTypeId, + }, + { + id: hookAction2.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction2.actionTypeId, + }, + ], + }) + .expect(200); + + // export the rule + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_export`) + .set('kbn-xsrf', 'true') + .send() + .expect(200) + .parse(binaryToString); + + const outputRule1: ReturnType = { + ...getSimpleRuleOutput('rule-1'), + actions: [ + { + group: 'default', + id: hookAction1.id, + action_type_id: hookAction1.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + { + group: 'default', + id: hookAction2.id, + action_type_id: hookAction2.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ], + throttle: '1h', + }; + + const outputRule2: ReturnType = { + ...getSimpleRuleOutput('rule-2'), + actions: [ + { + group: 'default', + id: hookAction1.id, + action_type_id: hookAction1.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + { + group: 'default', + id: hookAction2.id, + action_type_id: hookAction2.actionTypeId, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ], + throttle: '1h', + }; + const firstRuleParsed = JSON.parse(body.toString().split(/\n/)[0]); + const secondRuleParsed = JSON.parse(body.toString().split(/\n/)[1]); + const firstRule = removeServerGeneratedProperties(firstRuleParsed); + const secondRule = removeServerGeneratedProperties(secondRuleParsed); + + expect(firstRule).to.eql(outputRule2); + expect(secondRule).to.eql(outputRule1); + }); + }); }); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts index 30e1b3eef714a..2056d5648d6db 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts @@ -18,6 +18,7 @@ import { getComplexRuleOutput, getSimpleRule, getSimpleRuleOutput, + getWebHookAction, removeServerGeneratedProperties, } from '../../utils'; @@ -92,5 +93,164 @@ export default ({ getService }: FtrProviderContext): void => { total: 1, }); }); + + it('should find a single rule with a execute immediately action correctly', async () => { + // create connector/action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const action = { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }; + + // create rule with connector/action + const rule: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [action], + }; + await createRule(supertest, rule); + + // query the single rule from _find + const { body } = await supertest + .get(`${DETECTION_ENGINE_RULES_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + const ruleWithActions: ReturnType = { + ...getSimpleRuleOutput(), + actions: [action], + throttle: 'rule', + }; + + body.data = [removeServerGeneratedProperties(body.data[0])]; + expect(body).to.eql({ + data: [ruleWithActions], + page: 1, + perPage: 20, + total: 1, + }); + }); + + it('should be able to find a scheduled action correctly', async () => { + // create connector/action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const action = { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }; + + // create rule with connector/action + const rule: ReturnType = { + ...getSimpleRule('rule-1'), + throttle: '1h', // <-- throttle makes this a scheduled action + actions: [action], + }; + await createRule(supertest, rule); + + // query the single rule from _find + const { body } = await supertest + .get(`${DETECTION_ENGINE_RULES_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + const ruleWithActions: ReturnType = { + ...getSimpleRuleOutput(), + actions: [action], + throttle: '1h', // <-- throttle makes this a scheduled action + }; + + body.data = [removeServerGeneratedProperties(body.data[0])]; + expect(body).to.eql({ + data: [ruleWithActions], + page: 1, + perPage: 20, + total: 1, + }); + }); + + /** + * Tests the legacy actions to ensure we can export legacy notifications + * @deprecated Once the legacy notification system is removed, remove this test too. + */ + describe('legacy_notification_system', async () => { + it('should be able to a read a scheduled action correctly', async () => { + // create an connector/action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create a rule without actions + const createRuleBody = await createRule(supertest, getSimpleRule('rule-1')); + + // attach the legacy notification + await supertest + .post(`/internal/api/detection/legacy/notifications?alert_id=${createRuleBody.id}`) + .set('kbn-xsrf', 'true') + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: hookAction.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction.actionTypeId, + }, + ], + }) + .expect(200); + + // query the single rule from _find + const { body } = await supertest + .get(`${DETECTION_ENGINE_RULES_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + const ruleWithActions: ReturnType = { + ...getSimpleRuleOutput(), + actions: [ + { + id: hookAction.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + action_type_id: hookAction.actionTypeId, + }, + ], + throttle: '1h', + }; + + body.data = [removeServerGeneratedProperties(body.data[0])]; + expect(body).to.eql({ + data: [ruleWithActions], + page: 1, + perPage: 20, + total: 1, + }); + }); + }); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts index 99b267dbdb3f4..f99ae06b9f6e9 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts @@ -16,6 +16,7 @@ import { getSimpleRule, getSimpleRuleAsNdjson, getSimpleRuleOutput, + getWebHookAction, removeServerGeneratedProperties, ruleToNdjson, waitFor, @@ -369,6 +370,165 @@ export default ({ getService }: FtrProviderContext): void => { getSimpleRuleOutput('rule-3'), ]); }); + + it('should give single connector error back if we have a single connector error message', async () => { + const simpleRule: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [ + { + group: 'default', + id: '123', + action_type_id: '456', + params: {}, + }, + ], + }; + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_import`) + .set('kbn-xsrf', 'true') + .attach('file', ruleToNdjson(simpleRule), 'rules.ndjson') + .expect(200); + + expect(body).to.eql({ + success: false, + success_count: 0, + errors: [ + { + rule_id: 'rule-1', + error: { + status_code: 404, + message: '1 connector is missing. Connector id missing is: 123', + }, + }, + ], + }); + }); + + it('should be able to import a rule with an action connector that exists', async () => { + // create a new action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + const simpleRule: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [ + { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }, + ], + }; + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_import`) + .set('kbn-xsrf', 'true') + .attach('file', ruleToNdjson(simpleRule), 'rules.ndjson') + .expect(200); + expect(body).to.eql({ success: true, success_count: 1, errors: [] }); + }); + + it('should be able to import 2 rules with action connectors that exist', async () => { + // create a new action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const rule1: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [ + { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }, + ], + }; + + const rule2: ReturnType = { + ...getSimpleRule('rule-2'), + actions: [ + { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }, + ], + }; + const rule1String = JSON.stringify(rule1); + const rule2String = JSON.stringify(rule2); + const buffer = Buffer.from(`${rule1String}\n${rule2String}\n`); + + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_import`) + .set('kbn-xsrf', 'true') + .attach('file', buffer, 'rules.ndjson') + .expect(200); + + expect(body).to.eql({ success: true, success_count: 2, errors: [] }); + }); + + it('should be able to import 1 rule with an action connector that exists and get 1 other error back for a second rule that does not have the connector', async () => { + // create a new action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const rule1: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [ + { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }, + ], + }; + + const rule2: ReturnType = { + ...getSimpleRule('rule-2'), + actions: [ + { + group: 'default', + id: '123', // <-- This does not exist + action_type_id: hookAction.actionTypeId, + params: {}, + }, + ], + }; + const rule1String = JSON.stringify(rule1); + const rule2String = JSON.stringify(rule2); + const buffer = Buffer.from(`${rule1String}\n${rule2String}\n`); + + const { body } = await supertest + .post(`${DETECTION_ENGINE_RULES_URL}/_import`) + .set('kbn-xsrf', 'true') + .attach('file', buffer, 'rules.ndjson') + .expect(200); + + expect(body).to.eql({ + success: false, + success_count: 1, + errors: [ + { + rule_id: 'rule-2', + error: { + status_code: 404, + message: '1 connector is missing. Connector id missing is: 123', + }, + }, + ], + }); + }); }); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/index.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/index.ts index 00147a2ec2ef7..9993fda170fdf 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/index.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/index.ts @@ -19,6 +19,7 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./update_actions')); loadTestFile(require.resolve('./add_prepackaged_rules')); loadTestFile(require.resolve('./check_privileges')); + loadTestFile(require.resolve('./create_index')); loadTestFile(require.resolve('./create_rules')); loadTestFile(require.resolve('./create_rules_bulk')); loadTestFile(require.resolve('./create_index')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts index d20eb0492bbc4..6918dc7a1876f 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts @@ -21,6 +21,7 @@ import { getSimpleMlRuleOutput, createRule, getSimpleMlRule, + createLegacyRuleAction, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -187,6 +188,46 @@ export default ({ getService }: FtrProviderContext) => { expect(bodyToCompare).to.eql(outputRule); }); + it('should return the rule with migrated actions after the enable patch', async () => { + const [connector, rule] = await Promise.all([ + supertest + .post(`/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'My action', + connector_type_id: '.slack', + secrets: { + webhookUrl: 'http://localhost:1234', + }, + }), + createRule(supertest, getSimpleRule('rule-1')), + ]); + await createLegacyRuleAction(supertest, rule.id, connector.body.id); + + // patch disable the rule + const patchResponse = await supertest + .patch(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .send({ id: rule.id, enabled: false }) + .expect(200); + + const outputRule = getSimpleRuleOutput(); + outputRule.actions = [ + { + action_type_id: '.slack', + group: 'default', + id: connector.body.id, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ]; + outputRule.throttle = '1m'; + const bodyToCompare = removeServerGeneratedProperties(patchResponse.body); + expect(bodyToCompare).to.eql(outputRule); + }); + it('should give a 404 if it is given a fake id', async () => { const { body } = await supertest .patch(DETECTION_ENGINE_RULES_URL) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts index 74d3bc8dd68d3..bc388d73cac6b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts @@ -19,6 +19,7 @@ import { getSimpleRuleOutputWithoutRuleId, removeServerGeneratedPropertiesIncludingRuleId, createRule, + createLegacyRuleAction, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -126,6 +127,55 @@ export default ({ getService }: FtrProviderContext) => { expect(bodyToCompare2).to.eql(outputRule2); }); + it('should bulk disable two rules and migrate their actions', async () => { + const [connector, rule1, rule2] = await Promise.all([ + supertest + .post(`/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'My action', + connector_type_id: '.slack', + secrets: { + webhookUrl: 'http://localhost:1234', + }, + }), + createRule(supertest, getSimpleRule('rule-1')), + createRule(supertest, getSimpleRule('rule-2')), + ]); + await Promise.all([ + createLegacyRuleAction(supertest, rule1.id, connector.body.id), + createLegacyRuleAction(supertest, rule2.id, connector.body.id), + ]); + // patch a simple rule's name + const { body } = await supertest + .patch(`${DETECTION_ENGINE_RULES_URL}/_bulk_update`) + .set('kbn-xsrf', 'true') + .send([ + { id: rule1.id, enabled: false }, + { id: rule2.id, enabled: false }, + ]) + .expect(200); + + // @ts-expect-error + body.forEach((response) => { + const outputRule = getSimpleRuleOutput(response.rule_id, false); + outputRule.actions = [ + { + action_type_id: '.slack', + group: 'default', + id: connector.body.id, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ]; + outputRule.throttle = '1m'; + const bodyToCompare = removeServerGeneratedProperties(response); + expect(bodyToCompare).to.eql(outputRule); + }); + }); + it('should patch a single rule property of name using the auto-generated id', async () => { const createdBody = await createRule(supertest, getSimpleRule('rule-1')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts index 66a8459d0984c..0a51e6227cc9b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts @@ -18,6 +18,7 @@ import { getSimpleRuleOutput, getSimpleRuleOutputWithoutRuleId, getSimpleRuleWithoutRuleId, + getWebHookAction, removeServerGeneratedProperties, removeServerGeneratedPropertiesIncludingRuleId, } from '../../utils'; @@ -101,6 +102,146 @@ export default ({ getService }: FtrProviderContext) => { message: 'rule_id: "fake_id" not found', }); }); + + it('should be able to a read a execute immediately action correctly', async () => { + // create connector/action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const action = { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }; + + // create rule with connector/action + const rule: ReturnType = { + ...getSimpleRule('rule-1'), + actions: [action], + }; + const createRuleBody = await createRule(supertest, rule); + + const { body } = await supertest + .get(`${DETECTION_ENGINE_RULES_URL}?id=${createRuleBody.id}`) + .set('kbn-xsrf', 'true') + .send(getSimpleRule()) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body); + const ruleWithActions: ReturnType = { + ...getSimpleRuleOutput(), + actions: [action], + throttle: 'rule', + }; + expect(bodyToCompare).to.eql(ruleWithActions); + }); + + it('should be able to a read a scheduled action correctly', async () => { + // create connector/action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + const action = { + group: 'default', + id: hookAction.id, + action_type_id: hookAction.actionTypeId, + params: {}, + }; + + // create rule with connector/action + const rule: ReturnType = { + ...getSimpleRule('rule-1'), + throttle: '1h', // <-- throttle makes this a scheduled action + actions: [action], + }; + + const createRuleBody = await createRule(supertest, rule); + + const { body } = await supertest + .get(`${DETECTION_ENGINE_RULES_URL}?id=${createRuleBody.id}`) + .set('kbn-xsrf', 'true') + .send(getSimpleRule()) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body); + const ruleWithActions: ReturnType = { + ...getSimpleRuleOutput(), + actions: [action], + throttle: '1h', // <-- throttle makes this a scheduled action + }; + expect(bodyToCompare).to.eql(ruleWithActions); + }); + + /** + * Tests the legacy actions to ensure we can export legacy notifications + * @deprecated Once the legacy notification system is removed, remove this test too. + */ + describe('legacy_notification_system', () => { + it('should be able to a read a scheduled action correctly', async () => { + // create an action + const { body: hookAction } = await supertest + .post('/api/actions/action') + .set('kbn-xsrf', 'true') + .send(getWebHookAction()) + .expect(200); + + // create a rule without actions + const createRuleBody = await createRule(supertest, getSimpleRule('rule-1')); + + // attach the legacy notification + await supertest + .post(`/internal/api/detection/legacy/notifications?alert_id=${createRuleBody.id}`) + .set('kbn-xsrf', 'true') + .send({ + name: 'Legacy notification with one action', + interval: '1h', + actions: [ + { + id: hookAction.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: hookAction.actionTypeId, + }, + ], + }) + .expect(200); + + // read the rule which should have the legacy actions attached + const { body } = await supertest + .get(`${DETECTION_ENGINE_RULES_URL}?id=${createRuleBody.id}`) + .set('kbn-xsrf', 'true') + .send(getSimpleRule()) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body); + const ruleWithActions: ReturnType = { + ...getSimpleRuleOutput(), + actions: [ + { + id: hookAction.id, + group: 'default', + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + action_type_id: hookAction.actionTypeId, + }, + ], + throttle: '1h', + }; + expect(bodyToCompare).to.eql(ruleWithActions); + }); + }); }); }); }; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts index 528a99715c05c..293f3e758911e 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts @@ -53,7 +53,9 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); - const hits = signalsOpen.hits.hits.map((signal) => (signal._source?.host as Runtime).name); + const hits = signalsOpen.hits.hits + .map((signal) => (signal._source?.host as Runtime).name) + .sort(); expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); @@ -63,9 +65,9 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); - const hits = signalsOpen.hits.hits.map( - (signal) => (signal._source?.host as Runtime).hostname - ); + const hits = signalsOpen.hits.hits + .map((signal) => (signal._source?.host as Runtime).hostname) + .sort(); expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); }); @@ -97,7 +99,16 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); - const hits = signalsOpen.hits.hits.map((signal) => signal._source?.host); + const hits = signalsOpen.hits.hits + .map((signal) => signal._source?.host as Array<{ name: string }>) + .map((host) => { + // sort the inner array elements first + return host.sort((a, b) => a.name.localeCompare(b.name)); + }) + .sort((aArray, bArray) => { + // since these are all unique, using just the first element should give us stability + return aArray[0].name.localeCompare(bArray[0].name); + }); expect(hits).to.eql([ [ { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts index 5a4a04f71b3d5..2b91e0c3abd55 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts @@ -23,6 +23,7 @@ import { getSimpleMlRuleUpdate, createRule, getSimpleRule, + createLegacyRuleAction, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -130,6 +131,55 @@ export default ({ getService }: FtrProviderContext) => { expect(bodyToCompare).to.eql(outputRule); }); + it('should update a single rule property of name using an auto-generated rule_id and migrate the actions', async () => { + const rule = getSimpleRule('rule-1'); + delete rule.rule_id; + const [connector, createRuleBody] = await Promise.all([ + supertest + .post(`/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'My action', + connector_type_id: '.slack', + secrets: { + webhookUrl: 'http://localhost:1234', + }, + }), + createRule(supertest, rule), + ]); + await createLegacyRuleAction(supertest, createRuleBody.id, connector.body.id); + + // update a simple rule's name + const updatedRule = getSimpleRuleUpdate('rule-1'); + updatedRule.rule_id = createRuleBody.rule_id; + updatedRule.name = 'some other name'; + delete updatedRule.id; + + const { body } = await supertest + .put(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .send(updatedRule) + .expect(200); + + const outputRule = getSimpleRuleOutputWithoutRuleId(); + outputRule.name = 'some other name'; + outputRule.version = 2; + outputRule.actions = [ + { + action_type_id: '.slack', + group: 'default', + id: connector.body.id, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ]; + outputRule.throttle = '1m'; + const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body); + expect(bodyToCompare).to.eql(outputRule); + }); + it('should update a single rule property of name using the auto-generated id', async () => { const createdBody = await createRule(supertest, getSimpleRule('rule-1')); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts index 7612aafb5bb60..d950b30d584af 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts @@ -20,6 +20,7 @@ import { getSimpleRuleUpdate, createRule, getSimpleRule, + createLegacyRuleAction, } from '../../utils'; // eslint-disable-next-line import/no-default-export @@ -94,6 +95,64 @@ export default ({ getService }: FtrProviderContext) => { expect(bodyToCompare2).to.eql(outputRule2); }); + it('should update two rule properties of name using the two rules rule_id and migrate actions', async () => { + const [connector, rule1, rule2] = await Promise.all([ + supertest + .post(`/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'My action', + connector_type_id: '.slack', + secrets: { + webhookUrl: 'http://localhost:1234', + }, + }), + createRule(supertest, getSimpleRule('rule-1')), + createRule(supertest, getSimpleRule('rule-2')), + ]); + await Promise.all([ + createLegacyRuleAction(supertest, rule1.id, connector.body.id), + createLegacyRuleAction(supertest, rule2.id, connector.body.id), + ]); + + expect(rule1.actions).to.eql([]); + expect(rule2.actions).to.eql([]); + + const updatedRule1 = getSimpleRuleUpdate('rule-1'); + updatedRule1.name = 'some other name'; + + const updatedRule2 = getSimpleRuleUpdate('rule-2'); + updatedRule2.name = 'some other name'; + + // update both rule names + const { body } = await supertest + .put(`${DETECTION_ENGINE_RULES_URL}/_bulk_update`) + .set('kbn-xsrf', 'true') + .send([updatedRule1, updatedRule2]) + .expect(200); + + // @ts-expect-error + body.forEach((response) => { + const outputRule = getSimpleRuleOutput(response.rule_id); + outputRule.name = 'some other name'; + outputRule.version = 2; + outputRule.actions = [ + { + action_type_id: '.slack', + group: 'default', + id: connector.body.id, + params: { + message: + 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + }, + ]; + outputRule.throttle = '1m'; + const bodyToCompare = removeServerGeneratedProperties(response); + expect(bodyToCompare).to.eql(outputRule); + }); + }); + it('should update a single rule property of name using an id', async () => { const createRuleBody = await createRule(supertest, getSimpleRule('rule-1')); diff --git a/x-pack/test/detection_engine_api_integration/utils.ts b/x-pack/test/detection_engine_api_integration/utils.ts index dd1b1ba966175..8a0db6166bb99 100644 --- a/x-pack/test/detection_engine_api_integration/utils.ts +++ b/x-pack/test/detection_engine_api_integration/utils.ts @@ -48,6 +48,7 @@ import { DETECTION_ENGINE_SIGNALS_MIGRATION_URL, INTERNAL_IMMUTABLE_KEY, INTERNAL_RULE_ID_KEY, + UPDATE_OR_CREATE_LEGACY_ACTIONS, } from '../../plugins/security_solution/common/constants'; /** @@ -413,17 +414,12 @@ export const getSimpleMlRuleOutput = (ruleId = 'rule-1'): Partial = * @param supertest The supertest agent. */ export const deleteAllAlerts = async ( - supertest: SuperTest.SuperTest, - space?: string + supertest: SuperTest.SuperTest ): Promise => { await countDownTest( async () => { const { body } = await supertest - .get( - space - ? `/s/${space}${DETECTION_ENGINE_RULES_URL}/_find?per_page=9999` - : `${DETECTION_ENGINE_RULES_URL}/_find?per_page=9999` - ) + .get(`${DETECTION_ENGINE_RULES_URL}/_find?per_page=9999`) .set('kbn-xsrf', 'true') .send(); @@ -432,11 +428,7 @@ export const deleteAllAlerts = async ( })); await supertest - .post( - space - ? `/s/${space}${DETECTION_ENGINE_RULES_URL}/_bulk_delete` - : `${DETECTION_ENGINE_RULES_URL}/_bulk_delete` - ) + .post(`${DETECTION_ENGINE_RULES_URL}/_bulk_delete`) .send(ids) .set('kbn-xsrf', 'true'); @@ -518,6 +510,29 @@ export const createSignalsIndex = async ( }, 'createSignalsIndex'); }; +export const createLegacyRuleAction = async ( + supertest: SuperTest.SuperTest, + alertId: string, + connectorId: string +): Promise => + supertest + .post(`${UPDATE_OR_CREATE_LEGACY_ACTIONS}`) + .set('kbn-xsrf', 'true') + .query({ alert_id: alertId }) + .send({ + name: 'Legacy notification with one action', + interval: '1m', + actions: [ + { + id: connectorId, + group: 'default', + params: { + message: 'Hourly\nRule {{context.rule.name}} generated {{state.signals_count}} alerts', + }, + actionTypeId: '.slack', + }, + ], + }); /** * Deletes the signals index for use inside of afterEach blocks of tests * @param supertest The supertest client library @@ -899,8 +914,10 @@ export const countDownTest = async ( }; /** - * Helper to cut down on the noise in some of the tests. This checks for - * an expected 200 still and does not try to any retries. + * Helper to cut down on the noise in some of the tests. If this detects + * a conflict it will try to manually remove the rule before re-adding the rule one time and log + * and error about the race condition. + * rule a second attempt. It only re-tries adding the rule if it encounters a conflict once. * @param supertest The supertest deps * @param rule The rule to create */ @@ -908,17 +925,71 @@ export const createRule = async ( supertest: SuperTest.SuperTest, rule: CreateRulesSchema ): Promise => { - const { body } = await supertest + const response = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .send(rule) - .expect(200); - return body; + .send(rule); + if (response.status === 409) { + if (rule.rule_id != null) { + // eslint-disable-next-line no-console + console.log( + `When creating a rule found an unexpected conflict (409), will attempt a cleanup and one time re-try. This usually indicates a bad cleanup or race condition within the tests: ${JSON.stringify( + response.body + )}` + ); + await deleteRule(supertest, rule.rule_id); + const secondResponseTry = await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .send(rule); + if (secondResponseTry.status !== 200) { + throw new Error( + `Unexpected non 200 ok when attempting to create a rule (second try): ${JSON.stringify( + response.body + )}` + ); + } else { + return secondResponseTry.body; + } + } else { + throw new Error('When creating a rule found an unexpected conflict (404)'); + } + } else if (response.status !== 200) { + throw new Error( + `Unexpected non 200 ok when attempting to create a rule: ${JSON.stringify(response.status)}` + ); + } else { + return response.body; + } }; /** - * Helper to cut down on the noise in some of the tests. This checks for - * an expected 200 still and does not try to any retries. + * Helper to cut down on the noise in some of the tests. Does a delete of a rule. + * It does not check for a 200 "ok" on this. + * @param supertest The supertest deps + * @param id The rule id to delete + */ +export const deleteRule = async ( + supertest: SuperTest.SuperTest, + ruleId: string +): Promise => { + const response = await supertest + .delete(`${DETECTION_ENGINE_RULES_URL}?rule_id=${ruleId}`) + .set('kbn-xsrf', 'true'); + if (response.status !== 200) { + // eslint-disable-next-line no-console + console.log( + `Did not get an expected 200 "ok" when deleting the rule. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( + response.body + )}, status: ${JSON.stringify(response.status)}` + ); + } + + return response.body; +}; + +/** + * Helper to cut down on the noise in some of the tests. * @param supertest The supertest deps * @param rule The rule to create */ @@ -1017,12 +1088,70 @@ export const createExceptionList = async ( supertest: SuperTest.SuperTest, exceptionList: CreateExceptionListSchema ): Promise => { - const { body } = await supertest + const response = await supertest .post(EXCEPTION_LIST_URL) .set('kbn-xsrf', 'true') - .send(exceptionList) - .expect(200); - return body; + .send(exceptionList); + + if (response.status === 409) { + if (exceptionList.list_id != null) { + // eslint-disable-next-line no-console + console.log( + `When creating an exception list found an unexpected conflict (409), will attempt a cleanup and one time re-try. This usually indicates a bad cleanup or race condition within the tests: ${JSON.stringify( + response.body + )}` + ); + await deleteExceptionList(supertest, exceptionList.list_id); + const secondResponseTry = await supertest + .post(EXCEPTION_LIST_URL) + .set('kbn-xsrf', 'true') + .send(exceptionList); + if (secondResponseTry.status !== 200) { + throw new Error( + `Unexpected non 200 ok when attempting to create an exception list (second try): ${JSON.stringify( + response.body + )}` + ); + } else { + return secondResponseTry.body; + } + } else { + throw new Error('When creating an exception list found an unexpected conflict (404)'); + } + } else if (response.status !== 200) { + throw new Error( + `Unexpected non 200 ok when attempting to create an exception list: ${JSON.stringify( + response.status + )}` + ); + } else { + return response.body; + } +}; + +/** + * Helper to cut down on the noise in some of the tests. Does a delete of an exception list. + * It does not check for a 200 "ok" on this. + * @param supertest The supertest deps + * @param id The rule id to delete + */ +export const deleteExceptionList = async ( + supertest: SuperTest.SuperTest, + listId: string +): Promise => { + const response = await supertest + .delete(`${EXCEPTION_LIST_URL}?list_id=${listId}`) + .set('kbn-xsrf', 'true'); + if (response.status !== 200) { + // eslint-disable-next-line no-console + console.log( + `Did not get an expected 200 "ok" when deleting an exception list. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( + response.body + )}, status: ${JSON.stringify(response.status)}` + ); + } + + return response.body; }; /** @@ -1035,12 +1164,20 @@ export const createExceptionListItem = async ( supertest: SuperTest.SuperTest, exceptionListItem: CreateExceptionListItemSchema ): Promise => { - const { body } = await supertest + const response = await supertest .post(EXCEPTION_LIST_ITEM_URL) .set('kbn-xsrf', 'true') - .send(exceptionListItem) - .expect(200); - return body; + .send(exceptionListItem); + + if (response.status !== 200) { + // eslint-disable-next-line no-console + console.log( + `Did not get an expected 200 "ok" when creating an exception list item. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( + response.body + )}, status: ${JSON.stringify(response.status)}` + ); + } + return response.body; }; /** diff --git a/x-pack/test/examples/config.ts b/x-pack/test/examples/config.ts index 606f97f9c3de7..cf37cad5bc243 100644 --- a/x-pack/test/examples/config.ts +++ b/x-pack/test/examples/config.ts @@ -33,7 +33,11 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { reportName: 'X-Pack Example plugin functional tests', }, - testFiles: [require.resolve('./search_examples'), require.resolve('./embedded_lens')], + testFiles: [ + require.resolve('./search_examples'), + require.resolve('./embedded_lens'), + require.resolve('./reporting_examples'), + ], kbnTestServer: { ...xpackFunctionalConfig.get('kbnTestServer'), diff --git a/x-pack/test/examples/reporting_examples/capture_test.ts b/x-pack/test/examples/reporting_examples/capture_test.ts new file mode 100644 index 0000000000000..62460bd140bba --- /dev/null +++ b/x-pack/test/examples/reporting_examples/capture_test.ts @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import path from 'path'; +import type { FtrProviderContext } from '../../functional/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'reporting']); + const compareImages = getService('compareImages'); + const testSubjects = getService('testSubjects'); + + const appId = 'reportingExample'; + + const fixtures = { + baselineAPng: path.resolve(__dirname, 'fixtures/baseline/capture_a.png'), + baselineAPdf: path.resolve(__dirname, 'fixtures/baseline/capture_a.pdf'), + baselineAPdfPrint: path.resolve(__dirname, 'fixtures/baseline/capture_a_print.pdf'), + }; + + describe('Captures', () => { + it('PNG that matches the baseline', async () => { + await PageObjects.common.navigateToApp(appId); + + await (await testSubjects.find('shareButton')).click(); + await (await testSubjects.find('captureTestPanel')).click(); + await (await testSubjects.find('captureTestPNG')).click(); + + await PageObjects.reporting.clickGenerateReportButton(); + const url = await PageObjects.reporting.getReportURL(60000); + const captureData = await PageObjects.reporting.getRawPdfReportData(url); + + const pngSessionFilePath = await compareImages.writeToSessionFile( + 'capture_test_baseline_a', + captureData + ); + + expect( + await compareImages.checkIfPngsMatch(pngSessionFilePath, fixtures.baselineAPng) + ).to.be.lessThan(0.09); + }); + + it('PDF that matches the baseline', async () => { + await PageObjects.common.navigateToApp(appId); + + await (await testSubjects.find('shareButton')).click(); + await (await testSubjects.find('captureTestPanel')).click(); + await (await testSubjects.find('captureTestPDF')).click(); + + await PageObjects.reporting.clickGenerateReportButton(); + const url = await PageObjects.reporting.getReportURL(60000); + const captureData = await PageObjects.reporting.getRawPdfReportData(url); + + const pdfSessionFilePath = await compareImages.writeToSessionFile( + 'capture_test_baseline_a', + captureData + ); + + expect( + await compareImages.checkIfPdfsMatch(pdfSessionFilePath, fixtures.baselineAPdf) + ).to.be.lessThan(0.001); + }); + + it('print-optimized PDF that matches the baseline', async () => { + await PageObjects.common.navigateToApp(appId); + + await (await testSubjects.find('shareButton')).click(); + await (await testSubjects.find('captureTestPanel')).click(); + await (await testSubjects.find('captureTestPDFPrint')).click(); + + await PageObjects.reporting.checkUsePrintLayout(); + await PageObjects.reporting.clickGenerateReportButton(); + const url = await PageObjects.reporting.getReportURL(60000); + const captureData = await PageObjects.reporting.getRawPdfReportData(url); + + const pdfSessionFilePath = await compareImages.writeToSessionFile( + 'capture_test_baseline_a', + captureData + ); + + expect( + await compareImages.checkIfPdfsMatch(pdfSessionFilePath, fixtures.baselineAPdfPrint) + ).to.be.lessThan(0.001); + }); + }); +} diff --git a/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a.pdf b/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a.pdf new file mode 100644 index 0000000000000..3966d4406b7b2 Binary files /dev/null and b/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a.pdf differ diff --git a/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a.png b/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a.png new file mode 100644 index 0000000000000..7c121804e4296 Binary files /dev/null and b/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a.png differ diff --git a/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a_print.pdf b/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a_print.pdf new file mode 100644 index 0000000000000..9036a87c6397c Binary files /dev/null and b/x-pack/test/examples/reporting_examples/fixtures/baseline/capture_a_print.pdf differ diff --git a/x-pack/test/examples/reporting_examples/index.ts b/x-pack/test/examples/reporting_examples/index.ts new file mode 100644 index 0000000000000..a0e8689a26586 --- /dev/null +++ b/x-pack/test/examples/reporting_examples/index.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 { PluginFunctionalProviderContext } from 'test/plugin_functional/services'; + +// eslint-disable-next-line import/no-default-export +export default function ({ loadTestFile }: PluginFunctionalProviderContext) { + describe('reporting examples', function () { + this.tags('ciGroup13'); + + loadTestFile(require.resolve('./capture_test')); + }); +} diff --git a/x-pack/test/fleet_api_integration/apis/epm/template.ts b/x-pack/test/fleet_api_integration/apis/epm/template.ts index 517d2c77d430d..2ea70ed743832 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/template.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/template.ts @@ -28,7 +28,7 @@ export default function ({ getService }: FtrProviderContext) { }, ]; - // This test was inspired by https://github.com/elastic/kibana/blob/master/x-pack/test/api_integration/apis/monitoring/common/mappings_exist.js + // This test was inspired by https://github.com/elastic/kibana/blob/main/x-pack/test/api_integration/apis/monitoring/common/mappings_exist.js describe('EPM - template', async () => { beforeEach(async () => { appContextService.start({ diff --git a/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts b/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts index 7cfdf87aaf9ea..6f6d29db1ef0c 100644 --- a/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts +++ b/x-pack/test/functional/apps/apm/feature_controls/apm_security.ts @@ -64,6 +64,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const navLinks = await appsMenu.readLinks(); expect(navLinks.map((link) => link.text)).to.eql([ 'Overview', + 'Alerts', 'APM', 'User Experience', 'Stack Management', @@ -116,7 +117,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows apm navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Overview', 'APM', 'User Experience', 'Stack Management']); + expect(navLinks).to.eql([ + 'Overview', + 'Alerts', + 'APM', + 'User Experience', + 'Stack Management', + ]); }); it('can navigate to APM app', async () => { diff --git a/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts b/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts index 5b80f6589281a..1575948610566 100644 --- a/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts +++ b/x-pack/test/functional/apps/dev_tools/feature_controls/dev_tools_security.ts @@ -192,7 +192,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('no dev_tools privileges', () => { + // FLAKY: https://github.com/elastic/kibana/issues/113080 + describe.skip('no dev_tools privileges', () => { before(async () => { await security.role.create('no_dev_tools_privileges_role', { kibana: [ diff --git a/x-pack/test/functional/apps/discover/saved_searches.ts b/x-pack/test/functional/apps/discover/saved_searches.ts index 16deecde2b0ba..f2abc6b350e5b 100644 --- a/x-pack/test/functional/apps/discover/saved_searches.ts +++ b/x-pack/test/functional/apps/discover/saved_searches.ts @@ -31,6 +31,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }; // Failing: See https://github.com/elastic/kibana/issues/104578 + // FLAKY: https://github.com/elastic/kibana/issues/114002 describe.skip('Discover Saved Searches', () => { before('initialize tests', async () => { await esArchiver.load('x-pack/test/functional/es_archives/reporting/ecommerce'); diff --git a/x-pack/test/functional/apps/discover/value_suggestions_non_timebased.ts b/x-pack/test/functional/apps/discover/value_suggestions_non_timebased.ts index cfddd33f4197e..e8cc34604eaba 100644 --- a/x-pack/test/functional/apps/discover/value_suggestions_non_timebased.ts +++ b/x-pack/test/functional/apps/discover/value_suggestions_non_timebased.ts @@ -13,7 +13,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const queryBar = getService('queryBar'); const PageObjects = getPageObjects(['common', 'settings', 'context']); - describe('value suggestions non time based', function describeIndexTests() { + // FLAKY: https://github.com/elastic/kibana/issues/114745 + describe.skip('value suggestions non time based', function describeIndexTests() { before(async function () { await esArchiver.loadIfNeeded( 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' diff --git a/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts b/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts index c51e2968baee0..3f313d178c116 100644 --- a/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts +++ b/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts @@ -9,6 +9,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; const policyName = 'testPolicy1'; +const repoName = 'test'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'indexLifecycleManagement']); @@ -18,9 +19,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Home page', function () { before(async () => { + await esClient.snapshot.createRepository({ + repository: repoName, + body: { + type: 'fs', + settings: { + // use one of the values defined in path.repo in test/functional/config.js + location: '/tmp/', + }, + }, + verify: false, + }); await pageObjects.common.navigateToApp('indexLifecycleManagement'); }); after(async () => { + await esClient.snapshot.deleteRepository({ repository: repoName }); // @ts-expect-error @elastic/elasticsearch DeleteSnapshotLifecycleRequest.policy_id is required await esClient.ilm.deleteLifecycle({ policy: policyName }); }); @@ -41,6 +54,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { coldEnabled: true, frozenEnabled: true, deleteEnabled: true, + snapshotRepository: repoName, }); await retry.waitFor('navigation back to home page.', async () => { diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts index 851bba85becc0..1eb471047a2cb 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts @@ -62,7 +62,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows metrics navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Overview', 'Metrics', 'Stack Management']); + expect(navLinks).to.eql(['Overview', 'Alerts', 'Metrics', 'Stack Management']); }); describe('infrastructure landing page without data', () => { @@ -159,7 +159,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows metrics navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Overview', 'Metrics', 'Stack Management']); + expect(navLinks).to.eql(['Overview', 'Alerts', 'Metrics', 'Stack Management']); }); describe('infrastructure landing page without data', () => { diff --git a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts index d120a6c582c7b..d4f56ee3c9b9b 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts @@ -59,7 +59,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows logs navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Overview', 'Logs', 'Stack Management']); + expect(navLinks).to.eql(['Overview', 'Alerts', 'Logs', 'Stack Management']); }); describe('logs landing page without data', () => { @@ -121,7 +121,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows logs navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Overview', 'Logs', 'Stack Management']); + expect(navLinks).to.eql(['Overview', 'Alerts', 'Logs', 'Stack Management']); }); describe('logs landing page without data', () => { diff --git a/x-pack/test/functional/apps/lens/rollup.ts b/x-pack/test/functional/apps/lens/rollup.ts index 34620a734cfd7..267c83cda1386 100644 --- a/x-pack/test/functional/apps/lens/rollup.ts +++ b/x-pack/test/functional/apps/lens/rollup.ts @@ -14,7 +14,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const listingTable = getService('listingTable'); const esArchiver = getService('esArchiver'); - describe('lens rollup tests', () => { + // FAILING: https://github.com/elastic/kibana/issues/84957 + describe.skip('lens rollup tests', () => { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/lens/rollup/data'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/lens/rollup/config'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/annotations.ts b/x-pack/test/functional/apps/ml/anomaly_detection/annotations.ts index e6218b9853dfd..f0d0b898aefc1 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/annotations.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/annotations.ts @@ -262,55 +262,5 @@ export default function ({ getService }: FtrProviderContext) { await ml.jobAnnotations.assertAnnotationsRowMissing(annotationId); }); }); - - describe('with errors', function () { - before(async () => { - // Points the read/write aliases of annotations to an index with wrong mappings - // so we can simulate errors when requesting annotations. - await ml.testResources.setupBrokenAnnotationsIndexState(jobId); - }); - - it('displays error on broken annotation index and recovers after fix', async () => { - await ml.testExecution.logTestStep('loads from job list row link'); - await ml.navigation.navigateToMl(); - await ml.navigation.navigateToJobManagement(); - - await ml.jobTable.waitForJobsToLoad(); - await ml.jobTable.filterWithSearchString(jobId, 1); - - await ml.jobTable.clickOpenJobInSingleMetricViewerButton(jobId); - await ml.commonUI.waitForMlLoadingIndicatorToDisappear(); - - await ml.testExecution.logTestStep( - 'should display the annotations section showing an error' - ); - await ml.singleMetricViewer.assertAnnotationsExists('error'); - - await ml.testExecution.logTestStep('should navigate to anomaly explorer'); - await ml.navigation.navigateToAnomalyExplorerViaSingleMetricViewer(); - - await ml.testExecution.logTestStep( - 'should display the annotations section showing an error' - ); - await ml.anomalyExplorer.assertAnnotationsPanelExists('error'); - - await ml.testExecution.logTestStep( - 'should display the annotations section without an error' - ); - // restores the aliases to point to the original working annotations index - // so we can run tests against successfully loaded annotations sections. - await ml.testResources.restoreAnnotationsIndexState(); - await ml.anomalyExplorer.refreshPage(); - await ml.anomalyExplorer.assertAnnotationsPanelExists('loaded'); - - await ml.testExecution.logTestStep('should navigate to single metric viewer'); - await ml.navigation.navigateToSingleMetricViewerViaAnomalyExplorer(); - - await ml.testExecution.logTestStep( - 'should display the annotations section without an error' - ); - await ml.singleMetricViewer.assertAnnotationsExists('loaded'); - }); - }); }); } diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/forecasts.ts b/x-pack/test/functional/apps/ml/anomaly_detection/forecasts.ts new file mode 100644 index 0000000000000..f65653e2c03c5 --- /dev/null +++ b/x-pack/test/functional/apps/ml/anomaly_detection/forecasts.ts @@ -0,0 +1,116 @@ +/* + * Copyright 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'; +import { Job, Datafeed } from '../../../../../plugins/ml/common/types/anomaly_detection_jobs'; + +// @ts-expect-error not full interface +const JOB_CONFIG: Job = { + job_id: `fq_single_1_smv`, + description: 'count() on farequote dataset with 15m bucket span', + groups: ['farequote', 'automated', 'single-metric'], + analysis_config: { + bucket_span: '15m', + influencers: [], + detectors: [ + { + function: 'count', + }, + ], + }, + data_description: { time_field: '@timestamp' }, + analysis_limits: { model_memory_limit: '10mb' }, + model_plot_config: { enabled: true }, +}; + +// @ts-expect-error not full interface +const DATAFEED_CONFIG: Datafeed = { + datafeed_id: 'datafeed-fq_single_1_smv', + indices: ['ft_farequote'], + job_id: 'fq_single_1_smv', + query: { bool: { must: [{ match_all: {} }] } }, +}; + +export default function ({ getService }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const ml = getService('ml'); + + describe('forecasts', function () { + this.tags(['mlqa']); + + describe('with single metric job', function () { + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.setKibanaTimeZoneToUTC(); + + await ml.api.createAndRunAnomalyDetectionLookbackJob(JOB_CONFIG, DATAFEED_CONFIG); + await ml.securityUI.loginAsMlPowerUser(); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it('opens a job from job list link', async () => { + await ml.testExecution.logTestStep('navigate to job list'); + await ml.navigation.navigateToMl(); + await ml.navigation.navigateToJobManagement(); + + await ml.testExecution.logTestStep('open job in single metric viewer'); + await ml.jobTable.waitForJobsToLoad(); + await ml.jobTable.filterWithSearchString(JOB_CONFIG.job_id, 1); + + await ml.jobTable.clickOpenJobInSingleMetricViewerButton(JOB_CONFIG.job_id); + await ml.commonUI.waitForMlLoadingIndicatorToDisappear(); + }); + + it('displays job results', async () => { + await ml.testExecution.logTestStep('pre-fills the job selection'); + await ml.jobSelection.assertJobSelection([JOB_CONFIG.job_id]); + + await ml.testExecution.logTestStep('pre-fills the detector input'); + await ml.singleMetricViewer.assertDetectorInputExist(); + await ml.singleMetricViewer.assertDetectorInputValue('0'); + + await ml.testExecution.logTestStep('displays the chart'); + await ml.singleMetricViewer.assertChartExist(); + + await ml.testExecution.logTestStep('should not display the forecasts toggle checkbox'); + await ml.forecast.assertForecastCheckboxMissing(); + + await ml.testExecution.logTestStep('should open the forecasts modal'); + await ml.forecast.assertForecastButtonExists(); + await ml.forecast.assertForecastButtonEnabled(true); + await ml.forecast.openForecastModal(); + await ml.forecast.assertForecastModalRunButtonEnabled(true); + + await ml.testExecution.logTestStep('should run the forecast and close the modal'); + await ml.forecast.clickForecastModalRunButton(); + + await ml.testExecution.logTestStep('should display the forecasts toggle checkbox'); + await ml.forecast.assertForecastCheckboxExists(); + + await ml.testExecution.logTestStep( + 'should display the forecast in the single metric chart' + ); + await ml.forecast.assertForecastChartElementsExists(); + + await ml.testExecution.logTestStep('should hide the forecast in the single metric chart'); + await ml.forecast.clickForecastCheckbox(); + await ml.forecast.assertForecastChartElementsHidden(); + + await ml.testExecution.logTestStep('should open the forecasts modal and list the forecast'); + await ml.forecast.assertForecastButtonExists(); + await ml.forecast.assertForecastButtonEnabled(true); + await ml.forecast.openForecastModal(); + await ml.forecast.assertForecastTableExists(); + await ml.forecast.assertForecastTableNotEmpty(); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/index.ts b/x-pack/test/functional/apps/ml/anomaly_detection/index.ts index d87da8469db11..ed5f618f86644 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/index.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/index.ts @@ -24,5 +24,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./annotations')); loadTestFile(require.resolve('./aggregated_scripted_job')); loadTestFile(require.resolve('./custom_urls')); + loadTestFile(require.resolve('./forecasts')); }); } diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts index 04bc12687a3b3..c00eb1c9e5cba 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts @@ -53,7 +53,7 @@ export default function ({ getService }: FtrProviderContext) { // tick/grid/axis { color: '#DDDDDD', percentage: 50 }, // line - { color: '#98A2B3', percentage: 30 }, + { color: '#98A2B3', percentage: 10 }, ], scatterplotMatrixColorStats: [ // marker colors diff --git a/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts b/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts index 86cdc84f86d76..6591d5d03d08c 100644 --- a/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts +++ b/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts @@ -237,11 +237,11 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep( 'should display the forecast modal with enabled run button' ); - await ml.singleMetricViewer.assertForecastButtonExists(); - await ml.singleMetricViewer.assertForecastButtonEnabled(true); - await ml.singleMetricViewer.openForecastModal(); - await ml.singleMetricViewer.assertForecastModalRunButtonEnabled(true); - await ml.singleMetricViewer.closeForecastModal(); + await ml.forecast.assertForecastButtonExists(); + await ml.forecast.assertForecastButtonEnabled(true); + await ml.forecast.openForecastModal(); + await ml.forecast.assertForecastModalRunButtonEnabled(true); + await ml.forecast.closeForecastModal(); }); it('should display elements on Anomaly Explorer page correctly', async () => { diff --git a/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts b/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts index 920d82ed381c0..d94e70897a63a 100644 --- a/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts +++ b/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts @@ -230,11 +230,11 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep( 'should display the forecast modal with disabled run button' ); - await ml.singleMetricViewer.assertForecastButtonExists(); - await ml.singleMetricViewer.assertForecastButtonEnabled(true); - await ml.singleMetricViewer.openForecastModal(); - await ml.singleMetricViewer.assertForecastModalRunButtonEnabled(false); - await ml.singleMetricViewer.closeForecastModal(); + await ml.forecast.assertForecastButtonExists(); + await ml.forecast.assertForecastButtonEnabled(true); + await ml.forecast.openForecastModal(); + await ml.forecast.assertForecastModalRunButtonEnabled(false); + await ml.forecast.closeForecastModal(); }); it('should display elements on Anomaly Explorer page correctly', async () => { diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js index 07fda7a143a99..6b1658dd9ed0e 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }) { const nodesList = getService('monitoringElasticsearchNodes'); const nodeDetail = getService('monitoringElasticsearchNodeDetail'); - // FLAKY https://github.com/elastic/kibana/issues/115130 - describe.skip('Elasticsearch node detail', () => { + describe('Elasticsearch node detail', () => { describe('Active Nodes', () => { const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js index 70c9b42b37f42..9130ce91e7b4d 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }) { const nodesList = getService('monitoringElasticsearchNodes'); const nodeDetail = getService('monitoringElasticsearchNodeDetail'); - // Failing: See https://github.com/elastic/kibana/issues/115255 - describe.skip('Elasticsearch node detail mb', () => { + describe('Elasticsearch node detail mb', () => { describe('Active Nodes', () => { const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); diff --git a/x-pack/test/functional/apps/monitoring/index.js b/x-pack/test/functional/apps/monitoring/index.js index 6a5b6ea813171..63292bde5e2bf 100644 --- a/x-pack/test/functional/apps/monitoring/index.js +++ b/x-pack/test/functional/apps/monitoring/index.js @@ -34,9 +34,14 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./kibana/instance')); loadTestFile(require.resolve('./kibana/instance_mb')); + loadTestFile(require.resolve('./logstash/overview')); + loadTestFile(require.resolve('./logstash/overview_mb')); + loadTestFile(require.resolve('./logstash/nodes')); + loadTestFile(require.resolve('./logstash/nodes_mb')); loadTestFile(require.resolve('./logstash/pipelines')); loadTestFile(require.resolve('./logstash/pipelines_mb')); - + loadTestFile(require.resolve('./logstash/node_detail')); + loadTestFile(require.resolve('./logstash/node_detail_mb')); loadTestFile(require.resolve('./beats/cluster')); loadTestFile(require.resolve('./beats/overview')); loadTestFile(require.resolve('./beats/listing')); diff --git a/x-pack/test/functional/apps/monitoring/logstash/node_detail.js b/x-pack/test/functional/apps/monitoring/logstash/node_detail.js new file mode 100644 index 0000000000000..2e75422f3028f --- /dev/null +++ b/x-pack/test/functional/apps/monitoring/logstash/node_detail.js @@ -0,0 +1,125 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { getLifecycleMethods } from '../_get_lifecycle_methods'; + +export default function ({ getService, getPageObjects }) { + const PageObjects = getPageObjects(['common']); + const retry = getService('retry'); + const clusterOverview = getService('monitoringClusterOverview'); + const nodes = getService('monitoringLogstashNodes'); + const nodeDetail = getService('monitoringLogstashNodeDetail'); + const pipelinesList = getService('monitoringLogstashPipelines'); + + describe('Logstash node detail', () => { + describe('Node', () => { + const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); + const nodeSummaryStatus = { + eventsIn: 'Events Received\n42.4k', + eventsOut: 'Events Emitted\n39.4k', + httpAddress: 'Transport Address\n127.0.0.1:9600', + numReloads: 'Config Reloads\n0', + pipelineBatchSize: 'Batch Size\n125', + pipelineWorkers: 'Pipeline Workers\n8', + uptime: 'Uptime\n8 minutes', + version: 'Version\n7.0.0-alpha1', + }; + + before(async () => { + await setup('x-pack/test/functional/es_archives/monitoring/logstash_pipelines', { + from: 'Jan 22, 2018 @ 09:10:00.000', + to: 'Jan 22, 2018 @ 09:41:00.000', + }); + + await clusterOverview.closeAlertsModal(); + + // go to logstash nodes + await clusterOverview.clickLsNodes(); + expect(await nodes.isOnNodesListing()).to.be(true); + }); + + after(async () => { + await tearDown(); + }); + + it('detail view should have summary status showing correct info', async () => { + await nodes.clickRowByResolver('29a3dfa6-c146-4534-9bc0-be475d2ce950'); + expect(await nodeDetail.getSummary()).to.eql(nodeSummaryStatus); + }); + it('advanced view should have summary status showing correct info', async () => { + await nodeDetail.clickAdvanced(); + + expect(await nodeDetail.getSummary()).to.eql(nodeSummaryStatus); + }); + it('pipelines view should have summary status showing correct info', async () => { + await nodeDetail.clickPipelines(); + + expect(await nodeDetail.getSummary()).to.eql(nodeSummaryStatus); + }); + it('pipelines view should have Pipelines table showing correct rows with default sorting', async () => { + const rows = await pipelinesList.getRows(); + expect(rows.length).to.be(3); + + await pipelinesList.clickIdCol(); + + const pipelinesAll = await pipelinesList.getPipelinesAll(); + + const tableData = [ + { id: 'nginx_logs', eventsEmittedRate: '62.5 e/s', nodeCount: '1' }, + { id: 'test_interpolation', eventsEmittedRate: '0 e/s', nodeCount: '1' }, + { id: 'tweets_about_labradoodles', eventsEmittedRate: '1.2 e/s', nodeCount: '1' }, + ]; + + // check the all data in the table + pipelinesAll.forEach((obj, index) => { + expect(pipelinesAll[index].id).to.be(tableData[index].id); + expect(pipelinesAll[index].eventsEmittedRate).to.be(tableData[index].eventsEmittedRate); + expect(pipelinesAll[index].nodeCount).to.be(tableData[index].nodeCount); + }); + }); + + it('should have Pipelines Table showing correct rows after sorting by Events Emitted Rate Asc', async () => { + await pipelinesList.clickEventsEmittedRateCol(); + + const rows = await pipelinesList.getRows(); + expect(rows.length).to.be(3); + + const pipelinesAll = await pipelinesList.getPipelinesAll(); + + const tableData = [ + { id: 'test_interpolation', eventsEmittedRate: '0 e/s', nodeCount: '1' }, + { id: 'tweets_about_labradoodles', eventsEmittedRate: '1.2 e/s', nodeCount: '1' }, + { id: 'nginx_logs', eventsEmittedRate: '62.5 e/s', nodeCount: '1' }, + ]; + + // check the all data in the table + pipelinesAll.forEach((obj, index) => { + expect(pipelinesAll[index].id).to.be(tableData[index].id); + expect(pipelinesAll[index].eventsEmittedRate).to.be(tableData[index].eventsEmittedRate); + expect(pipelinesAll[index].nodeCount).to.be(tableData[index].nodeCount); + }); + }); + + it('should filter for non-existent pipeline', async () => { + await pipelinesList.setFilter('foobar'); + await pipelinesList.assertNoData(); + await pipelinesList.clearFilter(); + }); + + it('should filter for specific pipelines', async () => { + await pipelinesList.setFilter('la'); + await PageObjects.common.pressEnterKey(); + await retry.try(async () => { + const rows = await pipelinesList.getRows(); + expect(rows.length).to.be(2); + }); + await pipelinesList.clearFilter(); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/monitoring/logstash/node_detail_mb.js b/x-pack/test/functional/apps/monitoring/logstash/node_detail_mb.js new file mode 100644 index 0000000000000..aba95b42c3043 --- /dev/null +++ b/x-pack/test/functional/apps/monitoring/logstash/node_detail_mb.js @@ -0,0 +1,125 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { getLifecycleMethods } from '../_get_lifecycle_methods'; + +export default function ({ getService, getPageObjects }) { + const PageObjects = getPageObjects(['common']); + const retry = getService('retry'); + const clusterOverview = getService('monitoringClusterOverview'); + const nodes = getService('monitoringLogstashNodes'); + const nodeDetail = getService('monitoringLogstashNodeDetail'); + const pipelinesList = getService('monitoringLogstashPipelines'); + + describe('Logstash node detail mb', () => { + describe('Node', () => { + const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); + const nodeSummaryStatus = { + eventsIn: 'Events Received\n42.4k', + eventsOut: 'Events Emitted\n39.4k', + httpAddress: 'Transport Address\n127.0.0.1:9600', + numReloads: 'Config Reloads\n0', + pipelineBatchSize: 'Batch Size\n125', + pipelineWorkers: 'Pipeline Workers\n8', + uptime: 'Uptime\n8 minutes', + version: 'Version\n7.0.0-alpha1', + }; + + before(async () => { + await setup('x-pack/test/functional/es_archives/monitoring/logstash_pipelines_mb', { + from: 'Jan 22, 2018 @ 09:10:00.000', + to: 'Jan 22, 2018 @ 09:41:00.000', + }); + + await clusterOverview.closeAlertsModal(); + + // go to logstash nodes + await clusterOverview.clickLsNodes(); + expect(await nodes.isOnNodesListing()).to.be(true); + await nodes.clickRowByResolver('29a3dfa6-c146-4534-9bc0-be475d2ce950'); + }); + + after(async () => { + await tearDown(); + }); + + it('detail view should have summary status showing correct info', async () => { + expect(await nodeDetail.getSummary()).to.eql(nodeSummaryStatus); + }); + it('advanced view should have summary status showing correct info', async () => { + await nodeDetail.clickAdvanced(); + + expect(await nodeDetail.getSummary()).to.eql(nodeSummaryStatus); + }); + it('pipelines view should have summary status showing correct info', async () => { + await nodeDetail.clickPipelines(); + + expect(await nodeDetail.getSummary()).to.eql(nodeSummaryStatus); + }); + it('pipelines view should have Pipelines table showing correct rows with default sorting', async () => { + const rows = await pipelinesList.getRows(); + expect(rows.length).to.be(3); + + await pipelinesList.clickIdCol(); + + const pipelinesAll = await pipelinesList.getPipelinesAll(); + + const tableData = [ + { id: 'nginx_logs', eventsEmittedRate: '62.5 e/s', nodeCount: '1' }, + { id: 'test_interpolation', eventsEmittedRate: '0 e/s', nodeCount: '1' }, + { id: 'tweets_about_labradoodles', eventsEmittedRate: '1.2 e/s', nodeCount: '1' }, + ]; + + // check the all data in the table + pipelinesAll.forEach((obj, index) => { + expect(pipelinesAll[index].id).to.be(tableData[index].id); + expect(pipelinesAll[index].eventsEmittedRate).to.be(tableData[index].eventsEmittedRate); + expect(pipelinesAll[index].nodeCount).to.be(tableData[index].nodeCount); + }); + }); + + it('should have Pipelines Table showing correct rows after sorting by Events Emitted Rate Asc', async () => { + await pipelinesList.clickEventsEmittedRateCol(); + + const rows = await pipelinesList.getRows(); + expect(rows.length).to.be(3); + + const pipelinesAll = await pipelinesList.getPipelinesAll(); + + const tableData = [ + { id: 'test_interpolation', eventsEmittedRate: '0 e/s', nodeCount: '1' }, + { id: 'tweets_about_labradoodles', eventsEmittedRate: '1.2 e/s', nodeCount: '1' }, + { id: 'nginx_logs', eventsEmittedRate: '62.5 e/s', nodeCount: '1' }, + ]; + + // check the all data in the table + pipelinesAll.forEach((obj, index) => { + expect(pipelinesAll[index].id).to.be(tableData[index].id); + expect(pipelinesAll[index].eventsEmittedRate).to.be(tableData[index].eventsEmittedRate); + expect(pipelinesAll[index].nodeCount).to.be(tableData[index].nodeCount); + }); + }); + + it('should filter for non-existent pipeline', async () => { + await pipelinesList.setFilter('foobar'); + await pipelinesList.assertNoData(); + await pipelinesList.clearFilter(); + }); + + it('should filter for specific pipelines', async () => { + await pipelinesList.setFilter('la'); + await PageObjects.common.pressEnterKey(); + await retry.try(async () => { + const rows = await pipelinesList.getRows(); + expect(rows.length).to.be(2); + }); + await pipelinesList.clearFilter(); + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/monitoring/logstash/nodes.js b/x-pack/test/functional/apps/monitoring/logstash/nodes.js new file mode 100644 index 0000000000000..75e3c7bac7c01 --- /dev/null +++ b/x-pack/test/functional/apps/monitoring/logstash/nodes.js @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { getLifecycleMethods } from '../_get_lifecycle_methods'; + +export default function ({ getService, getPageObjects }) { + const clusterOverview = getService('monitoringClusterOverview'); + const nodes = getService('monitoringLogstashNodes'); + const logstashSummaryStatus = getService('monitoringLogstashSummaryStatus'); + + describe('Logstash nodes', () => { + const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); + + before(async () => { + await setup('x-pack/test/functional/es_archives/monitoring/logstash_pipelines', { + from: 'Jan 22, 2018 @ 09:10:00.000', + to: 'Jan 22, 2018 @ 09:41:00.000', + }); + + await clusterOverview.closeAlertsModal(); + + // go to logstash nodes + await clusterOverview.clickLsNodes(); + expect(await nodes.isOnNodesListing()).to.be(true); + }); + + after(async () => { + await tearDown(); + }); + it('should have Logstash Cluster Summary Status showing correct info', async () => { + expect(await logstashSummaryStatus.getContent()).to.eql({ + eventsInTotal: 'Events Received\n117.9k', + eventsOutTotal: 'Events Emitted\n111.9k', + memoryUsed: 'Memory\n528.4 MB / 1.9 GB', + nodeCount: 'Nodes\n2', + }); + }); + it('should have a nodes table with the correct number of rows', async () => { + const rows = await nodes.getRows(); + expect(rows.length).to.be(2); + }); + it('should have a nodes table with the correct data', async () => { + const nodesAll = await nodes.getNodesAll(); + + const tableData = [ + { + id: 'Shaunaks-MacBook-Pro.local', + httpAddress: '127.0.0.1:9601', + alertStatus: 'Clear', + cpuUsage: '0.00%', + loadAverage: '4.54', + jvmHeapUsed: '22.00%', + eventsOut: '73.5k', + configReloadsSuccess: '0 successes', + configReloadsFailure: '0 failures', + version: '7.0.0-alpha1', + }, + { + id: 'Shaunaks-MacBook-Pro.local', + httpAddress: '127.0.0.1:9600', + alertStatus: 'Clear', + cpuUsage: '2.00%', + loadAverage: '4.76', + jvmHeapUsed: '30.00%', + eventsOut: '38.4k', + configReloadsSuccess: '0 successes', + configReloadsFailure: '0 failures', + version: '7.0.0-alpha1', + }, + ]; + + nodesAll.forEach((obj, index) => { + expect(nodesAll[index].id).to.be(tableData[index].id); + expect(nodesAll[index].httpAddress).to.be(tableData[index].httpAddress); + expect(nodesAll[index].alertStatus).to.be(tableData[index].alertStatus); + expect(nodesAll[index].cpuUsage).to.be(tableData[index].cpuUsage); + expect(nodesAll[index].loadAverage).to.be(tableData[index].loadAverage); + expect(nodesAll[index].jvmHeapUsed).to.be(tableData[index].jvmHeapUsed); + expect(nodesAll[index].eventsOut).to.be(tableData[index].eventsOut); + expect(nodesAll[index].configReloadsSuccess).to.be(tableData[index].configReloadsSuccess); + expect(nodesAll[index].configReloadsFailure).to.be(tableData[index].configReloadsFailure); + expect(nodesAll[index].version).to.be(tableData[index].version); + }); + }); + + it('should filter for non-existent node', async () => { + await nodes.setFilter('foobar'); + await nodes.assertNoData(); + await nodes.clearFilter(); + }); + + it('should filter for specific nodes', async () => { + await nodes.setFilter('sha'); + const rows = await nodes.getRows(); + expect(rows.length).to.be(2); + await nodes.clearFilter(); + }); + }); +} diff --git a/x-pack/test/functional/apps/monitoring/logstash/nodes_mb.js b/x-pack/test/functional/apps/monitoring/logstash/nodes_mb.js new file mode 100644 index 0000000000000..1f55d3a0c72dd --- /dev/null +++ b/x-pack/test/functional/apps/monitoring/logstash/nodes_mb.js @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { getLifecycleMethods } from '../_get_lifecycle_methods'; + +export default function ({ getService, getPageObjects }) { + const clusterOverview = getService('monitoringClusterOverview'); + const nodes = getService('monitoringLogstashNodes'); + const logstashSummaryStatus = getService('monitoringLogstashSummaryStatus'); + + describe('Logstash nodes mb', () => { + const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); + + before(async () => { + await setup('x-pack/test/functional/es_archives/monitoring/logstash_pipelines_mb', { + from: 'Jan 22, 2018 @ 09:10:00.000', + to: 'Jan 22, 2018 @ 09:41:00.000', + }); + + await clusterOverview.closeAlertsModal(); + + // go to logstash nodes + await clusterOverview.clickLsNodes(); + expect(await nodes.isOnNodesListing()).to.be(true); + }); + + after(async () => { + await tearDown(); + }); + it('should have Logstash Cluster Summary Status showing correct info', async () => { + expect(await logstashSummaryStatus.getContent()).to.eql({ + eventsInTotal: 'Events Received\n117.9k', + eventsOutTotal: 'Events Emitted\n111.9k', + memoryUsed: 'Memory\n528.4 MB / 1.9 GB', + nodeCount: 'Nodes\n2', + }); + }); + it('should have a nodes table with the correct number of rows', async () => { + const rows = await nodes.getRows(); + expect(rows.length).to.be(2); + }); + it('should have a nodes table with the correct data', async () => { + const nodesAll = await nodes.getNodesAll(); + + const tableData = [ + { + id: 'Shaunaks-MacBook-Pro.local', + httpAddress: '127.0.0.1:9601', + alertStatus: 'Clear', + cpuUsage: '0.00%', + loadAverage: '4.54', + jvmHeapUsed: '22.00%', + eventsOut: '73.5k', + configReloadsSuccess: '0 successes', + configReloadsFailure: '0 failures', + version: '7.0.0-alpha1', + }, + { + id: 'Shaunaks-MacBook-Pro.local', + httpAddress: '127.0.0.1:9600', + alertStatus: 'Clear', + cpuUsage: '2.00%', + loadAverage: '4.76', + jvmHeapUsed: '30.00%', + eventsOut: '38.4k', + configReloadsSuccess: '0 successes', + configReloadsFailure: '0 failures', + version: '7.0.0-alpha1', + }, + ]; + + nodesAll.forEach((obj, index) => { + expect(nodesAll[index].id).to.be(tableData[index].id); + expect(nodesAll[index].httpAddress).to.be(tableData[index].httpAddress); + expect(nodesAll[index].alertStatus).to.be(tableData[index].alertStatus); + expect(nodesAll[index].cpuUsage).to.be(tableData[index].cpuUsage); + expect(nodesAll[index].loadAverage).to.be(tableData[index].loadAverage); + expect(nodesAll[index].jvmHeapUsed).to.be(tableData[index].jvmHeapUsed); + expect(nodesAll[index].eventsOut).to.be(tableData[index].eventsOut); + expect(nodesAll[index].configReloadsSuccess).to.be(tableData[index].configReloadsSuccess); + expect(nodesAll[index].configReloadsFailure).to.be(tableData[index].configReloadsFailure); + expect(nodesAll[index].version).to.be(tableData[index].version); + }); + }); + + it('should filter for non-existent node', async () => { + await nodes.setFilter('foobar'); + await nodes.assertNoData(); + await nodes.clearFilter(); + }); + + it('should filter for specific nodes', async () => { + await nodes.setFilter('sha'); + const rows = await nodes.getRows(); + expect(rows.length).to.be(2); + await nodes.clearFilter(); + }); + }); +} diff --git a/x-pack/test/functional/apps/monitoring/logstash/overview.js b/x-pack/test/functional/apps/monitoring/logstash/overview.js new file mode 100644 index 0000000000000..593159ec6b266 --- /dev/null +++ b/x-pack/test/functional/apps/monitoring/logstash/overview.js @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { getLifecycleMethods } from '../_get_lifecycle_methods'; + +export default function ({ getService, getPageObjects }) { + const clusterOverview = getService('monitoringClusterOverview'); + const overview = getService('monitoringLogstashOverview'); + const logstashSummaryStatus = getService('monitoringLogstashSummaryStatus'); + + describe('Logstash overview', () => { + const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); + + before(async () => { + await setup('x-pack/test/functional/es_archives/monitoring/logstash_pipelines', { + from: 'Jan 22, 2018 @ 09:10:00.000', + to: 'Jan 22, 2018 @ 09:41:00.000', + }); + + await clusterOverview.closeAlertsModal(); + + // go to logstash overview + await clusterOverview.clickLsOverview(); + expect(await overview.isOnOverview()).to.be(true); + }); + + after(async () => { + await tearDown(); + }); + it('should have Logstash Cluster Summary Status showing correct info', async () => { + expect(await logstashSummaryStatus.getContent()).to.eql({ + eventsInTotal: 'Events Received\n117.9k', + eventsOutTotal: 'Events Emitted\n111.9k', + memoryUsed: 'Memory\n528.4 MB / 1.9 GB', + nodeCount: 'Nodes\n2', + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/monitoring/logstash/overview_mb.js b/x-pack/test/functional/apps/monitoring/logstash/overview_mb.js new file mode 100644 index 0000000000000..91faede36b1d6 --- /dev/null +++ b/x-pack/test/functional/apps/monitoring/logstash/overview_mb.js @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { getLifecycleMethods } from '../_get_lifecycle_methods'; + +export default function ({ getService, getPageObjects }) { + const clusterOverview = getService('monitoringClusterOverview'); + const overview = getService('monitoringLogstashOverview'); + const logstashSummaryStatus = getService('monitoringLogstashSummaryStatus'); + + describe('Logstash overview mb', () => { + const { setup, tearDown } = getLifecycleMethods(getService, getPageObjects); + + before(async () => { + await setup('x-pack/test/functional/es_archives/monitoring/logstash_pipelines_mb', { + from: 'Jan 22, 2018 @ 09:10:00.000', + to: 'Jan 22, 2018 @ 09:41:00.000', + }); + + await clusterOverview.closeAlertsModal(); + + // go to logstash overview + await clusterOverview.clickLsOverview(); + expect(await overview.isOnOverview()).to.be(true); + }); + + after(async () => { + await tearDown(); + }); + it('should have an Logstash Summary Status with correct info', async () => { + expect(await logstashSummaryStatus.getContent()).to.eql({ + eventsInTotal: 'Events Received\n117.9k', + eventsOutTotal: 'Events Emitted\n111.9k', + memoryUsed: 'Memory\n528.4 MB / 1.9 GB', + nodeCount: 'Nodes\n2', + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts b/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts index 7867170c1801c..977a384062f79 100644 --- a/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts +++ b/x-pack/test/functional/apps/uptime/feature_controls/uptime_security.ts @@ -68,6 +68,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const navLinks = await appsMenu.readLinks(); expect(navLinks.map((link) => link.text)).to.eql([ 'Overview', + 'Alerts', 'Uptime', 'Stack Management', ]); @@ -121,7 +122,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('shows uptime navlink', async () => { const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.eql(['Overview', 'Uptime', 'Stack Management']); + expect(navLinks).to.eql(['Overview', 'Alerts', 'Uptime', 'Stack Management']); }); it('can navigate to Uptime app', async () => { diff --git a/x-pack/test/functional/apps/uptime/synthetics_integration.ts b/x-pack/test/functional/apps/uptime/synthetics_integration.ts index b805b044e1894..cc11505f53ebd 100644 --- a/x-pack/test/functional/apps/uptime/synthetics_integration.ts +++ b/x-pack/test/functional/apps/uptime/synthetics_integration.ts @@ -170,7 +170,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('create new policy', () => { + // FLAKY: https://github.com/elastic/kibana/issues/109329 + describe.skip('create new policy', () => { let version: string; beforeEach(async () => { diff --git a/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json b/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json index b3d33f5d45345..449731d9e4ab2 100644 --- a/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json +++ b/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json @@ -4,7 +4,7 @@ "id": "3KVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "963b081e-60d1-482c-befd-a5815fa8290f", "version": "6.6.1", @@ -26,7 +26,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d14", "kind": "metric", "category": [ @@ -74,7 +74,7 @@ "id": "3aVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "b3412d6f-b022-4448-8fee-21cc936ea86b", "version": "6.0.0", @@ -96,7 +96,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d15", "kind": "metric", "category": [ @@ -143,7 +143,7 @@ "id": "3qVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "3838df35-a095-4af4-8fce-0b6d78793f2e", "version": "6.8.0", @@ -165,7 +165,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d16", "kind": "metric", "category": [ @@ -210,7 +210,7 @@ "id": "36VN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "963b081e-60d1-482c-befd-a5815fa8290f", "version": "6.6.1", @@ -232,7 +232,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d18", "kind": "metric", "category": [ @@ -280,7 +280,7 @@ "id": "4KVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "b3412d6f-b022-4448-8fee-21cc936ea86b", "version": "6.0.0", @@ -302,7 +302,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d19", "kind": "metric", "category": [ @@ -348,7 +348,7 @@ "id": "4aVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "3838df35-a095-4af4-8fce-0b6d78793f2e", "version": "6.8.0", @@ -370,7 +370,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d39", "kind": "metric", "category": [ @@ -416,7 +416,7 @@ "id": "4qVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "963b081e-60d1-482c-befd-a5815fa8290f", "version": "6.6.1", @@ -438,7 +438,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d31", "kind": "metric", "category": [ @@ -485,7 +485,7 @@ "id": "46VN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "b3412d6f-b022-4448-8fee-21cc936ea86b", "version": "6.0.0", @@ -507,7 +507,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d23", "kind": "metric", "category": [ @@ -553,7 +553,7 @@ "id": "5KVN2G8BYQH1gtPUuYk7", "index": "metrics-endpoint.metadata-default", "source": { - "@timestamp": 1626897841950, + "@timestamp": 1634656952181, "agent": { "id": "3838df35-a095-4af4-8fce-0b6d78793f2e", "version": "6.8.0", @@ -575,7 +575,7 @@ } }, "event": { - "created": 1626897841950, + "created": 1634656952181, "id": "32f5fda2-48e4-4fae-b89e-a18038294d35", "kind": "metric", "category": [ diff --git a/x-pack/test/functional/es_archives/filebeat/threat_intel/data.json b/x-pack/test/functional/es_archives/filebeat/threat_intel/data.json index f426ffae33e1c..0cbc7f37bd519 100644 --- a/x-pack/test/functional/es_archives/filebeat/threat_intel/data.json +++ b/x-pack/test/functional/es_archives/filebeat/threat_intel/data.json @@ -18,7 +18,7 @@ "event": { "category": "threat", "created": "2021-01-26T11:09:05.529Z", - "dataset": "ti_abusech.malware", + "dataset": "threatintel.abuseurl", "ingested": "2021-01-26T11:09:06.595350Z", "kind": "enrichment", "module": "threatintel", @@ -87,7 +87,7 @@ "event": { "category": "threat", "created": "2021-01-26T11:09:05.529Z", - "dataset": "ti_abusech.malware", + "dataset": "threatintel.abuseurl", "ingested": "2021-01-26T11:09:06.616763Z", "kind": "enrichment", "module": "threatintel", @@ -156,7 +156,7 @@ "event": { "category": "threat", "created": "2021-01-26T11:09:05.529Z", - "dataset": "ti_abusech.malware", + "dataset": "threatintel.abuseurl", "ingested": "2021-01-26T11:09:06.616763Z", "kind": "enrichment", "module": "threatintel", @@ -226,7 +226,7 @@ "event": { "category": "threat", "created": "2021-01-26T11:09:05.529Z", - "dataset": "ti_abusech.malware", + "dataset": "threatintel.abuseurl", "ingested": "2021-01-26T11:09:06.616763Z", "kind": "enrichment", "module": "threatintel", diff --git a/x-pack/test/functional/es_archives/infra/ten_thousand_plus/data.json.gz b/x-pack/test/functional/es_archives/infra/ten_thousand_plus/data.json.gz new file mode 100644 index 0000000000000..d407dbea7cdcb Binary files /dev/null and b/x-pack/test/functional/es_archives/infra/ten_thousand_plus/data.json.gz differ diff --git a/x-pack/test/functional/es_archives/infra/ten_thousand_plus/mappings.json b/x-pack/test/functional/es_archives/infra/ten_thousand_plus/mappings.json new file mode 100644 index 0000000000000..3a29ce69921ed --- /dev/null +++ b/x-pack/test/functional/es_archives/infra/ten_thousand_plus/mappings.json @@ -0,0 +1,21724 @@ +{ + "type": "index", + "value": { + "aliases": { + }, + "index": "filebeat-2021-10-18", + "mappings": { + "_meta": { + "beat": "filebeat", + "version": "8.0.0" + }, + "date_detection": false, + "dynamic_templates": [ + { + "labels": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "labels.*" + } + }, + { + "container.labels": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "container.labels.*" + } + }, + { + "fields": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "fields.*" + } + }, + { + "docker.container.labels": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "docker.container.labels.*" + } + }, + { + "kubernetes.labels.*": { + "mapping": { + "type": "keyword" + }, + "path_match": "kubernetes.labels.*" + } + }, + { + "kubernetes.annotations.*": { + "mapping": { + "type": "keyword" + }, + "path_match": "kubernetes.annotations.*" + } + }, + { + "docker.attrs": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "docker.attrs.*" + } + }, + { + "azure.activitylogs.identity.claims.*": { + "mapping": { + "type": "keyword" + }, + "path_match": "azure.activitylogs.identity.claims.*" + } + }, + { + "kibana.log.meta": { + "mapping": { + "type": "keyword" + }, + "match_mapping_type": "string", + "path_match": "kibana.log.meta.*" + } + }, + { + "strings_as_keyword": { + "mapping": { + "ignore_above": 1024, + "type": "keyword" + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "@timestamp": { + "type": "date" + }, + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "activemq": { + "properties": { + "audit": { + "type": "object" + }, + "caller": { + "ignore_above": 1024, + "type": "keyword" + }, + "log": { + "properties": { + "stack_trace": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "agent": { + "properties": { + "build": { + "properties": { + "original": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "hostname": { + "path": "agent.name", + "type": "alias" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "apache": { + "properties": { + "access": { + "properties": { + "ssl": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "error": { + "properties": { + "module": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "apache2": { + "properties": { + "access": { + "properties": { + "geoip": { + "type": "object" + }, + "http_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "response_code": { + "type": "long" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_agent": { + "type": "object" + }, + "user_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "error": { + "type": "object" + } + } + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "auditd": { + "properties": { + "log": { + "properties": { + "a0": { + "ignore_above": 1024, + "type": "keyword" + }, + "addr": { + "type": "ip" + }, + "geoip": { + "type": "object" + }, + "item": { + "ignore_above": 1024, + "type": "keyword" + }, + "items": { + "ignore_above": 1024, + "type": "keyword" + }, + "laddr": { + "type": "ip" + }, + "lport": { + "type": "long" + }, + "new_auid": { + "ignore_above": 1024, + "type": "keyword" + }, + "new_ses": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_auid": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_ses": { + "ignore_above": 1024, + "type": "keyword" + }, + "rport": { + "type": "long" + }, + "sequence": { + "type": "long" + }, + "tty": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "aws": { + "properties": { + "cloudtrail": { + "properties": { + "additional_eventdata": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "api_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "console_login": { + "properties": { + "additional_eventdata": { + "properties": { + "login_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "mfa_used": { + "type": "boolean" + }, + "mobile_version": { + "type": "boolean" + } + } + } + } + }, + "error_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "error_message": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "flattened": { + "properties": { + "additional_eventdata": { + "type": "flattened" + }, + "request_parameters": { + "type": "flattened" + }, + "response_elements": { + "type": "flattened" + }, + "service_event_details": { + "type": "flattened" + } + } + }, + "management_event": { + "ignore_above": 1024, + "type": "keyword" + }, + "read_only": { + "ignore_above": 1024, + "type": "keyword" + }, + "recipient_account_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_parameters": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "resources": { + "properties": { + "account_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "arn": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response_elements": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "service_event_details": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "shared_event_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_identity": { + "properties": { + "access_key_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "arn": { + "ignore_above": 1024, + "type": "keyword" + }, + "invoked_by": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_context": { + "properties": { + "creation_date": { + "type": "date" + }, + "mfa_authenticated": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_issuer": { + "properties": { + "account_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "arn": { + "ignore_above": 1024, + "type": "keyword" + }, + "principal_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpc_endpoint_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cloudwatch": { + "properties": { + "message": { + "norms": false, + "type": "text" + } + } + }, + "ec2": { + "properties": { + "ip_address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "elb": { + "properties": { + "action_executed": { + "ignore_above": 1024, + "type": "keyword" + }, + "backend": { + "properties": { + "http": { + "properties": { + "response": { + "properties": { + "status_code": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "backend_processing_time": { + "properties": { + "sec": { + "type": "float" + } + } + }, + "chosen_cert": { + "properties": { + "arn": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "connection_time": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "error": { + "properties": { + "reason": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "incoming_tls_alert": { + "ignore_above": 1024, + "type": "keyword" + }, + "listener": { + "ignore_above": 1024, + "type": "keyword" + }, + "matched_rule_priority": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "redirect_url": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_processing_time": { + "properties": { + "sec": { + "type": "float" + } + } + }, + "response_processing_time": { + "properties": { + "sec": { + "type": "float" + } + } + }, + "ssl_cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssl_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "target_group": { + "properties": { + "arn": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tls_handshake_time": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "tls_named_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "trace_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "s3access": { + "properties": { + "authentication_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "bucket": { + "ignore_above": 1024, + "type": "keyword" + }, + "bucket_owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes_sent": { + "type": "long" + }, + "cipher_suite": { + "ignore_above": 1024, + "type": "keyword" + }, + "error_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_header": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_status": { + "type": "long" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "object_size": { + "type": "long" + }, + "operation": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_ip": { + "type": "ip" + }, + "request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_uri": { + "ignore_above": 1024, + "type": "keyword" + }, + "requester": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "tls_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_time": { + "type": "long" + }, + "turn_around_time": { + "type": "long" + }, + "user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "version_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpcflow": { + "properties": { + "account_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "pkt_dstaddr": { + "type": "ip" + }, + "pkt_srcaddr": { + "type": "ip" + }, + "subnet_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpc_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "awscloudwatch": { + "properties": { + "ingestion_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_stream": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "azure": { + "properties": { + "activitylogs": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "identity": { + "properties": { + "authorization": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "evidence": { + "properties": { + "principal_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "principal_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "role_assignment_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "role_assignment_scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "role_definition_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scope": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "claims": { + "properties": { + "*": { + "type": "object" + } + } + }, + "claims_initiated_by_user": { + "properties": { + "fullname": { + "ignore_above": 1024, + "type": "keyword" + }, + "givenname": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "schema": { + "ignore_above": 1024, + "type": "keyword" + }, + "surname": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "operation_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "properties": { + "properties": { + "service_request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_code": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "result_signature": { + "ignore_above": 1024, + "type": "keyword" + }, + "result_type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "auditlogs": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "identity": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "properties": { + "properties": { + "activity_datetime": { + "type": "date" + }, + "activity_display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "correlation_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "initiated_by": { + "properties": { + "app": { + "properties": { + "appId": { + "ignore_above": 1024, + "type": "keyword" + }, + "displayName": { + "ignore_above": 1024, + "type": "keyword" + }, + "servicePrincipalId": { + "ignore_above": 1024, + "type": "keyword" + }, + "servicePrincipalName": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "displayName": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ipAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "userPrincipalName": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "logged_by_service": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "result": { + "ignore_above": 1024, + "type": "keyword" + }, + "result_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "target_resources": { + "properties": { + "*": { + "properties": { + "display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "modified_properties": { + "properties": { + "*": { + "properties": { + "display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "new_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_value": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_principal_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "result_signature": { + "ignore_above": 1024, + "type": "keyword" + }, + "tenant_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "consumer_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "correlation_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "enqueued_time": { + "type": "date" + }, + "eventhub": { + "ignore_above": 1024, + "type": "keyword" + }, + "offset": { + "type": "long" + }, + "partition_id": { + "type": "long" + }, + "resource": { + "properties": { + "authorization_rule": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "namespace": { + "ignore_above": 1024, + "type": "keyword" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sequence_number": { + "type": "long" + }, + "signinlogs": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "identity": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "properties": { + "properties": { + "app_display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_app_used": { + "ignore_above": 1024, + "type": "keyword" + }, + "conditional_access_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "correlation_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "device_detail": { + "properties": { + "browser": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "operating_system": { + "ignore_above": 1024, + "type": "keyword" + }, + "trust_type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_interactive": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "processing_time_ms": { + "type": "float" + }, + "resource_display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_detail": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_level_aggregated": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_level_during_signin": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "service_principal_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "properties": { + "error_code": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "token_issuer_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "token_issuer_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_principal_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "result_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "result_signature": { + "ignore_above": 1024, + "type": "keyword" + }, + "result_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "tenant_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "subscription_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "tenant_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bucket_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "cef": { + "properties": { + "device": { + "properties": { + "event_class_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extensions": { + "properties": { + "Reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentAddress": { + "type": "ip" + }, + "agentDnsDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentHostName": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentId": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentMacAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentNtDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentReceiptTime": { + "type": "date" + }, + "agentTimeZone": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentTranslatedAddress": { + "type": "ip" + }, + "agentTranslatedZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentTranslatedZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentType": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentVersion": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "agentZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "applicationProtocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "baseEventCount": { + "type": "long" + }, + "bytesIn": { + "type": "long" + }, + "bytesOut": { + "type": "long" + }, + "categoryBehavior": { + "ignore_above": 1024, + "type": "keyword" + }, + "categoryDeviceGroup": { + "ignore_above": 1024, + "type": "keyword" + }, + "categoryDeviceType": { + "ignore_above": 1024, + "type": "keyword" + }, + "categoryObject": { + "ignore_above": 1024, + "type": "keyword" + }, + "categoryOutcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "categorySignificance": { + "ignore_above": 1024, + "type": "keyword" + }, + "categoryTechnique": { + "ignore_above": 1024, + "type": "keyword" + }, + "cp_app_risk": { + "ignore_above": 1024, + "type": "keyword" + }, + "cp_severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "customerExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "customerURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationAddress": { + "type": "ip" + }, + "destinationDnsDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationGeoLatitude": { + "type": "double" + }, + "destinationGeoLongitude": { + "type": "double" + }, + "destinationHostName": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationMacAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationNtDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationPort": { + "type": "long" + }, + "destinationProcessId": { + "type": "long" + }, + "destinationProcessName": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationServiceName": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationTranslatedAddress": { + "type": "ip" + }, + "destinationTranslatedPort": { + "type": "long" + }, + "destinationTranslatedZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationTranslatedZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationUserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationUserName": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationUserPrivileges": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "destinationZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceAction": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceAddress": { + "type": "ip" + }, + "deviceCustomDate1": { + "type": "date" + }, + "deviceCustomDate1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomDate2": { + "type": "date" + }, + "deviceCustomDate2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomFloatingPoint1": { + "type": "double" + }, + "deviceCustomFloatingPoint1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomFloatingPoint2": { + "type": "double" + }, + "deviceCustomFloatingPoint2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomFloatingPoint3": { + "type": "double" + }, + "deviceCustomFloatingPoint3Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomFloatingPoint4": { + "type": "double" + }, + "deviceCustomFloatingPoint4Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomIPv6Address1": { + "type": "ip" + }, + "deviceCustomIPv6Address1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomIPv6Address2": { + "type": "ip" + }, + "deviceCustomIPv6Address2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomIPv6Address3": { + "type": "ip" + }, + "deviceCustomIPv6Address3Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomIPv6Address4": { + "type": "ip" + }, + "deviceCustomIPv6Address4Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomNumber1": { + "type": "long" + }, + "deviceCustomNumber1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomNumber2": { + "type": "long" + }, + "deviceCustomNumber2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomNumber3": { + "type": "long" + }, + "deviceCustomNumber3Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString1": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString2": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString3": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString3Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString4": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString4Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString5": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString5Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString6": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceCustomString6Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceDirection": { + "type": "long" + }, + "deviceDnsDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceEventCategory": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceExternalId": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceFacility": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceFlexNumber1": { + "type": "long" + }, + "deviceFlexNumber1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceFlexNumber2": { + "type": "long" + }, + "deviceFlexNumber2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceHostName": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceInboundInterface": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceMacAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceNtDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceOutboundInterface": { + "ignore_above": 1024, + "type": "keyword" + }, + "devicePayloadId": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceProcessId": { + "type": "long" + }, + "deviceProcessName": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceReceiptTime": { + "type": "date" + }, + "deviceTimeZone": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceTranslatedAddress": { + "type": "ip" + }, + "deviceTranslatedZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceTranslatedZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "deviceZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "endTime": { + "type": "date" + }, + "eventId": { + "type": "long" + }, + "eventOutcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "externalId": { + "ignore_above": 1024, + "type": "keyword" + }, + "fileCreateTime": { + "type": "date" + }, + "fileHash": { + "ignore_above": 1024, + "type": "keyword" + }, + "fileId": { + "ignore_above": 1024, + "type": "keyword" + }, + "fileModificationTime": { + "type": "date" + }, + "filePath": { + "ignore_above": 1024, + "type": "keyword" + }, + "filePermission": { + "ignore_above": 1024, + "type": "keyword" + }, + "fileSize": { + "type": "long" + }, + "fileType": { + "ignore_above": 1024, + "type": "keyword" + }, + "filename": { + "ignore_above": 1024, + "type": "keyword" + }, + "flexDate1": { + "type": "date" + }, + "flexDate1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "flexString1": { + "ignore_above": 1024, + "type": "keyword" + }, + "flexString1Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "flexString2": { + "ignore_above": 1024, + "type": "keyword" + }, + "flexString2Label": { + "ignore_above": 1024, + "type": "keyword" + }, + "ifname": { + "ignore_above": 1024, + "type": "keyword" + }, + "inzone": { + "ignore_above": 1024, + "type": "keyword" + }, + "layer_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "layer_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "logid": { + "ignore_above": 1024, + "type": "keyword" + }, + "loguid": { + "ignore_above": 1024, + "type": "keyword" + }, + "managerReceiptTime": { + "type": "date" + }, + "match_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat_addtnl_rulenum": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat_rulenum": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldFileCreateTime": { + "type": "date" + }, + "oldFileHash": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldFileId": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldFileModificationTime": { + "type": "date" + }, + "oldFileName": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldFilePath": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldFilePermission": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldFileSize": { + "type": "long" + }, + "oldFileType": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "ignore_above": 1024, + "type": "keyword" + }, + "originsicname": { + "ignore_above": 1024, + "type": "keyword" + }, + "outzone": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_rule": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "rawEvent": { + "ignore_above": 1024, + "type": "keyword" + }, + "requestClientApplication": { + "ignore_above": 1024, + "type": "keyword" + }, + "requestContext": { + "ignore_above": 1024, + "type": "keyword" + }, + "requestCookies": { + "ignore_above": 1024, + "type": "keyword" + }, + "requestMethod": { + "ignore_above": 1024, + "type": "keyword" + }, + "requestUrl": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_action": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "sequencenum": { + "ignore_above": 1024, + "type": "keyword" + }, + "service_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceAddress": { + "type": "ip" + }, + "sourceDnsDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceGeoLatitude": { + "type": "double" + }, + "sourceGeoLongitude": { + "type": "double" + }, + "sourceHostName": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceMacAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceNtDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourcePort": { + "type": "long" + }, + "sourceProcessId": { + "type": "long" + }, + "sourceProcessName": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceServiceName": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceTranslatedAddress": { + "type": "ip" + }, + "sourceTranslatedPort": { + "type": "long" + }, + "sourceTranslatedZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceTranslatedZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceUserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceUserName": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceUserPrivileges": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceZoneExternalID": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceZoneURI": { + "ignore_above": 1024, + "type": "keyword" + }, + "startTime": { + "type": "date" + }, + "transportProtocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "type": "long" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "checkpoint": { + "properties": { + "action_reason": { + "type": "long" + }, + "additional_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "additional_ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "additional_rdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "alert": { + "ignore_above": 1024, + "type": "keyword" + }, + "allocated_ports": { + "type": "long" + }, + "analyzed_on": { + "ignore_above": 1024, + "type": "keyword" + }, + "answer_rdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "anti_virus_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_id": { + "type": "long" + }, + "app_package": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_properties": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_repackaged": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_risk": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_sid_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_sig_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "appi_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "arrival_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "attachments_num": { + "type": "long" + }, + "attack_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "audit_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "auth_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "authority_rdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "authorization": { + "ignore_above": 1024, + "type": "keyword" + }, + "bcc": { + "ignore_above": 1024, + "type": "keyword" + }, + "blade_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "broker_publisher": { + "type": "ip" + }, + "browse_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "c_bytes": { + "type": "long" + }, + "calc_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "capacity": { + "type": "long" + }, + "capture_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "cc": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_resource": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_validation": { + "ignore_above": 1024, + "type": "keyword" + }, + "cgnet": { + "ignore_above": 1024, + "type": "keyword" + }, + "chunk_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_type_os": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "cluster_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "community": { + "ignore_above": 1024, + "type": "keyword" + }, + "confidence_level": { + "type": "long" + }, + "connection_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "connectivity_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "connectivity_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "conns_amount": { + "type": "long" + }, + "content_disposition": { + "ignore_above": 1024, + "type": "keyword" + }, + "content_length": { + "ignore_above": 1024, + "type": "keyword" + }, + "content_risk": { + "type": "long" + }, + "content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "context_num": { + "type": "long" + }, + "cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "cookieI": { + "ignore_above": 1024, + "type": "keyword" + }, + "cookieR": { + "ignore_above": 1024, + "type": "keyword" + }, + "cp_message": { + "type": "long" + }, + "cvpn_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "cvpn_resource": { + "ignore_above": 1024, + "type": "keyword" + }, + "data_type_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dce-rpc_interface_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "delivery_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_object": { + "ignore_above": 1024, + "type": "keyword" + }, + "detected_on": { + "ignore_above": 1024, + "type": "keyword" + }, + "developer_certificate_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "diameter_app_ID": { + "type": "long" + }, + "diameter_cmd_code": { + "type": "long" + }, + "diameter_msg_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_action_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_additional_action": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_categories": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_data_type_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_data_type_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_fingerprint_files_number": { + "type": "long" + }, + "dlp_fingerprint_long_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_fingerprint_short_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_incident_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_recipients": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_related_incident_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_relevant_data_types": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_repository_directories_number": { + "type": "long" + }, + "dlp_repository_files_number": { + "type": "long" + }, + "dlp_repository_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_repository_not_scanned_directories_percentage": { + "type": "long" + }, + "dlp_repository_reached_directories_number": { + "type": "long" + }, + "dlp_repository_root_path": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_repository_scan_progress": { + "type": "long" + }, + "dlp_repository_scanned_directories_number": { + "type": "long" + }, + "dlp_repository_scanned_files_number": { + "type": "long" + }, + "dlp_repository_scanned_total_size": { + "type": "long" + }, + "dlp_repository_skipped_files_number": { + "type": "long" + }, + "dlp_repository_total_size": { + "type": "long" + }, + "dlp_repository_unreachable_directories_number": { + "type": "long" + }, + "dlp_rule_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_template_score": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_transint": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_violation_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_watermark_profile": { + "ignore_above": 1024, + "type": "keyword" + }, + "dlp_word_list": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_query": { + "ignore_above": 1024, + "type": "keyword" + }, + "drop_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "dropped_file_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "dropped_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dropped_file_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "dropped_file_verdict": { + "ignore_above": 1024, + "type": "keyword" + }, + "dropped_incoming": { + "type": "long" + }, + "dropped_outgoing": { + "type": "long" + }, + "dropped_total": { + "type": "long" + }, + "drops_amount": { + "type": "long" + }, + "dst_country": { + "ignore_above": 1024, + "type": "keyword" + }, + "dst_phone_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "dst_user_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstkeyid": { + "ignore_above": 1024, + "type": "keyword" + }, + "duplicate": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "ignore_above": 1024, + "type": "keyword" + }, + "elapsed": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_content": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_control": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_control_analysis": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_headers": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_message_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_queue_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_queue_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_recipients_num": { + "type": "long" + }, + "email_session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_spam_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_spool_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "emulated_on": { + "ignore_above": 1024, + "type": "keyword" + }, + "encryption_failure": { + "ignore_above": 1024, + "type": "keyword" + }, + "end_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "end_user_firewall_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_access_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_associated_policies": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_noncompliance_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_rule_action": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_rule_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_rule_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "esod_scan_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_count": { + "type": "long" + }, + "expire_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_file_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_file_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_file_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_file_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_file_verdict": { + "ignore_above": 1024, + "type": "keyword" + }, + "failure_impact": { + "ignore_above": 1024, + "type": "keyword" + }, + "failure_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "files_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "first_hit_time": { + "type": "long" + }, + "frequency": { + "ignore_above": 1024, + "type": "keyword" + }, + "fs-proto": { + "ignore_above": 1024, + "type": "keyword" + }, + "ftp_user": { + "ignore_above": 1024, + "type": "keyword" + }, + "fw_message": { + "ignore_above": 1024, + "type": "keyword" + }, + "fw_subproduct": { + "ignore_above": 1024, + "type": "keyword" + }, + "hide_ip": { + "type": "ip" + }, + "hit": { + "type": "long" + }, + "host_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_location": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_server": { + "ignore_above": 1024, + "type": "keyword" + }, + "https_inspection_action": { + "ignore_above": 1024, + "type": "keyword" + }, + "https_inspection_rule_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "https_inspection_rule_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "https_validation": { + "ignore_above": 1024, + "type": "keyword" + }, + "icap_more_info": { + "type": "long" + }, + "icap_server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "icap_server_service": { + "ignore_above": 1024, + "type": "keyword" + }, + "icap_service_id": { + "type": "long" + }, + "icmp": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code": { + "type": "long" + }, + "icmp_type": { + "type": "long" + }, + "id": { + "type": "long" + }, + "identity_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "ike": { + "ignore_above": 1024, + "type": "keyword" + }, + "ike_ids": { + "ignore_above": 1024, + "type": "keyword" + }, + "impacted_files": { + "ignore_above": 1024, + "type": "keyword" + }, + "incident_extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator_reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "info": { + "ignore_above": 1024, + "type": "keyword" + }, + "information": { + "ignore_above": 1024, + "type": "keyword" + }, + "inspection_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "inspection_item": { + "ignore_above": 1024, + "type": "keyword" + }, + "inspection_profile": { + "ignore_above": 1024, + "type": "keyword" + }, + "inspection_settings_log": { + "ignore_above": 1024, + "type": "keyword" + }, + "installed_products": { + "ignore_above": 1024, + "type": "keyword" + }, + "int_end": { + "type": "long" + }, + "int_start": { + "type": "long" + }, + "integrity_av_invoke_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "internal_error": { + "ignore_above": 1024, + "type": "keyword" + }, + "invalid_file_size": { + "type": "long" + }, + "ip_option": { + "type": "long" + }, + "isp_link": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_hit_time": { + "type": "long" + }, + "last_rematch_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "layer_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "layer_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "limit_applied": { + "type": "long" + }, + "limit_requested": { + "type": "long" + }, + "link_probing_status_update": { + "ignore_above": 1024, + "type": "keyword" + }, + "links_num": { + "type": "long" + }, + "log_delay": { + "type": "long" + }, + "log_id": { + "type": "long" + }, + "logid": { + "ignore_above": 1024, + "type": "keyword" + }, + "long_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "machine": { + "ignore_above": 1024, + "type": "keyword" + }, + "malware_family": { + "ignore_above": 1024, + "type": "keyword" + }, + "match_fk": { + "type": "long" + }, + "match_id": { + "type": "long" + }, + "matched_file": { + "ignore_above": 1024, + "type": "keyword" + }, + "matched_file_percentage": { + "type": "long" + }, + "matched_file_text_segments": { + "type": "long" + }, + "media_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_size": { + "type": "long" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "methods": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_from": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "mirror_and_decrypt_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_collection": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_command_and_control": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_credential_access": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_defense_evasion": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_discovery": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_execution": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_exfiltration": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_impact": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_initial_access": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_lateral_movement": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_persistence": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_privilege_escalation": { + "ignore_above": 1024, + "type": "keyword" + }, + "monitor_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat46": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat_addtnl_rulenum": { + "type": "long" + }, + "nat_exhausted_pool": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat_rulenum": { + "type": "long" + }, + "needs_browse_time": { + "type": "long" + }, + "next_hop_ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "next_scheduled_scan_date": { + "ignore_above": 1024, + "type": "keyword" + }, + "number_of_errors": { + "type": "long" + }, + "objecttable": { + "ignore_above": 1024, + "type": "keyword" + }, + "objecttype": { + "ignore_above": 1024, + "type": "keyword" + }, + "observable_comment": { + "ignore_above": 1024, + "type": "keyword" + }, + "observable_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "observable_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin_sic_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_queue_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "outgoing_url": { + "ignore_above": 1024, + "type": "keyword" + }, + "packet_amount": { + "type": "long" + }, + "packet_capture_unique_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_file_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_file_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_process_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_rule": { + "type": "long" + }, + "peer_gateway": { + "type": "ip" + }, + "peer_ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "peer_ip_probing_status_update": { + "ignore_above": 1024, + "type": "keyword" + }, + "performance_impact": { + "type": "long" + }, + "policy_mgmt": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ports_usage": { + "type": "long" + }, + "ppp": { + "ignore_above": 1024, + "type": "keyword" + }, + "precise_error": { + "ignore_above": 1024, + "type": "keyword" + }, + "process_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "properties": { + "ignore_above": 1024, + "type": "keyword" + }, + "protection_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "protection_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "protection_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "proxy_machine_name": { + "type": "long" + }, + "proxy_src_ip": { + "type": "ip" + }, + "proxy_user_dn": { + "ignore_above": 1024, + "type": "keyword" + }, + "proxy_user_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "question_rdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer_parent_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer_self_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_ip-phones": { + "ignore_above": 1024, + "type": "keyword" + }, + "reject_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "reject_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "rematch_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "remediated_files": { + "ignore_above": 1024, + "type": "keyword" + }, + "reply_status": { + "type": "long" + }, + "risk": { + "ignore_above": 1024, + "type": "keyword" + }, + "rpc_prog": { + "type": "long" + }, + "rule": { + "type": "long" + }, + "rule_action": { + "ignore_above": 1024, + "type": "keyword" + }, + "rulebase_id": { + "type": "long" + }, + "scan_direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "scan_hosts_day": { + "type": "long" + }, + "scan_hosts_hour": { + "type": "long" + }, + "scan_hosts_week": { + "type": "long" + }, + "scan_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "scan_mail": { + "type": "long" + }, + "scan_result": { + "ignore_above": 1024, + "type": "keyword" + }, + "scan_results": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "scrub_activity": { + "ignore_above": 1024, + "type": "keyword" + }, + "scrub_download_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "scrub_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "scrub_total_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "scrubbed_content": { + "ignore_above": 1024, + "type": "keyword" + }, + "sctp_association_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "sctp_error": { + "ignore_above": 1024, + "type": "keyword" + }, + "scv_message_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "scv_user": { + "ignore_above": 1024, + "type": "keyword" + }, + "securexl_message": { + "ignore_above": 1024, + "type": "keyword" + }, + "sensor_mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "short_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "sig_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "similar_communication": { + "ignore_above": 1024, + "type": "keyword" + }, + "similar_hashes": { + "ignore_above": 1024, + "type": "keyword" + }, + "similar_strings": { + "ignore_above": 1024, + "type": "keyword" + }, + "similiar_iocs": { + "ignore_above": 1024, + "type": "keyword" + }, + "sip_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "site_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_object": { + "type": "long" + }, + "source_os": { + "ignore_above": 1024, + "type": "keyword" + }, + "special_properties": { + "type": "long" + }, + "specific_data_type_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "speed": { + "type": "long" + }, + "spyware_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "spyware_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "spyware_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_country": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_phone_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_user_dn": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_user_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "srckeyid": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_update": { + "ignore_above": 1024, + "type": "keyword" + }, + "sub_policy_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sub_policy_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "subs_exp": { + "type": "date" + }, + "subscriber": { + "type": "ip" + }, + "summary": { + "ignore_above": 1024, + "type": "keyword" + }, + "suppressed_logs": { + "type": "long" + }, + "sync": { + "ignore_above": 1024, + "type": "keyword" + }, + "sys_message": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_end_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_packet_out_of_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "te_verdict_determined_by": { + "ignore_above": 1024, + "type": "keyword" + }, + "termination_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "ticket_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "tls_server_host_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_archive_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_attachments": { + "type": "long" + }, + "triggered_by": { + "ignore_above": 1024, + "type": "keyword" + }, + "trusted_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "unique_detected_day": { + "type": "long" + }, + "unique_detected_hour": { + "type": "long" + }, + "unique_detected_week": { + "type": "long" + }, + "update_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor_list": { + "ignore_above": 1024, + "type": "keyword" + }, + "verdict": { + "ignore_above": 1024, + "type": "keyword" + }, + "via": { + "ignore_above": 1024, + "type": "keyword" + }, + "virus_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_attach_action_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_attach_sz": { + "type": "long" + }, + "voip_call_dir": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_call_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_call_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_call_term_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_config": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_duration": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_est_codec": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_exp": { + "type": "long" + }, + "voip_from_user_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_log_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_media_codec": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_media_ipp": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_media_port": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_reason_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_reg_int": { + "type": "long" + }, + "voip_reg_ipp": { + "type": "long" + }, + "voip_reg_period": { + "type": "long" + }, + "voip_reg_server": { + "type": "ip" + }, + "voip_reg_user_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_reject_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "voip_to_user_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpn_feature_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "watermark": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_server_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "word_list": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cisco": { + "properties": { + "asa": { + "properties": { + "assigned_ip": { + "type": "ip" + }, + "burst": { + "properties": { + "avg_rate": { + "ignore_above": 1024, + "type": "keyword" + }, + "configured_avg_rate": { + "ignore_above": 1024, + "type": "keyword" + }, + "configured_rate": { + "ignore_above": 1024, + "type": "keyword" + }, + "cumulative_count": { + "ignore_above": 1024, + "type": "keyword" + }, + "current_rate": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "object": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "command_line_arguments": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "dap_records": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code": { + "type": "short" + }, + "icmp_type": { + "type": "short" + }, + "mapped_destination_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "mapped_destination_ip": { + "type": "ip" + }, + "mapped_destination_port": { + "type": "long" + }, + "mapped_source_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "mapped_source_ip": { + "type": "ip" + }, + "mapped_source_port": { + "type": "long" + }, + "message_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "privilege": { + "properties": { + "new": { + "ignore_above": 1024, + "type": "keyword" + }, + "old": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rule_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "suffix": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_level": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ftd": { + "properties": { + "connection_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "dap_records": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code": { + "type": "short" + }, + "icmp_type": { + "type": "short" + }, + "mapped_destination_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "mapped_destination_ip": { + "type": "ip" + }, + "mapped_destination_port": { + "type": "long" + }, + "mapped_source_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "mapped_source_ip": { + "type": "ip" + }, + "mapped_source_port": { + "type": "long" + }, + "message_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "security": { + "type": "object" + }, + "source_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "suffix": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_level": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ios": { + "properties": { + "access_list": { + "ignore_above": 1024, + "type": "keyword" + }, + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "client": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "client-ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "exists": { + "type": "boolean" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "container": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "runtime": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "controller": { + "ignore_above": 1024, + "type": "keyword" + }, + "coredns": { + "properties": { + "dnssec_ok": { + "type": "boolean" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "query": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + } + } + } + } + }, + "crowdstrike": { + "properties": { + "event": { + "properties": { + "AuditKeyValues": { + "type": "nested" + }, + "CommandLine": { + "ignore_above": 1024, + "type": "keyword" + }, + "Commands": { + "ignore_above": 1024, + "type": "keyword" + }, + "ComputerName": { + "ignore_above": 1024, + "type": "keyword" + }, + "ConnectionDirection": { + "ignore_above": 1024, + "type": "keyword" + }, + "CustomerId": { + "ignore_above": 1024, + "type": "keyword" + }, + "DetectDescription": { + "ignore_above": 1024, + "type": "keyword" + }, + "DetectId": { + "ignore_above": 1024, + "type": "keyword" + }, + "DetectName": { + "ignore_above": 1024, + "type": "keyword" + }, + "DeviceId": { + "ignore_above": 1024, + "type": "keyword" + }, + "EndTimestamp": { + "type": "date" + }, + "EventType": { + "ignore_above": 1024, + "type": "keyword" + }, + "ExecutablesWritten": { + "type": "nested" + }, + "FalconHostLink": { + "ignore_above": 1024, + "type": "keyword" + }, + "FileName": { + "ignore_above": 1024, + "type": "keyword" + }, + "FilePath": { + "ignore_above": 1024, + "type": "keyword" + }, + "FineScore": { + "type": "float" + }, + "Flags": { + "properties": { + "Audit": { + "type": "boolean" + }, + "Log": { + "type": "boolean" + }, + "Monitor": { + "type": "boolean" + } + } + }, + "GrandparentCommandLine": { + "ignore_above": 1024, + "type": "keyword" + }, + "GrandparentImageFileName": { + "ignore_above": 1024, + "type": "keyword" + }, + "HostName": { + "ignore_above": 1024, + "type": "keyword" + }, + "HostnameField": { + "ignore_above": 1024, + "type": "keyword" + }, + "ICMPCode": { + "ignore_above": 1024, + "type": "keyword" + }, + "ICMPType": { + "ignore_above": 1024, + "type": "keyword" + }, + "IOCType": { + "ignore_above": 1024, + "type": "keyword" + }, + "IOCValue": { + "ignore_above": 1024, + "type": "keyword" + }, + "ImageFileName": { + "ignore_above": 1024, + "type": "keyword" + }, + "IncidentEndTime": { + "type": "date" + }, + "IncidentStartTime": { + "type": "date" + }, + "Ipv": { + "ignore_above": 1024, + "type": "keyword" + }, + "LateralMovement": { + "type": "long" + }, + "LocalAddress": { + "type": "ip" + }, + "LocalIP": { + "ignore_above": 1024, + "type": "keyword" + }, + "LocalPort": { + "type": "long" + }, + "MACAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "MD5String": { + "ignore_above": 1024, + "type": "keyword" + }, + "MachineDomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "MatchCount": { + "type": "long" + }, + "MatchCountSinceLastReport": { + "type": "long" + }, + "NetworkProfile": { + "ignore_above": 1024, + "type": "keyword" + }, + "Objective": { + "ignore_above": 1024, + "type": "keyword" + }, + "OperationName": { + "ignore_above": 1024, + "type": "keyword" + }, + "PID": { + "type": "long" + }, + "ParentCommandLine": { + "ignore_above": 1024, + "type": "keyword" + }, + "ParentImageFileName": { + "ignore_above": 1024, + "type": "keyword" + }, + "ParentProcessId": { + "type": "long" + }, + "PatternDispositionDescription": { + "ignore_above": 1024, + "type": "keyword" + }, + "PatternDispositionFlags": { + "type": "object" + }, + "PatternDispositionValue": { + "type": "long" + }, + "PolicyID": { + "ignore_above": 1024, + "type": "keyword" + }, + "PolicyName": { + "ignore_above": 1024, + "type": "keyword" + }, + "ProcessEndTime": { + "type": "date" + }, + "ProcessId": { + "type": "long" + }, + "ProcessStartTime": { + "type": "date" + }, + "Protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "RemoteAddress": { + "type": "ip" + }, + "RemotePort": { + "type": "long" + }, + "RuleAction": { + "ignore_above": 1024, + "type": "keyword" + }, + "RuleDescription": { + "ignore_above": 1024, + "type": "keyword" + }, + "RuleFamilyID": { + "ignore_above": 1024, + "type": "keyword" + }, + "RuleGroupName": { + "ignore_above": 1024, + "type": "keyword" + }, + "RuleId": { + "ignore_above": 1024, + "type": "keyword" + }, + "RuleName": { + "ignore_above": 1024, + "type": "keyword" + }, + "SHA1String": { + "ignore_above": 1024, + "type": "keyword" + }, + "SHA256String": { + "ignore_above": 1024, + "type": "keyword" + }, + "SensorId": { + "ignore_above": 1024, + "type": "keyword" + }, + "ServiceName": { + "ignore_above": 1024, + "type": "keyword" + }, + "SessionId": { + "ignore_above": 1024, + "type": "keyword" + }, + "Severity": { + "type": "long" + }, + "SeverityName": { + "ignore_above": 1024, + "type": "keyword" + }, + "StartTimestamp": { + "type": "date" + }, + "State": { + "ignore_above": 1024, + "type": "keyword" + }, + "Status": { + "ignore_above": 1024, + "type": "keyword" + }, + "Success": { + "type": "boolean" + }, + "Tactic": { + "ignore_above": 1024, + "type": "keyword" + }, + "Technique": { + "ignore_above": 1024, + "type": "keyword" + }, + "Timestamp": { + "type": "date" + }, + "TreeID": { + "ignore_above": 1024, + "type": "keyword" + }, + "UTCTimestamp": { + "type": "date" + }, + "UserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "UserIp": { + "ignore_above": 1024, + "type": "keyword" + }, + "UserName": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "metadata": { + "properties": { + "customerIDString": { + "ignore_above": 1024, + "type": "keyword" + }, + "eventCreationTime": { + "type": "date" + }, + "eventType": { + "ignore_above": 1024, + "type": "keyword" + }, + "offset": { + "type": "long" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "customer_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "db": { + "type": "long" + }, + "destination": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dll": { + "properties": { + "code_signature": { + "properties": { + "exists": { + "type": "boolean" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dns": { + "properties": { + "answers": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "header_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "op_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "question": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resolved_ip": { + "type": "ip" + }, + "response_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "docker": { + "properties": { + "attrs": { + "type": "object" + }, + "container": { + "properties": { + "labels": { + "type": "object" + } + } + } + } + }, + "duration": { + "type": "long" + }, + "ecs": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "elasticsearch": { + "properties": { + "audit": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "indices": { + "ignore_above": 1024, + "type": "keyword" + }, + "layer": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "norms": false, + "type": "text" + }, + "origin": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "realm": { + "ignore_above": 1024, + "type": "keyword" + }, + "request": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "params": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "realm": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "cluster": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "component": { + "ignore_above": 1024, + "type": "keyword" + }, + "deprecation": { + "type": "object" + }, + "gc": { + "properties": { + "heap": { + "properties": { + "size_kb": { + "type": "long" + }, + "used_kb": { + "type": "long" + } + } + }, + "jvm_runtime_sec": { + "type": "float" + }, + "old_gen": { + "properties": { + "size_kb": { + "type": "long" + }, + "used_kb": { + "type": "long" + } + } + }, + "phase": { + "properties": { + "class_unload_time_sec": { + "type": "float" + }, + "cpu_time": { + "properties": { + "real_sec": { + "type": "float" + }, + "sys_sec": { + "type": "float" + }, + "user_sec": { + "type": "float" + } + } + }, + "duration_sec": { + "type": "float" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "parallel_rescan_time_sec": { + "type": "float" + }, + "scrub_string_table_time_sec": { + "type": "float" + }, + "scrub_symbol_table_time_sec": { + "type": "float" + }, + "weak_refs_processing_time_sec": { + "type": "float" + } + } + }, + "stopping_threads_time_sec": { + "type": "float" + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + }, + "threads_total_stop_time_sec": { + "type": "float" + }, + "young_gen": { + "properties": { + "size_kb": { + "type": "long" + }, + "used_kb": { + "type": "long" + } + } + } + } + }, + "index": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "node": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "gc": { + "properties": { + "collection_duration": { + "properties": { + "ms": { + "type": "float" + } + } + }, + "observation_duration": { + "properties": { + "ms": { + "type": "float" + } + } + }, + "overhead_seq": { + "type": "long" + }, + "young": { + "properties": { + "one": { + "type": "long" + }, + "two": { + "type": "long" + } + } + } + } + }, + "stacktrace": { + "ignore_above": 1024, + "index": false, + "type": "keyword" + } + } + }, + "shard": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "slowlog": { + "properties": { + "extra_source": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "routing": { + "ignore_above": 1024, + "type": "keyword" + }, + "search_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_query": { + "ignore_above": 1024, + "type": "keyword" + }, + "stats": { + "ignore_above": 1024, + "type": "keyword" + }, + "took": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_hits": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_shards": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "types": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "envoyproxy": { + "properties": { + "authority": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "proxy_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "response_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "upstream_service_time": { + "type": "long" + } + } + }, + "err": { + "properties": { + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "stack": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "errno": { + "ignore_above": 1024, + "type": "keyword" + }, + "error": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "norms": false, + "type": "text" + }, + "stack_trace": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "index": false, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "long" + }, + "end": { + "type": "date" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "ignore_above": 1024, + "index": false, + "type": "keyword" + }, + "outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "exc_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "fields": { + "type": "object" + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "exists": { + "type": "boolean" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "index": false, + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "fileset": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "forcepoint": { + "properties": { + "virus_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "format": { + "ignore_above": 1024, + "type": "keyword" + }, + "fortinet": { + "properties": { + "file": { + "properties": { + "hash": { + "properties": { + "crc32": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "firewall": { + "properties": { + "acct_stat": { + "ignore_above": 1024, + "type": "keyword" + }, + "acktime": { + "ignore_above": 1024, + "type": "keyword" + }, + "act": { + "ignore_above": 1024, + "type": "keyword" + }, + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "activity": { + "ignore_above": 1024, + "type": "keyword" + }, + "addr": { + "type": "ip" + }, + "addr_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "addrgrp": { + "ignore_above": 1024, + "type": "keyword" + }, + "adgroup": { + "ignore_above": 1024, + "type": "keyword" + }, + "admin": { + "ignore_above": 1024, + "type": "keyword" + }, + "age": { + "type": "long" + }, + "agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "alarmid": { + "type": "long" + }, + "alert": { + "ignore_above": 1024, + "type": "keyword" + }, + "analyticscksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "analyticssubmit": { + "ignore_above": 1024, + "type": "keyword" + }, + "ap": { + "ignore_above": 1024, + "type": "keyword" + }, + "app-type": { + "ignore_above": 1024, + "type": "keyword" + }, + "appact": { + "ignore_above": 1024, + "type": "keyword" + }, + "appid": { + "type": "long" + }, + "applist": { + "ignore_above": 1024, + "type": "keyword" + }, + "apprisk": { + "ignore_above": 1024, + "type": "keyword" + }, + "apscan": { + "ignore_above": 1024, + "type": "keyword" + }, + "apsn": { + "ignore_above": 1024, + "type": "keyword" + }, + "apstatus": { + "ignore_above": 1024, + "type": "keyword" + }, + "aptype": { + "ignore_above": 1024, + "type": "keyword" + }, + "assigned": { + "type": "ip" + }, + "assignip": { + "type": "ip" + }, + "attachment": { + "ignore_above": 1024, + "type": "keyword" + }, + "attack": { + "ignore_above": 1024, + "type": "keyword" + }, + "attackcontext": { + "ignore_above": 1024, + "type": "keyword" + }, + "attackcontextid": { + "ignore_above": 1024, + "type": "keyword" + }, + "attackid": { + "type": "long" + }, + "auditid": { + "type": "long" + }, + "auditscore": { + "ignore_above": 1024, + "type": "keyword" + }, + "audittime": { + "type": "long" + }, + "authgrp": { + "ignore_above": 1024, + "type": "keyword" + }, + "authid": { + "ignore_above": 1024, + "type": "keyword" + }, + "authproto": { + "ignore_above": 1024, + "type": "keyword" + }, + "authserver": { + "ignore_above": 1024, + "type": "keyword" + }, + "bandwidth": { + "ignore_above": 1024, + "type": "keyword" + }, + "banned_rule": { + "ignore_above": 1024, + "type": "keyword" + }, + "banned_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "banword": { + "ignore_above": 1024, + "type": "keyword" + }, + "botnetdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "botnetip": { + "type": "ip" + }, + "bssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "call_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "carrier_ep": { + "ignore_above": 1024, + "type": "keyword" + }, + "cat": { + "type": "long" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "cc": { + "ignore_above": 1024, + "type": "keyword" + }, + "cdrcontent": { + "ignore_above": 1024, + "type": "keyword" + }, + "centralnatid": { + "type": "long" + }, + "cert": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert-type": { + "ignore_above": 1024, + "type": "keyword" + }, + "certhash": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfgattr": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfgobj": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfgpath": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfgtid": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfgtxpower": { + "type": "long" + }, + "channel": { + "type": "long" + }, + "channeltype": { + "ignore_above": 1024, + "type": "keyword" + }, + "chassisid": { + "type": "long" + }, + "checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "chgheaders": { + "ignore_above": 1024, + "type": "keyword" + }, + "cldobjid": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_addr": { + "ignore_above": 1024, + "type": "keyword" + }, + "cloudaction": { + "ignore_above": 1024, + "type": "keyword" + }, + "clouduser": { + "ignore_above": 1024, + "type": "keyword" + }, + "column": { + "type": "long" + }, + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "community": { + "ignore_above": 1024, + "type": "keyword" + }, + "configcountry": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "conserve": { + "ignore_above": 1024, + "type": "keyword" + }, + "constraint": { + "ignore_above": 1024, + "type": "keyword" + }, + "contentdisarmed": { + "ignore_above": 1024, + "type": "keyword" + }, + "contenttype": { + "ignore_above": 1024, + "type": "keyword" + }, + "cookies": { + "ignore_above": 1024, + "type": "keyword" + }, + "count": { + "type": "long" + }, + "countapp": { + "type": "long" + }, + "countav": { + "type": "long" + }, + "countcifs": { + "type": "long" + }, + "countdlp": { + "type": "long" + }, + "countdns": { + "type": "long" + }, + "countemail": { + "type": "long" + }, + "countff": { + "type": "long" + }, + "countips": { + "type": "long" + }, + "countssh": { + "type": "long" + }, + "countssl": { + "type": "long" + }, + "countwaf": { + "type": "long" + }, + "countweb": { + "type": "long" + }, + "cpu": { + "type": "long" + }, + "craction": { + "type": "long" + }, + "criticalcount": { + "type": "long" + }, + "crl": { + "ignore_above": 1024, + "type": "keyword" + }, + "crlevel": { + "ignore_above": 1024, + "type": "keyword" + }, + "crscore": { + "type": "long" + }, + "cveid": { + "ignore_above": 1024, + "type": "keyword" + }, + "daemon": { + "ignore_above": 1024, + "type": "keyword" + }, + "datarange": { + "ignore_above": 1024, + "type": "keyword" + }, + "date": { + "ignore_above": 1024, + "type": "keyword" + }, + "ddnsserver": { + "type": "ip" + }, + "desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "detectionmethod": { + "ignore_above": 1024, + "type": "keyword" + }, + "devcategory": { + "ignore_above": 1024, + "type": "keyword" + }, + "devintfname": { + "ignore_above": 1024, + "type": "keyword" + }, + "devtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "dhcp_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "dintf": { + "ignore_above": 1024, + "type": "keyword" + }, + "disk": { + "ignore_above": 1024, + "type": "keyword" + }, + "disklograte": { + "type": "long" + }, + "dlpextra": { + "ignore_above": 1024, + "type": "keyword" + }, + "docsource": { + "ignore_above": 1024, + "type": "keyword" + }, + "domainctrlauthstate": { + "type": "long" + }, + "domainctrlauthtype": { + "type": "long" + }, + "domainctrldomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "domainctrlip": { + "type": "ip" + }, + "domainctrlname": { + "ignore_above": 1024, + "type": "keyword" + }, + "domainctrlprotocoltype": { + "type": "long" + }, + "domainctrlusername": { + "ignore_above": 1024, + "type": "keyword" + }, + "domainfilteridx": { + "type": "long" + }, + "domainfilterlist": { + "ignore_above": 1024, + "type": "keyword" + }, + "ds": { + "ignore_above": 1024, + "type": "keyword" + }, + "dst_int": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstcountry": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstdevcategory": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstdevtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstfamily": { + "ignore_above": 1024, + "type": "keyword" + }, + "dsthwvendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "dsthwversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstinetsvc": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstintfrole": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstosname": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstosversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstserver": { + "type": "long" + }, + "dstssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstswversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstunauthusersource": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstuuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "duid": { + "ignore_above": 1024, + "type": "keyword" + }, + "eapolcnt": { + "type": "long" + }, + "eapoltype": { + "ignore_above": 1024, + "type": "keyword" + }, + "encrypt": { + "type": "long" + }, + "encryption": { + "ignore_above": 1024, + "type": "keyword" + }, + "epoch": { + "type": "long" + }, + "espauth": { + "ignore_above": 1024, + "type": "keyword" + }, + "esptransform": { + "ignore_above": 1024, + "type": "keyword" + }, + "exch": { + "ignore_above": 1024, + "type": "keyword" + }, + "exchange": { + "ignore_above": 1024, + "type": "keyword" + }, + "expectedsignature": { + "ignore_above": 1024, + "type": "keyword" + }, + "expiry": { + "ignore_above": 1024, + "type": "keyword" + }, + "fams_pause": { + "type": "long" + }, + "fazlograte": { + "type": "long" + }, + "fctemssn": { + "ignore_above": 1024, + "type": "keyword" + }, + "fctuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "field": { + "ignore_above": 1024, + "type": "keyword" + }, + "filefilter": { + "ignore_above": 1024, + "type": "keyword" + }, + "filehashsrc": { + "ignore_above": 1024, + "type": "keyword" + }, + "filtercat": { + "ignore_above": 1024, + "type": "keyword" + }, + "filteridx": { + "type": "long" + }, + "filtername": { + "ignore_above": 1024, + "type": "keyword" + }, + "filtertype": { + "ignore_above": 1024, + "type": "keyword" + }, + "fortiguardresp": { + "ignore_above": 1024, + "type": "keyword" + }, + "forwardedfor": { + "ignore_above": 1024, + "type": "keyword" + }, + "fqdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "frametype": { + "ignore_above": 1024, + "type": "keyword" + }, + "freediskstorage": { + "type": "long" + }, + "from": { + "ignore_above": 1024, + "type": "keyword" + }, + "from_vcluster": { + "type": "long" + }, + "fsaverdict": { + "ignore_above": 1024, + "type": "keyword" + }, + "fwserver_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gateway": { + "type": "ip" + }, + "green": { + "ignore_above": 1024, + "type": "keyword" + }, + "groupid": { + "type": "long" + }, + "ha-prio": { + "type": "long" + }, + "ha_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "ha_role": { + "ignore_above": 1024, + "type": "keyword" + }, + "handshake": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "hbdn_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "highcount": { + "type": "long" + }, + "host": { + "ignore_above": 1024, + "type": "keyword" + }, + "iaid": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmpcode": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmpid": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmptype": { + "ignore_above": 1024, + "type": "keyword" + }, + "identifier": { + "type": "long" + }, + "in_spi": { + "ignore_above": 1024, + "type": "keyword" + }, + "incidentserialno": { + "type": "long" + }, + "infected": { + "type": "long" + }, + "infectedfilelevel": { + "type": "long" + }, + "informationsource": { + "ignore_above": 1024, + "type": "keyword" + }, + "init": { + "ignore_above": 1024, + "type": "keyword" + }, + "initiator": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "intf": { + "ignore_above": 1024, + "type": "keyword" + }, + "invalidmac": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "iptype": { + "ignore_above": 1024, + "type": "keyword" + }, + "keyword": { + "ignore_above": 1024, + "type": "keyword" + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "lanin": { + "type": "long" + }, + "lanout": { + "type": "long" + }, + "lease": { + "type": "long" + }, + "license_limit": { + "ignore_above": 1024, + "type": "keyword" + }, + "limit": { + "type": "long" + }, + "line": { + "ignore_above": 1024, + "type": "keyword" + }, + "live": { + "type": "long" + }, + "local": { + "type": "ip" + }, + "log": { + "ignore_above": 1024, + "type": "keyword" + }, + "login": { + "ignore_above": 1024, + "type": "keyword" + }, + "lowcount": { + "type": "long" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "malform_data": { + "type": "long" + }, + "malform_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "manuf": { + "ignore_above": 1024, + "type": "keyword" + }, + "masterdstmac": { + "ignore_above": 1024, + "type": "keyword" + }, + "mastersrcmac": { + "ignore_above": 1024, + "type": "keyword" + }, + "mediumcount": { + "type": "long" + }, + "mem": { + "type": "long" + }, + "meshmode": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "mgmtcnt": { + "type": "long" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "monitor-name": { + "ignore_above": 1024, + "type": "keyword" + }, + "monitor-type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mpsk": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgproto": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtu": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "ignore_above": 1024, + "type": "keyword" + }, + "netid": { + "ignore_above": 1024, + "type": "keyword" + }, + "new_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "new_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "newchannel": { + "type": "long" + }, + "newchassisid": { + "type": "long" + }, + "newslot": { + "type": "long" + }, + "nextstat": { + "type": "long" + }, + "nf_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "noise": { + "type": "long" + }, + "old_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldchannel": { + "type": "long" + }, + "oldchassisid": { + "type": "long" + }, + "oldslot": { + "type": "long" + }, + "oldsn": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldwprof": { + "ignore_above": 1024, + "type": "keyword" + }, + "onwire": { + "ignore_above": 1024, + "type": "keyword" + }, + "opercountry": { + "ignore_above": 1024, + "type": "keyword" + }, + "opertxpower": { + "type": "long" + }, + "osname": { + "ignore_above": 1024, + "type": "keyword" + }, + "osversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "out_spi": { + "ignore_above": 1024, + "type": "keyword" + }, + "outintf": { + "ignore_above": 1024, + "type": "keyword" + }, + "passedcount": { + "type": "long" + }, + "passwd": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "peer": { + "ignore_above": 1024, + "type": "keyword" + }, + "peer_notif": { + "ignore_above": 1024, + "type": "keyword" + }, + "phase2_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "phone": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "policytype": { + "ignore_above": 1024, + "type": "keyword" + }, + "poolname": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "portbegin": { + "type": "long" + }, + "portend": { + "type": "long" + }, + "probeproto": { + "ignore_above": 1024, + "type": "keyword" + }, + "process": { + "ignore_above": 1024, + "type": "keyword" + }, + "processtime": { + "type": "long" + }, + "profile": { + "ignore_above": 1024, + "type": "keyword" + }, + "profile_vd": { + "ignore_above": 1024, + "type": "keyword" + }, + "profilegroup": { + "ignore_above": 1024, + "type": "keyword" + }, + "profiletype": { + "ignore_above": 1024, + "type": "keyword" + }, + "qtypeval": { + "type": "long" + }, + "quarskip": { + "ignore_above": 1024, + "type": "keyword" + }, + "quotaexceeded": { + "ignore_above": 1024, + "type": "keyword" + }, + "quotamax": { + "type": "long" + }, + "quotatype": { + "ignore_above": 1024, + "type": "keyword" + }, + "quotaused": { + "type": "long" + }, + "radioband": { + "ignore_above": 1024, + "type": "keyword" + }, + "radioid": { + "type": "long" + }, + "radioidclosest": { + "type": "long" + }, + "radioiddetected": { + "type": "long" + }, + "rate": { + "ignore_above": 1024, + "type": "keyword" + }, + "rawdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "rawdataid": { + "ignore_above": 1024, + "type": "keyword" + }, + "rcvddelta": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "received": { + "type": "long" + }, + "receivedsignature": { + "ignore_above": 1024, + "type": "keyword" + }, + "red": { + "ignore_above": 1024, + "type": "keyword" + }, + "referralurl": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote": { + "type": "ip" + }, + "remotewtptime": { + "ignore_above": 1024, + "type": "keyword" + }, + "reporttype": { + "ignore_above": 1024, + "type": "keyword" + }, + "reqtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "result": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "rssi": { + "type": "long" + }, + "rsso_key": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruledata": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruletype": { + "ignore_above": 1024, + "type": "keyword" + }, + "scanned": { + "type": "long" + }, + "scantime": { + "type": "long" + }, + "scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "security": { + "ignore_above": 1024, + "type": "keyword" + }, + "sensitivity": { + "ignore_above": 1024, + "type": "keyword" + }, + "sensor": { + "ignore_above": 1024, + "type": "keyword" + }, + "sentdelta": { + "ignore_above": 1024, + "type": "keyword" + }, + "seq": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "serialno": { + "ignore_above": 1024, + "type": "keyword" + }, + "server": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "sessionid": { + "type": "long" + }, + "setuprate": { + "type": "long" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "shaperdroprcvdbyte": { + "type": "long" + }, + "shaperdropsentbyte": { + "type": "long" + }, + "shaperperipdropbyte": { + "type": "long" + }, + "shaperperipname": { + "ignore_above": 1024, + "type": "keyword" + }, + "shaperrcvdname": { + "ignore_above": 1024, + "type": "keyword" + }, + "shapersentname": { + "ignore_above": 1024, + "type": "keyword" + }, + "shapingpolicyid": { + "type": "long" + }, + "signal": { + "type": "long" + }, + "size": { + "type": "long" + }, + "slot": { + "type": "long" + }, + "sn": { + "ignore_above": 1024, + "type": "keyword" + }, + "snclosest": { + "ignore_above": 1024, + "type": "keyword" + }, + "sndetected": { + "ignore_above": 1024, + "type": "keyword" + }, + "snmeshparent": { + "ignore_above": 1024, + "type": "keyword" + }, + "spi": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_int": { + "ignore_above": 1024, + "type": "keyword" + }, + "srccountry": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcfamily": { + "ignore_above": 1024, + "type": "keyword" + }, + "srchwvendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "srchwversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcinetsvc": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcintfrole": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcname": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcserver": { + "type": "long" + }, + "srcssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcswversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcuuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "sscname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "sslaction": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssllocal": { + "ignore_above": 1024, + "type": "keyword" + }, + "sslremote": { + "ignore_above": 1024, + "type": "keyword" + }, + "stacount": { + "type": "long" + }, + "stage": { + "ignore_above": 1024, + "type": "keyword" + }, + "stamac": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "stitch": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "submodule": { + "ignore_above": 1024, + "type": "keyword" + }, + "subservice": { + "ignore_above": 1024, + "type": "keyword" + }, + "subtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "suspicious": { + "type": "long" + }, + "switchproto": { + "ignore_above": 1024, + "type": "keyword" + }, + "sync_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "sync_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "sysuptime": { + "ignore_above": 1024, + "type": "keyword" + }, + "tamac": { + "ignore_above": 1024, + "type": "keyword" + }, + "threattype": { + "ignore_above": 1024, + "type": "keyword" + }, + "time": { + "ignore_above": 1024, + "type": "keyword" + }, + "to": { + "ignore_above": 1024, + "type": "keyword" + }, + "to_vcluster": { + "type": "long" + }, + "total": { + "type": "long" + }, + "totalsession": { + "type": "long" + }, + "trace_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "trandisp": { + "ignore_above": 1024, + "type": "keyword" + }, + "transid": { + "type": "long" + }, + "translationid": { + "ignore_above": 1024, + "type": "keyword" + }, + "trigger": { + "ignore_above": 1024, + "type": "keyword" + }, + "trueclntip": { + "type": "ip" + }, + "tunnelid": { + "type": "long" + }, + "tunnelip": { + "type": "ip" + }, + "tunneltype": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "ui": { + "ignore_above": 1024, + "type": "keyword" + }, + "unauthusersource": { + "ignore_above": 1024, + "type": "keyword" + }, + "unit": { + "type": "long" + }, + "urlfilteridx": { + "type": "long" + }, + "urlfilterlist": { + "ignore_above": 1024, + "type": "keyword" + }, + "urlsource": { + "ignore_above": 1024, + "type": "keyword" + }, + "urltype": { + "ignore_above": 1024, + "type": "keyword" + }, + "used": { + "type": "long" + }, + "used_for_type": { + "type": "long" + }, + "utmaction": { + "ignore_above": 1024, + "type": "keyword" + }, + "vap": { + "ignore_above": 1024, + "type": "keyword" + }, + "vapmode": { + "ignore_above": 1024, + "type": "keyword" + }, + "vcluster": { + "type": "long" + }, + "vcluster_member": { + "type": "long" + }, + "vcluster_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "vd": { + "ignore_above": 1024, + "type": "keyword" + }, + "vdname": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendorurl": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "vip": { + "ignore_above": 1024, + "type": "keyword" + }, + "virus": { + "ignore_above": 1024, + "type": "keyword" + }, + "virusid": { + "type": "long" + }, + "voip_proto": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpn": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpntunnel": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpntype": { + "ignore_above": 1024, + "type": "keyword" + }, + "vrf": { + "type": "long" + }, + "vulncat": { + "ignore_above": 1024, + "type": "keyword" + }, + "vulnid": { + "type": "long" + }, + "vulnname": { + "ignore_above": 1024, + "type": "keyword" + }, + "vwlid": { + "type": "long" + }, + "vwlquality": { + "ignore_above": 1024, + "type": "keyword" + }, + "vwlservice": { + "ignore_above": 1024, + "type": "keyword" + }, + "vwpvlanid": { + "type": "long" + }, + "wanin": { + "type": "long" + }, + "wanoptapptype": { + "ignore_above": 1024, + "type": "keyword" + }, + "wanout": { + "type": "long" + }, + "weakwepiv": { + "ignore_above": 1024, + "type": "keyword" + }, + "xauthgroup": { + "ignore_above": 1024, + "type": "keyword" + }, + "xauthuser": { + "ignore_above": 1024, + "type": "keyword" + }, + "xid": { + "type": "long" + } + } + } + } + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "googlecloud": { + "properties": { + "audit": { + "properties": { + "authentication_info": { + "properties": { + "authority_selector": { + "ignore_above": 1024, + "type": "keyword" + }, + "principal_email": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "method_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "num_response_items": { + "type": "long" + }, + "request": { + "properties": { + "filter": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "proto_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "request_metadata": { + "properties": { + "caller_ip": { + "type": "ip" + }, + "caller_supplied_user_agent": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resource_location": { + "properties": { + "current_locations": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resource_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "response": { + "properties": { + "details": { + "properties": { + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "proto_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "properties": { + "code": { + "type": "long" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "destination": { + "properties": { + "instance": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpc": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "subnetwork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpc_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "firewall": { + "properties": { + "rule_details": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_range": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "type": "long" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_range": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_service_account": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_tag": { + "ignore_above": 1024, + "type": "keyword" + }, + "target_service_account": { + "ignore_above": 1024, + "type": "keyword" + }, + "target_tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "source": { + "properties": { + "instance": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpc": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "subnetwork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpc_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "vpcflow": { + "properties": { + "reporter": { + "ignore_above": 1024, + "type": "keyword" + }, + "rtt": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + } + } + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "gsuite": { + "properties": { + "actor": { + "properties": { + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "admin": { + "properties": { + "alert": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "api": { + "properties": { + "client": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scopes": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "application": { + "properties": { + "asp_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "edition": { + "ignore_above": 1024, + "type": "keyword" + }, + "enabled": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "licences_order_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "licences_purchased": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "package_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bulk_upload": { + "properties": { + "failed": { + "type": "long" + }, + "total": { + "type": "long" + } + } + }, + "chrome_licenses": { + "properties": { + "allowed": { + "ignore_above": 1024, + "type": "keyword" + }, + "enabled": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "chrome_os": { + "properties": { + "session_type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "device": { + "properties": { + "command_details": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "distribution": { + "properties": { + "entity": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "domain": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "secondary_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "properties": { + "log_search_filter": { + "properties": { + "end_date": { + "type": "date" + }, + "message_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "recipient": { + "properties": { + "ip": { + "type": "ip" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sender": { + "properties": { + "ip": { + "type": "ip" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start_date": { + "type": "date" + } + } + }, + "quarantine_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email_dump": { + "properties": { + "include_deleted": { + "type": "boolean" + }, + "package_content": { + "ignore_above": 1024, + "type": "keyword" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email_monitor": { + "properties": { + "dest_email": { + "ignore_above": 1024, + "type": "keyword" + }, + "level": { + "properties": { + "chat": { + "ignore_above": 1024, + "type": "keyword" + }, + "draft": { + "ignore_above": 1024, + "type": "keyword" + }, + "incoming": { + "ignore_above": 1024, + "type": "keyword" + }, + "outgoing": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "field": { + "ignore_above": 1024, + "type": "keyword" + }, + "gateway": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "group": { + "properties": { + "allowed_list": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "priorities": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "info_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "managed_configuration": { + "ignore_above": 1024, + "type": "keyword" + }, + "mdm": { + "properties": { + "token": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mobile": { + "properties": { + "action": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "certificate": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "company_owned_devices": { + "type": "long" + } + } + }, + "new_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "non_featured_services_selection": { + "ignore_above": 1024, + "type": "keyword" + }, + "oauth2": { + "properties": { + "application": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "old_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "org_unit": { + "properties": { + "full": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "print_server": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "printer": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "privilege": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "product": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sku": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "request": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resource": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "role": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rule": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "setting": { + "properties": { + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "birthdate": { + "type": "date" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "nickname": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user_defined_setting": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "verification_method": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "drive": { + "properties": { + "added_role": { + "ignore_above": 1024, + "type": "keyword" + }, + "billable": { + "type": "boolean" + }, + "destination_folder_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_folder_title": { + "ignore_above": 1024, + "type": "keyword" + }, + "file": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "properties": { + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_shared_drive": { + "type": "boolean" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "membership_change_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "new_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_visibility": { + "ignore_above": 1024, + "type": "keyword" + }, + "originating_app_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "primary_event": { + "type": "boolean" + }, + "removed_role": { + "ignore_above": 1024, + "type": "keyword" + }, + "shared_drive_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "shared_drive_settings_change_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "sheets_import_range_recipient_doc": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_folder_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_folder_title": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "ignore_above": 1024, + "type": "keyword" + }, + "target_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "visibility": { + "ignore_above": 1024, + "type": "keyword" + }, + "visibility_change": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "groups": { + "properties": { + "acl_permission": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "member": { + "properties": { + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "message": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "moderation_action": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "new_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "old_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "setting": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "login": { + "properties": { + "affected_email_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "challenge_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "failure_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_second_factor": { + "type": "boolean" + }, + "is_suspicious": { + "type": "boolean" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "organization": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saml": { + "properties": { + "application_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "failure_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "initiated_by": { + "ignore_above": 1024, + "type": "keyword" + }, + "orgunit_path": { + "ignore_above": 1024, + "type": "keyword" + }, + "second_level_status_code": { + "type": "long" + }, + "status_code": { + "type": "long" + } + } + } + } + }, + "haproxy": { + "properties": { + "backend_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "backend_queue": { + "type": "long" + }, + "bind_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes_read": { + "type": "long" + }, + "client": { + "type": "object" + }, + "connection_wait_time_ms": { + "type": "long" + }, + "connections": { + "properties": { + "active": { + "type": "long" + }, + "backend": { + "type": "long" + }, + "frontend": { + "type": "long" + }, + "retries": { + "type": "long" + }, + "server": { + "type": "long" + } + } + }, + "destination": { + "type": "object" + }, + "error_message": { + "norms": false, + "type": "text" + }, + "frontend_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "type": "object" + }, + "http": { + "properties": { + "request": { + "properties": { + "captured_cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "captured_headers": { + "ignore_above": 1024, + "type": "keyword" + }, + "raw_request_line": { + "ignore_above": 1024, + "type": "keyword" + }, + "time_wait_ms": { + "type": "long" + }, + "time_wait_without_data_ms": { + "type": "long" + } + } + }, + "response": { + "properties": { + "captured_cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "captured_headers": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "server_queue": { + "type": "long" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp": { + "properties": { + "connection_waiting_time_ms": { + "type": "long" + } + } + }, + "termination_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "time_backend_connect": { + "type": "long" + }, + "time_queue": { + "type": "long" + }, + "total_waiting_time_ms": { + "type": "long" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "host": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "containerized": { + "type": "boolean" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "build": { + "ignore_above": 1024, + "type": "keyword" + }, + "codename": { + "ignore_above": 1024, + "type": "keyword" + }, + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "http": { + "properties": { + "request": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bytes": { + "type": "long" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "bytes": { + "type": "long" + }, + "status_code": { + "type": "long" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ibmmq": { + "properties": { + "errorlog": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "arithinsert": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "commentinsert": { + "ignore_above": 1024, + "type": "keyword" + }, + "errordescription": { + "norms": false, + "type": "text" + }, + "explanation": { + "ignore_above": 1024, + "type": "keyword" + }, + "installation": { + "ignore_above": 1024, + "type": "keyword" + }, + "qmgr": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "icinga": { + "properties": { + "debug": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "main": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "startup": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "icmp": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "igmp": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "iis": { + "properties": { + "access": { + "properties": { + "cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "type": "object" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "site_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sub_status": { + "type": "long" + }, + "user_agent": { + "type": "object" + }, + "win32_status": { + "type": "long" + } + } + }, + "error": { + "properties": { + "geoip": { + "type": "object" + }, + "queue_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason_phrase": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "input": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "iptables": { + "properties": { + "ether_type": { + "type": "long" + }, + "flow_label": { + "type": "long" + }, + "fragment_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment_offset": { + "type": "long" + }, + "icmp": { + "properties": { + "code": { + "type": "long" + }, + "id": { + "type": "long" + }, + "parameter": { + "type": "long" + }, + "redirect": { + "type": "ip" + }, + "seq": { + "type": "long" + }, + "type": { + "type": "long" + } + } + }, + "id": { + "type": "long" + }, + "incomplete_bytes": { + "type": "long" + }, + "input_device": { + "ignore_above": 1024, + "type": "keyword" + }, + "length": { + "type": "long" + }, + "output_device": { + "ignore_above": 1024, + "type": "keyword" + }, + "precedence_bits": { + "type": "short" + }, + "tcp": { + "properties": { + "ack": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "reserved_bits": { + "type": "short" + }, + "seq": { + "type": "long" + }, + "window": { + "type": "long" + } + } + }, + "tos": { + "type": "long" + }, + "ttl": { + "type": "long" + }, + "ubiquiti": { + "properties": { + "input_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "output_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_set": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "udp": { + "properties": { + "length": { + "type": "long" + } + } + } + } + }, + "jolokia": { + "properties": { + "agent": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "secured": { + "type": "boolean" + }, + "server": { + "properties": { + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kafka": { + "properties": { + "block_timestamp": { + "type": "date" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "log": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "component": { + "ignore_above": 1024, + "type": "keyword" + }, + "thread": { + "ignore_above": 1024, + "type": "keyword" + }, + "trace": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "norms": false, + "type": "text" + } + } + } + } + }, + "offset": { + "type": "long" + }, + "partition": { + "type": "long" + }, + "topic": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kibana": { + "properties": { + "log": { + "properties": { + "meta": { + "properties": { + "error": { + "properties": { + "message": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "stack": { + "type": "keyword" + } + } + }, + "level": { + "type": "keyword" + }, + "prevMsg": { + "type": "keyword" + }, + "prevState": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "url": { + "properties": { + "href": { + "type": "keyword" + }, + "path": { + "type": "keyword" + }, + "pathname": { + "type": "keyword" + }, + "query": { + "properties": { + "end": { + "type": "keyword" + }, + "filterNames": { + "type": "keyword" + }, + "serviceName": { + "type": "keyword" + }, + "start": { + "type": "keyword" + }, + "transactionName": { + "type": "keyword" + }, + "transactionType": { + "type": "keyword" + }, + "uiFilters": { + "type": "keyword" + } + } + }, + "search": { + "type": "keyword" + } + } + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "kubernetes": { + "properties": { + "annotations": { + "properties": { + "*": { + "type": "object" + } + } + }, + "container": { + "properties": { + "image": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "deployment": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "properties": { + "*": { + "type": "object" + }, + "app": { + "type": "keyword" + }, + "chart": { + "type": "keyword" + }, + "component": { + "type": "keyword" + }, + "controller-revision-hash": { + "type": "keyword" + }, + "controller-uid": { + "type": "keyword" + }, + "heritage": { + "type": "keyword" + }, + "job-name": { + "type": "keyword" + }, + "pod-template-hash": { + "type": "keyword" + }, + "release": { + "type": "keyword" + }, + "role": { + "type": "keyword" + }, + "service": { + "type": "keyword" + }, + "statefulset_kubernetes_io/pod-name": { + "type": "keyword" + } + } + }, + "namespace": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pod": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "replicaset": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "statefulset": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "labels": { + "type": "object" + }, + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "offset": { + "type": "long" + }, + "origin": { + "properties": { + "file": { + "properties": { + "line": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "function": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "original": { + "ignore_above": 1024, + "index": false, + "type": "keyword" + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "syslog": { + "properties": { + "facility": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "priority": { + "type": "long" + }, + "severity": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "logstash": { + "properties": { + "log": { + "properties": { + "log_event": { + "type": "object" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "pipeline_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "thread": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "slowlog": { + "properties": { + "event": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "plugin_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "plugin_params": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "plugin_params_object": { + "type": "object" + }, + "plugin_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "thread": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "took_in_millis": { + "type": "long" + } + } + } + } + }, + "message": { + "norms": false, + "type": "text" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "microsoft": { + "properties": { + "defender_atp": { + "properties": { + "assignedTo": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification": { + "ignore_above": 1024, + "type": "keyword" + }, + "determination": { + "ignore_above": 1024, + "type": "keyword" + }, + "evidence": { + "properties": { + "aadUserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "accountName": { + "ignore_above": 1024, + "type": "keyword" + }, + "domainName": { + "ignore_above": 1024, + "type": "keyword" + }, + "entityType": { + "ignore_above": 1024, + "type": "keyword" + }, + "ipAddress": { + "type": "ip" + }, + "userPrincipalName": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "incidentId": { + "ignore_above": 1024, + "type": "keyword" + }, + "investigationId": { + "ignore_above": 1024, + "type": "keyword" + }, + "investigationState": { + "ignore_above": 1024, + "type": "keyword" + }, + "lastUpdateTime": { + "type": "date" + }, + "rbacGroupName": { + "ignore_above": 1024, + "type": "keyword" + }, + "resolvedTime": { + "type": "date" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "threatFamilyName": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "misp": { + "properties": { + "attack_pattern": { + "properties": { + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "kill_chain_phases": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "campaign": { + "properties": { + "aliases": { + "norms": false, + "type": "text" + }, + "description": { + "norms": false, + "type": "text" + }, + "first_seen": { + "type": "date" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_seen": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "objective": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "course_of_action": { + "properties": { + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "identity": { + "properties": { + "contact_information": { + "norms": false, + "type": "text" + }, + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "identity_class": { + "ignore_above": 1024, + "type": "keyword" + }, + "labels": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sectors": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "intrusion_set": { + "properties": { + "aliases": { + "norms": false, + "type": "text" + }, + "description": { + "norms": false, + "type": "text" + }, + "first_seen": { + "type": "date" + }, + "goals": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_seen": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "primary_motivation": { + "norms": false, + "type": "text" + }, + "resource_level": { + "norms": false, + "type": "text" + }, + "secondary_motivations": { + "norms": false, + "type": "text" + } + } + }, + "malware": { + "properties": { + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "kill_chain_phases": { + "ignore_above": 1024, + "type": "keyword" + }, + "labels": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "note": { + "properties": { + "authors": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "object_refs": { + "ignore_above": 1024, + "type": "keyword" + }, + "summary": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "observed_data": { + "properties": { + "first_observed": { + "type": "date" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_observed": { + "type": "date" + }, + "number_observed": { + "type": "long" + }, + "objects": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "report": { + "properties": { + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "labels": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "object_refs": { + "norms": false, + "type": "text" + }, + "published": { + "type": "date" + } + } + }, + "threat_actor": { + "properties": { + "aliases": { + "norms": false, + "type": "text" + }, + "description": { + "norms": false, + "type": "text" + }, + "goals": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "labels": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "personal_motivations": { + "norms": false, + "type": "text" + }, + "primary_motivation": { + "norms": false, + "type": "text" + }, + "resource_level": { + "norms": false, + "type": "text" + }, + "roles": { + "norms": false, + "type": "text" + }, + "secondary_motivations": { + "norms": false, + "type": "text" + }, + "sophistication": { + "norms": false, + "type": "text" + } + } + }, + "threat_indicator": { + "properties": { + "attack_pattern": { + "ignore_above": 1024, + "type": "keyword" + }, + "attack_pattern_kql": { + "ignore_above": 1024, + "type": "keyword" + }, + "campaign": { + "ignore_above": 1024, + "type": "keyword" + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "norms": false, + "type": "text" + }, + "feed": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "intrusion_set": { + "ignore_above": 1024, + "type": "keyword" + }, + "kill_chain_phases": { + "ignore_above": 1024, + "type": "keyword" + }, + "labels": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_tactic": { + "ignore_above": 1024, + "type": "keyword" + }, + "mitre_technique": { + "ignore_above": 1024, + "type": "keyword" + }, + "negate": { + "type": "boolean" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_actor": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "valid_from": { + "type": "date" + }, + "valid_until": { + "type": "date" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tool": { + "properties": { + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "kill_chain_phases": { + "norms": false, + "type": "text" + }, + "labels": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tool_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vulnerability": { + "properties": { + "description": { + "norms": false, + "type": "text" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "mongodb": { + "properties": { + "log": { + "properties": { + "component": { + "ignore_above": 1024, + "type": "keyword" + }, + "context": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "mssql": { + "properties": { + "log": { + "properties": { + "origin": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "mysql": { + "properties": { + "error": { + "type": "object" + }, + "slowlog": { + "properties": { + "bytes_received": { + "type": "long" + }, + "bytes_sent": { + "type": "long" + }, + "current_user": { + "ignore_above": 1024, + "type": "keyword" + }, + "filesort": { + "type": "boolean" + }, + "filesort_on_disk": { + "type": "boolean" + }, + "full_join": { + "type": "boolean" + }, + "full_scan": { + "type": "boolean" + }, + "innodb": { + "properties": { + "io_r_bytes": { + "type": "long" + }, + "io_r_ops": { + "type": "long" + }, + "io_r_wait": { + "properties": { + "sec": { + "type": "long" + } + } + }, + "pages_distinct": { + "type": "long" + }, + "queue_wait": { + "properties": { + "sec": { + "type": "long" + } + } + }, + "rec_lock_wait": { + "properties": { + "sec": { + "type": "long" + } + } + }, + "trx_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "killed": { + "ignore_above": 1024, + "type": "keyword" + }, + "last_errno": { + "ignore_above": 1024, + "type": "keyword" + }, + "lock_time": { + "properties": { + "sec": { + "type": "float" + } + } + }, + "log_slow_rate_limit": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_slow_rate_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "merge_passes": { + "type": "long" + }, + "priority_queue": { + "type": "boolean" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "query_cache_hit": { + "type": "boolean" + }, + "read_first": { + "type": "long" + }, + "read_key": { + "type": "long" + }, + "read_last": { + "type": "long" + }, + "read_next": { + "type": "long" + }, + "read_prev": { + "type": "long" + }, + "read_rnd": { + "type": "long" + }, + "read_rnd_next": { + "type": "long" + }, + "rows_affected": { + "type": "long" + }, + "rows_examined": { + "type": "long" + }, + "rows_sent": { + "type": "long" + }, + "schema": { + "ignore_above": 1024, + "type": "keyword" + }, + "sort_merge_passes": { + "type": "long" + }, + "sort_range_count": { + "type": "long" + }, + "sort_rows": { + "type": "long" + }, + "sort_scan_count": { + "type": "long" + }, + "tmp_disk_tables": { + "type": "long" + }, + "tmp_table": { + "type": "boolean" + }, + "tmp_table_on_disk": { + "type": "boolean" + }, + "tmp_table_sizes": { + "type": "long" + }, + "tmp_tables": { + "type": "long" + } + } + }, + "thread_id": { + "type": "long" + } + } + }, + "nats": { + "properties": { + "log": { + "properties": { + "client": { + "properties": { + "id": { + "type": "long" + } + } + }, + "msg": { + "properties": { + "bytes": { + "type": "long" + }, + "error": { + "properties": { + "message": { + "norms": false, + "type": "text" + } + } + }, + "max_messages": { + "type": "long" + }, + "queue_group": { + "norms": false, + "type": "text" + }, + "reply_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "sid": { + "type": "long" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "netflow": { + "properties": { + "absolute_error": { + "type": "double" + }, + "address_pool_high_threshold": { + "type": "long" + }, + "address_pool_low_threshold": { + "type": "long" + }, + "address_port_mapping_high_threshold": { + "type": "long" + }, + "address_port_mapping_low_threshold": { + "type": "long" + }, + "address_port_mapping_per_user_high_threshold": { + "type": "long" + }, + "anonymization_flags": { + "type": "long" + }, + "anonymization_technique": { + "type": "long" + }, + "application_category_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_group_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_id": { + "type": "short" + }, + "application_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_sub_category_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "bgp_destination_as_number": { + "type": "long" + }, + "bgp_next_adjacent_as_number": { + "type": "long" + }, + "bgp_next_hop_ipv4_address": { + "type": "ip" + }, + "bgp_next_hop_ipv6_address": { + "type": "ip" + }, + "bgp_prev_adjacent_as_number": { + "type": "long" + }, + "bgp_source_as_number": { + "type": "long" + }, + "bgp_validity_state": { + "type": "short" + }, + "biflow_direction": { + "type": "short" + }, + "class_id": { + "type": "long" + }, + "class_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification_engine_id": { + "type": "short" + }, + "collection_time_milliseconds": { + "type": "date" + }, + "collector_certificate": { + "type": "short" + }, + "collector_ipv4_address": { + "type": "ip" + }, + "collector_ipv6_address": { + "type": "ip" + }, + "collector_transport_port": { + "type": "long" + }, + "common_properties_id": { + "type": "long" + }, + "confidence_level": { + "type": "double" + }, + "connection_sum_duration_seconds": { + "type": "long" + }, + "connection_transaction_id": { + "type": "long" + }, + "data_link_frame_section": { + "type": "short" + }, + "data_link_frame_size": { + "type": "long" + }, + "data_link_frame_type": { + "type": "long" + }, + "data_records_reliability": { + "type": "boolean" + }, + "delta_flow_count": { + "type": "long" + }, + "destination_ipv4_address": { + "type": "ip" + }, + "destination_ipv4_prefix": { + "type": "ip" + }, + "destination_ipv4_prefix_length": { + "type": "short" + }, + "destination_ipv6_address": { + "type": "ip" + }, + "destination_ipv6_prefix": { + "type": "ip" + }, + "destination_ipv6_prefix_length": { + "type": "short" + }, + "destination_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination_transport_port": { + "type": "long" + }, + "digest_hash_value": { + "type": "long" + }, + "distinct_count_of_destination_ip_address": { + "type": "long" + }, + "distinct_count_of_destination_ipv4_address": { + "type": "long" + }, + "distinct_count_of_destination_ipv6_address": { + "type": "long" + }, + "distinct_count_of_source_ip_address": { + "type": "long" + }, + "distinct_count_of_source_ipv4_address": { + "type": "long" + }, + "distinct_count_of_source_ipv6_address": { + "type": "long" + }, + "dot1q_customer_dei": { + "type": "boolean" + }, + "dot1q_customer_destination_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "dot1q_customer_priority": { + "type": "short" + }, + "dot1q_customer_source_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "dot1q_customer_vlan_id": { + "type": "long" + }, + "dot1q_dei": { + "type": "boolean" + }, + "dot1q_priority": { + "type": "short" + }, + "dot1q_service_instance_id": { + "type": "long" + }, + "dot1q_service_instance_priority": { + "type": "short" + }, + "dot1q_service_instance_tag": { + "type": "short" + }, + "dot1q_vlan_id": { + "type": "long" + }, + "dropped_layer2_octet_delta_count": { + "type": "long" + }, + "dropped_layer2_octet_total_count": { + "type": "long" + }, + "dropped_octet_delta_count": { + "type": "long" + }, + "dropped_octet_total_count": { + "type": "long" + }, + "dropped_packet_delta_count": { + "type": "long" + }, + "dropped_packet_total_count": { + "type": "long" + }, + "dst_traffic_index": { + "type": "long" + }, + "egress_broadcast_packet_total_count": { + "type": "long" + }, + "egress_interface": { + "type": "long" + }, + "egress_interface_type": { + "type": "long" + }, + "egress_physical_interface": { + "type": "long" + }, + "egress_unicast_packet_total_count": { + "type": "long" + }, + "egress_vrfid": { + "type": "long" + }, + "encrypted_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "engine_id": { + "type": "short" + }, + "engine_type": { + "type": "short" + }, + "ethernet_header_length": { + "type": "short" + }, + "ethernet_payload_length": { + "type": "long" + }, + "ethernet_total_length": { + "type": "long" + }, + "ethernet_type": { + "type": "long" + }, + "export_interface": { + "type": "long" + }, + "export_protocol_version": { + "type": "short" + }, + "export_sctp_stream_id": { + "type": "long" + }, + "export_transport_protocol": { + "type": "short" + }, + "exported_flow_record_total_count": { + "type": "long" + }, + "exported_message_total_count": { + "type": "long" + }, + "exported_octet_total_count": { + "type": "long" + }, + "exporter": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_id": { + "type": "long" + }, + "timestamp": { + "type": "date" + }, + "uptime_millis": { + "type": "long" + }, + "version": { + "type": "long" + } + } + }, + "exporter_certificate": { + "type": "short" + }, + "exporter_ipv4_address": { + "type": "ip" + }, + "exporter_ipv6_address": { + "type": "ip" + }, + "exporter_transport_port": { + "type": "long" + }, + "exporting_process_id": { + "type": "long" + }, + "external_address_realm": { + "type": "short" + }, + "firewall_event": { + "type": "short" + }, + "flags_and_sampler_id": { + "type": "long" + }, + "flow_active_timeout": { + "type": "long" + }, + "flow_direction": { + "type": "short" + }, + "flow_duration_microseconds": { + "type": "long" + }, + "flow_duration_milliseconds": { + "type": "long" + }, + "flow_end_delta_microseconds": { + "type": "long" + }, + "flow_end_microseconds": { + "type": "date" + }, + "flow_end_milliseconds": { + "type": "date" + }, + "flow_end_nanoseconds": { + "type": "date" + }, + "flow_end_reason": { + "type": "short" + }, + "flow_end_seconds": { + "type": "date" + }, + "flow_end_sys_up_time": { + "type": "long" + }, + "flow_id": { + "type": "long" + }, + "flow_idle_timeout": { + "type": "long" + }, + "flow_key_indicator": { + "type": "long" + }, + "flow_label_ipv6": { + "type": "long" + }, + "flow_sampling_time_interval": { + "type": "long" + }, + "flow_sampling_time_spacing": { + "type": "long" + }, + "flow_selected_flow_delta_count": { + "type": "long" + }, + "flow_selected_octet_delta_count": { + "type": "long" + }, + "flow_selected_packet_delta_count": { + "type": "long" + }, + "flow_selector_algorithm": { + "type": "long" + }, + "flow_start_delta_microseconds": { + "type": "long" + }, + "flow_start_microseconds": { + "type": "date" + }, + "flow_start_milliseconds": { + "type": "date" + }, + "flow_start_nanoseconds": { + "type": "date" + }, + "flow_start_seconds": { + "type": "date" + }, + "flow_start_sys_up_time": { + "type": "long" + }, + "forwarding_status": { + "type": "short" + }, + "fragment_flags": { + "type": "short" + }, + "fragment_identification": { + "type": "long" + }, + "fragment_offset": { + "type": "long" + }, + "global_address_mapping_high_threshold": { + "type": "long" + }, + "gre_key": { + "type": "long" + }, + "hash_digest_output": { + "type": "boolean" + }, + "hash_flow_domain": { + "type": "long" + }, + "hash_initialiser_value": { + "type": "long" + }, + "hash_ip_payload_offset": { + "type": "long" + }, + "hash_ip_payload_size": { + "type": "long" + }, + "hash_output_range_max": { + "type": "long" + }, + "hash_output_range_min": { + "type": "long" + }, + "hash_selected_range_max": { + "type": "long" + }, + "hash_selected_range_min": { + "type": "long" + }, + "http_content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_message_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_reason_phrase": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_request_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_request_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_request_target": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_status_code": { + "type": "long" + }, + "http_user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code_ipv4": { + "type": "short" + }, + "icmp_code_ipv6": { + "type": "short" + }, + "icmp_type_code_ipv4": { + "type": "long" + }, + "icmp_type_code_ipv6": { + "type": "long" + }, + "icmp_type_ipv4": { + "type": "short" + }, + "icmp_type_ipv6": { + "type": "short" + }, + "igmp_type": { + "type": "short" + }, + "ignored_data_record_total_count": { + "type": "long" + }, + "ignored_layer2_frame_total_count": { + "type": "long" + }, + "ignored_layer2_octet_total_count": { + "type": "long" + }, + "ignored_octet_total_count": { + "type": "long" + }, + "ignored_packet_total_count": { + "type": "long" + }, + "information_element_data_type": { + "type": "short" + }, + "information_element_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "information_element_id": { + "type": "long" + }, + "information_element_index": { + "type": "long" + }, + "information_element_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "information_element_range_begin": { + "type": "long" + }, + "information_element_range_end": { + "type": "long" + }, + "information_element_semantics": { + "type": "short" + }, + "information_element_units": { + "type": "long" + }, + "ingress_broadcast_packet_total_count": { + "type": "long" + }, + "ingress_interface": { + "type": "long" + }, + "ingress_interface_type": { + "type": "long" + }, + "ingress_multicast_packet_total_count": { + "type": "long" + }, + "ingress_physical_interface": { + "type": "long" + }, + "ingress_unicast_packet_total_count": { + "type": "long" + }, + "ingress_vrfid": { + "type": "long" + }, + "initiator_octets": { + "type": "long" + }, + "initiator_packets": { + "type": "long" + }, + "interface_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "intermediate_process_id": { + "type": "long" + }, + "internal_address_realm": { + "type": "short" + }, + "ip_class_of_service": { + "type": "short" + }, + "ip_diff_serv_code_point": { + "type": "short" + }, + "ip_header_length": { + "type": "short" + }, + "ip_header_packet_section": { + "type": "short" + }, + "ip_next_hop_ipv4_address": { + "type": "ip" + }, + "ip_next_hop_ipv6_address": { + "type": "ip" + }, + "ip_payload_length": { + "type": "long" + }, + "ip_payload_packet_section": { + "type": "short" + }, + "ip_precedence": { + "type": "short" + }, + "ip_sec_spi": { + "type": "long" + }, + "ip_total_length": { + "type": "long" + }, + "ip_ttl": { + "type": "short" + }, + "ip_version": { + "type": "short" + }, + "ipv4_ihl": { + "type": "short" + }, + "ipv4_options": { + "type": "long" + }, + "ipv4_router_sc": { + "type": "ip" + }, + "ipv6_extension_headers": { + "type": "long" + }, + "is_multicast": { + "type": "short" + }, + "layer2_frame_delta_count": { + "type": "long" + }, + "layer2_frame_total_count": { + "type": "long" + }, + "layer2_octet_delta_count": { + "type": "long" + }, + "layer2_octet_delta_sum_of_squares": { + "type": "long" + }, + "layer2_octet_total_count": { + "type": "long" + }, + "layer2_octet_total_sum_of_squares": { + "type": "long" + }, + "layer2_segment_id": { + "type": "long" + }, + "layer2packet_section_data": { + "type": "short" + }, + "layer2packet_section_offset": { + "type": "long" + }, + "layer2packet_section_size": { + "type": "long" + }, + "line_card_id": { + "type": "long" + }, + "lower_ci_limit": { + "type": "double" + }, + "max_bib_entries": { + "type": "long" + }, + "max_entries_per_user": { + "type": "long" + }, + "max_export_seconds": { + "type": "date" + }, + "max_flow_end_microseconds": { + "type": "date" + }, + "max_flow_end_milliseconds": { + "type": "date" + }, + "max_flow_end_nanoseconds": { + "type": "date" + }, + "max_flow_end_seconds": { + "type": "date" + }, + "max_fragments_pending_reassembly": { + "type": "long" + }, + "max_session_entries": { + "type": "long" + }, + "max_subscribers": { + "type": "long" + }, + "maximum_ip_total_length": { + "type": "long" + }, + "maximum_layer2_total_length": { + "type": "long" + }, + "maximum_ttl": { + "type": "short" + }, + "message_md5_checksum": { + "type": "short" + }, + "message_scope": { + "type": "short" + }, + "metering_process_id": { + "type": "long" + }, + "metro_evc_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "metro_evc_type": { + "type": "short" + }, + "mib_capture_time_semantics": { + "type": "short" + }, + "mib_context_engine_id": { + "type": "short" + }, + "mib_context_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_index_indicator": { + "type": "long" + }, + "mib_module_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_description": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_identifier": { + "type": "short" + }, + "mib_object_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_syntax": { + "ignore_above": 1024, + "type": "keyword" + }, + "mib_object_value_bits": { + "type": "short" + }, + "mib_object_value_counter": { + "type": "long" + }, + "mib_object_value_gauge": { + "type": "long" + }, + "mib_object_value_integer": { + "type": "long" + }, + "mib_object_value_ip_address": { + "type": "ip" + }, + "mib_object_value_octet_string": { + "type": "short" + }, + "mib_object_value_oid": { + "type": "short" + }, + "mib_object_value_time_ticks": { + "type": "long" + }, + "mib_object_value_unsigned": { + "type": "long" + }, + "mib_sub_identifier": { + "type": "long" + }, + "min_export_seconds": { + "type": "date" + }, + "min_flow_start_microseconds": { + "type": "date" + }, + "min_flow_start_milliseconds": { + "type": "date" + }, + "min_flow_start_nanoseconds": { + "type": "date" + }, + "min_flow_start_seconds": { + "type": "date" + }, + "minimum_ip_total_length": { + "type": "long" + }, + "minimum_layer2_total_length": { + "type": "long" + }, + "minimum_ttl": { + "type": "short" + }, + "mobile_imsi": { + "ignore_above": 1024, + "type": "keyword" + }, + "mobile_msisdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "monitoring_interval_end_milli_seconds": { + "type": "date" + }, + "monitoring_interval_start_milli_seconds": { + "type": "date" + }, + "mpls_label_stack_depth": { + "type": "long" + }, + "mpls_label_stack_length": { + "type": "long" + }, + "mpls_label_stack_section": { + "type": "short" + }, + "mpls_label_stack_section10": { + "type": "short" + }, + "mpls_label_stack_section2": { + "type": "short" + }, + "mpls_label_stack_section3": { + "type": "short" + }, + "mpls_label_stack_section4": { + "type": "short" + }, + "mpls_label_stack_section5": { + "type": "short" + }, + "mpls_label_stack_section6": { + "type": "short" + }, + "mpls_label_stack_section7": { + "type": "short" + }, + "mpls_label_stack_section8": { + "type": "short" + }, + "mpls_label_stack_section9": { + "type": "short" + }, + "mpls_payload_length": { + "type": "long" + }, + "mpls_payload_packet_section": { + "type": "short" + }, + "mpls_top_label_exp": { + "type": "short" + }, + "mpls_top_label_ipv4_address": { + "type": "ip" + }, + "mpls_top_label_ipv6_address": { + "type": "ip" + }, + "mpls_top_label_prefix_length": { + "type": "short" + }, + "mpls_top_label_stack_section": { + "type": "short" + }, + "mpls_top_label_ttl": { + "type": "short" + }, + "mpls_top_label_type": { + "type": "short" + }, + "mpls_vpn_route_distinguisher": { + "type": "short" + }, + "multicast_replication_factor": { + "type": "long" + }, + "nat_event": { + "type": "short" + }, + "nat_instance_id": { + "type": "long" + }, + "nat_originating_address_realm": { + "type": "short" + }, + "nat_pool_id": { + "type": "long" + }, + "nat_pool_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat_quota_exceeded_event": { + "type": "long" + }, + "nat_threshold_event": { + "type": "long" + }, + "nat_type": { + "type": "short" + }, + "new_connection_delta_count": { + "type": "long" + }, + "next_header_ipv6": { + "type": "short" + }, + "not_sent_flow_total_count": { + "type": "long" + }, + "not_sent_layer2_octet_total_count": { + "type": "long" + }, + "not_sent_octet_total_count": { + "type": "long" + }, + "not_sent_packet_total_count": { + "type": "long" + }, + "observation_domain_id": { + "type": "long" + }, + "observation_domain_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "observation_point_id": { + "type": "long" + }, + "observation_point_type": { + "type": "short" + }, + "observation_time_microseconds": { + "type": "date" + }, + "observation_time_milliseconds": { + "type": "date" + }, + "observation_time_nanoseconds": { + "type": "date" + }, + "observation_time_seconds": { + "type": "date" + }, + "observed_flow_total_count": { + "type": "long" + }, + "octet_delta_count": { + "type": "long" + }, + "octet_delta_sum_of_squares": { + "type": "long" + }, + "octet_total_count": { + "type": "long" + }, + "octet_total_sum_of_squares": { + "type": "long" + }, + "opaque_octets": { + "type": "short" + }, + "original_exporter_ipv4_address": { + "type": "ip" + }, + "original_exporter_ipv6_address": { + "type": "ip" + }, + "original_flows_completed": { + "type": "long" + }, + "original_flows_initiated": { + "type": "long" + }, + "original_flows_present": { + "type": "long" + }, + "original_observation_domain_id": { + "type": "long" + }, + "p2p_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "packet_delta_count": { + "type": "long" + }, + "packet_total_count": { + "type": "long" + }, + "padding_octets": { + "type": "short" + }, + "payload_length_ipv6": { + "type": "long" + }, + "port_id": { + "type": "long" + }, + "port_range_end": { + "type": "long" + }, + "port_range_num_ports": { + "type": "long" + }, + "port_range_start": { + "type": "long" + }, + "port_range_step_size": { + "type": "long" + }, + "post_destination_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "post_dot1q_customer_vlan_id": { + "type": "long" + }, + "post_dot1q_vlan_id": { + "type": "long" + }, + "post_ip_class_of_service": { + "type": "short" + }, + "post_ip_diff_serv_code_point": { + "type": "short" + }, + "post_ip_precedence": { + "type": "short" + }, + "post_layer2_octet_delta_count": { + "type": "long" + }, + "post_layer2_octet_total_count": { + "type": "long" + }, + "post_mcast_layer2_octet_delta_count": { + "type": "long" + }, + "post_mcast_layer2_octet_total_count": { + "type": "long" + }, + "post_mcast_octet_delta_count": { + "type": "long" + }, + "post_mcast_octet_total_count": { + "type": "long" + }, + "post_mcast_packet_delta_count": { + "type": "long" + }, + "post_mcast_packet_total_count": { + "type": "long" + }, + "post_mpls_top_label_exp": { + "type": "short" + }, + "post_napt_destination_transport_port": { + "type": "long" + }, + "post_napt_source_transport_port": { + "type": "long" + }, + "post_nat_destination_ipv4_address": { + "type": "ip" + }, + "post_nat_destination_ipv6_address": { + "type": "ip" + }, + "post_nat_source_ipv4_address": { + "type": "ip" + }, + "post_nat_source_ipv6_address": { + "type": "ip" + }, + "post_octet_delta_count": { + "type": "long" + }, + "post_octet_total_count": { + "type": "long" + }, + "post_packet_delta_count": { + "type": "long" + }, + "post_packet_total_count": { + "type": "long" + }, + "post_source_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "post_vlan_id": { + "type": "long" + }, + "private_enterprise_number": { + "type": "long" + }, + "protocol_identifier": { + "type": "short" + }, + "pseudo_wire_control_word": { + "type": "long" + }, + "pseudo_wire_destination_ipv4_address": { + "type": "ip" + }, + "pseudo_wire_id": { + "type": "long" + }, + "pseudo_wire_type": { + "type": "long" + }, + "relative_error": { + "type": "double" + }, + "responder_octets": { + "type": "long" + }, + "responder_packets": { + "type": "long" + }, + "rfc3550_jitter_microseconds": { + "type": "long" + }, + "rfc3550_jitter_milliseconds": { + "type": "long" + }, + "rfc3550_jitter_nanoseconds": { + "type": "long" + }, + "rtp_sequence_number": { + "type": "long" + }, + "sampler_id": { + "type": "short" + }, + "sampler_mode": { + "type": "short" + }, + "sampler_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sampler_random_interval": { + "type": "long" + }, + "sampling_algorithm": { + "type": "short" + }, + "sampling_flow_interval": { + "type": "long" + }, + "sampling_flow_spacing": { + "type": "long" + }, + "sampling_interval": { + "type": "long" + }, + "sampling_packet_interval": { + "type": "long" + }, + "sampling_packet_space": { + "type": "long" + }, + "sampling_population": { + "type": "long" + }, + "sampling_probability": { + "type": "double" + }, + "sampling_size": { + "type": "long" + }, + "sampling_time_interval": { + "type": "long" + }, + "sampling_time_space": { + "type": "long" + }, + "section_exported_octets": { + "type": "long" + }, + "section_offset": { + "type": "long" + }, + "selection_sequence_id": { + "type": "long" + }, + "selector_algorithm": { + "type": "long" + }, + "selector_id": { + "type": "long" + }, + "selector_id_total_flows_observed": { + "type": "long" + }, + "selector_id_total_flows_selected": { + "type": "long" + }, + "selector_id_total_pkts_observed": { + "type": "long" + }, + "selector_id_total_pkts_selected": { + "type": "long" + }, + "selector_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_scope": { + "type": "short" + }, + "source_ipv4_address": { + "type": "ip" + }, + "source_ipv4_prefix": { + "type": "ip" + }, + "source_ipv4_prefix_length": { + "type": "short" + }, + "source_ipv6_address": { + "type": "ip" + }, + "source_ipv6_prefix": { + "type": "ip" + }, + "source_ipv6_prefix_length": { + "type": "short" + }, + "source_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "source_transport_port": { + "type": "long" + }, + "source_transport_ports_limit": { + "type": "long" + }, + "src_traffic_index": { + "type": "long" + }, + "sta_ipv4_address": { + "type": "ip" + }, + "sta_mac_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "system_init_time_milliseconds": { + "type": "date" + }, + "tcp_ack_total_count": { + "type": "long" + }, + "tcp_acknowledgement_number": { + "type": "long" + }, + "tcp_control_bits": { + "type": "long" + }, + "tcp_destination_port": { + "type": "long" + }, + "tcp_fin_total_count": { + "type": "long" + }, + "tcp_header_length": { + "type": "short" + }, + "tcp_options": { + "type": "long" + }, + "tcp_psh_total_count": { + "type": "long" + }, + "tcp_rst_total_count": { + "type": "long" + }, + "tcp_sequence_number": { + "type": "long" + }, + "tcp_source_port": { + "type": "long" + }, + "tcp_syn_total_count": { + "type": "long" + }, + "tcp_urg_total_count": { + "type": "long" + }, + "tcp_urgent_pointer": { + "type": "long" + }, + "tcp_window_scale": { + "type": "long" + }, + "tcp_window_size": { + "type": "long" + }, + "template_id": { + "type": "long" + }, + "total_length_ipv4": { + "type": "long" + }, + "transport_octet_delta_count": { + "type": "long" + }, + "transport_packet_delta_count": { + "type": "long" + }, + "tunnel_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "udp_destination_port": { + "type": "long" + }, + "udp_message_length": { + "type": "long" + }, + "udp_source_port": { + "type": "long" + }, + "upper_ci_limit": { + "type": "double" + }, + "user_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "value_distribution_method": { + "type": "short" + }, + "virtual_station_interface_id": { + "type": "short" + }, + "virtual_station_interface_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_station_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_station_uuid": { + "type": "short" + }, + "vlan_id": { + "type": "long" + }, + "vpn_identifier": { + "type": "short" + }, + "vr_fname": { + "ignore_above": 1024, + "type": "keyword" + }, + "wlan_channel_id": { + "type": "short" + }, + "wlan_ssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "wtp_mac_address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "network": { + "properties": { + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "community_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "forwarded_ip": { + "type": "ip" + }, + "iana_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "inner": { + "properties": { + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "interface": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "transport": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "nginx": { + "properties": { + "access": { + "properties": { + "geoip": { + "type": "object" + }, + "http_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_ip_list": { + "ignore_above": 1024, + "type": "keyword" + }, + "response_code": { + "type": "long" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_agent": { + "type": "object" + }, + "user_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "error": { + "properties": { + "connection_id": { + "type": "long" + } + } + }, + "ingress_controller": { + "properties": { + "geoip": { + "type": "object" + }, + "http": { + "properties": { + "request": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "length": { + "type": "long" + }, + "time": { + "type": "double" + } + } + } + } + }, + "upstream": { + "properties": { + "alternative_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "response": { + "properties": { + "length": { + "type": "long" + }, + "status_code": { + "type": "long" + }, + "time": { + "type": "double" + } + } + } + } + }, + "user_agent": { + "type": "object" + } + } + } + } + }, + "o365": { + "properties": { + "audit": { + "properties": { + "ActorContextId": { + "ignore_above": 1024, + "type": "keyword" + }, + "ActorIpAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "ActorUserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "ActorYammerUserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "AlertEntityId": { + "ignore_above": 1024, + "type": "keyword" + }, + "AlertId": { + "ignore_above": 1024, + "type": "keyword" + }, + "AlertType": { + "ignore_above": 1024, + "type": "keyword" + }, + "AppId": { + "ignore_above": 1024, + "type": "keyword" + }, + "ApplicationDisplayName": { + "ignore_above": 1024, + "type": "keyword" + }, + "ApplicationId": { + "ignore_above": 1024, + "type": "keyword" + }, + "AzureActiveDirectoryEventType": { + "ignore_above": 1024, + "type": "keyword" + }, + "Category": { + "ignore_above": 1024, + "type": "keyword" + }, + "ClientAppId": { + "ignore_above": 1024, + "type": "keyword" + }, + "ClientIP": { + "ignore_above": 1024, + "type": "keyword" + }, + "ClientIPAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "ClientInfoString": { + "ignore_above": 1024, + "type": "keyword" + }, + "Comments": { + "norms": false, + "type": "text" + }, + "CorrelationId": { + "ignore_above": 1024, + "type": "keyword" + }, + "CreationTime": { + "ignore_above": 1024, + "type": "keyword" + }, + "CustomUniqueId": { + "ignore_above": 1024, + "type": "keyword" + }, + "Data": { + "ignore_above": 1024, + "type": "keyword" + }, + "DataType": { + "ignore_above": 1024, + "type": "keyword" + }, + "EntityType": { + "ignore_above": 1024, + "type": "keyword" + }, + "EventData": { + "ignore_above": 1024, + "type": "keyword" + }, + "EventSource": { + "ignore_above": 1024, + "type": "keyword" + }, + "ExceptionInfo": { + "properties": { + "*": { + "type": "object" + } + } + }, + "ExchangeMetaData": { + "properties": { + "*": { + "type": "object" + } + } + }, + "ExtendedProperties": { + "properties": { + "*": { + "type": "object" + } + } + }, + "ExternalAccess": { + "ignore_above": 1024, + "type": "keyword" + }, + "GroupName": { + "ignore_above": 1024, + "type": "keyword" + }, + "Id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ImplicitShare": { + "ignore_above": 1024, + "type": "keyword" + }, + "IncidentId": { + "ignore_above": 1024, + "type": "keyword" + }, + "InterSystemsId": { + "ignore_above": 1024, + "type": "keyword" + }, + "InternalLogonType": { + "ignore_above": 1024, + "type": "keyword" + }, + "IntraSystemId": { + "ignore_above": 1024, + "type": "keyword" + }, + "Item": { + "properties": { + "*": { + "properties": { + "*": { + "type": "object" + } + } + } + } + }, + "ItemName": { + "ignore_above": 1024, + "type": "keyword" + }, + "ItemType": { + "ignore_above": 1024, + "type": "keyword" + }, + "ListId": { + "ignore_above": 1024, + "type": "keyword" + }, + "ListItemUniqueId": { + "ignore_above": 1024, + "type": "keyword" + }, + "LogonError": { + "ignore_above": 1024, + "type": "keyword" + }, + "LogonType": { + "ignore_above": 1024, + "type": "keyword" + }, + "LogonUserSid": { + "ignore_above": 1024, + "type": "keyword" + }, + "MailboxGuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "MailboxOwnerMasterAccountSid": { + "ignore_above": 1024, + "type": "keyword" + }, + "MailboxOwnerSid": { + "ignore_above": 1024, + "type": "keyword" + }, + "MailboxOwnerUPN": { + "ignore_above": 1024, + "type": "keyword" + }, + "Members": { + "properties": { + "*": { + "type": "object" + } + } + }, + "ModifiedProperties": { + "properties": { + "*": { + "properties": { + "*": { + "type": "object" + } + } + } + } + }, + "Name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ObjectId": { + "ignore_above": 1024, + "type": "keyword" + }, + "Operation": { + "ignore_above": 1024, + "type": "keyword" + }, + "OrganizationId": { + "ignore_above": 1024, + "type": "keyword" + }, + "OrganizationName": { + "ignore_above": 1024, + "type": "keyword" + }, + "OriginatingServer": { + "ignore_above": 1024, + "type": "keyword" + }, + "Parameters": { + "properties": { + "*": { + "type": "object" + } + } + }, + "PolicyId": { + "ignore_above": 1024, + "type": "keyword" + }, + "RecordType": { + "ignore_above": 1024, + "type": "keyword" + }, + "ResultStatus": { + "ignore_above": 1024, + "type": "keyword" + }, + "SensitiveInfoDetectionIsIncluded": { + "ignore_above": 1024, + "type": "keyword" + }, + "SessionId": { + "ignore_above": 1024, + "type": "keyword" + }, + "Severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "SharePointMetaData": { + "properties": { + "*": { + "type": "object" + } + } + }, + "Site": { + "ignore_above": 1024, + "type": "keyword" + }, + "SiteUrl": { + "ignore_above": 1024, + "type": "keyword" + }, + "Source": { + "ignore_above": 1024, + "type": "keyword" + }, + "SourceFileExtension": { + "ignore_above": 1024, + "type": "keyword" + }, + "SourceFileName": { + "ignore_above": 1024, + "type": "keyword" + }, + "SourceRelativeUrl": { + "ignore_above": 1024, + "type": "keyword" + }, + "Status": { + "ignore_above": 1024, + "type": "keyword" + }, + "SupportTicketId": { + "ignore_above": 1024, + "type": "keyword" + }, + "TargetContextId": { + "ignore_above": 1024, + "type": "keyword" + }, + "TargetUserOrGroupName": { + "ignore_above": 1024, + "type": "keyword" + }, + "TargetUserOrGroupType": { + "ignore_above": 1024, + "type": "keyword" + }, + "TeamGuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "TeamName": { + "ignore_above": 1024, + "type": "keyword" + }, + "UniqueSharingId": { + "ignore_above": 1024, + "type": "keyword" + }, + "UserAgent": { + "ignore_above": 1024, + "type": "keyword" + }, + "UserId": { + "ignore_above": 1024, + "type": "keyword" + }, + "UserKey": { + "ignore_above": 1024, + "type": "keyword" + }, + "UserType": { + "ignore_above": 1024, + "type": "keyword" + }, + "Version": { + "ignore_above": 1024, + "type": "keyword" + }, + "WebId": { + "ignore_above": 1024, + "type": "keyword" + }, + "Workload": { + "ignore_above": 1024, + "type": "keyword" + }, + "YammerNetworkId": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "object_key": { + "ignore_above": 1024, + "type": "keyword" + }, + "observer": { + "properties": { + "egress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "okta": { + "properties": { + "actor": { + "properties": { + "alternate_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "display_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "authentication_context": { + "properties": { + "authentication_provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "authentication_step": { + "type": "long" + }, + "credential_provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "credential_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "external_session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "client": { + "properties": { + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "user_agent": { + "properties": { + "browser": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "ignore_above": 1024, + "type": "keyword" + }, + "raw_user_agent": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "debug_context": { + "properties": { + "debug_data": { + "properties": { + "device_fingerprint": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "request_uri": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_suspected": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "display_message": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "outcome": { + "properties": { + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "result": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "request": { + "properties": { + "ip_chain": { + "properties": { + "geographical_context": { + "properties": { + "city": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "geolocation": { + "type": "geo_point" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "security_context": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_proxy": { + "type": "boolean" + }, + "isp": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "transaction": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "organization": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "osquery": { + "properties": { + "result": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "calendar_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "unix_time": { + "type": "long" + } + } + } + } + }, + "package": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "build_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "install_scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "installed": { + "type": "date" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "panw": { + "properties": { + "panos": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "destination": { + "properties": { + "interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "endreason": { + "ignore_above": 1024, + "type": "keyword" + }, + "file": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "flow_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "nat": { + "properties": { + "community_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pcap_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ruleset": { + "ignore_above": 1024, + "type": "keyword" + }, + "sequence_number": { + "type": "long" + }, + "source": { + "properties": { + "interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "threat": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "passed": { + "type": "boolean" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pid": { + "type": "long" + }, + "postgresql": { + "properties": { + "log": { + "properties": { + "core_id": { + "type": "long" + }, + "database": { + "ignore_above": 1024, + "type": "keyword" + }, + "error": { + "properties": { + "code": { + "type": "long" + } + } + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "query_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "query_step": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "probability": { + "type": "float" + }, + "process": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "exists": { + "type": "boolean" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "exists": { + "type": "boolean" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "ppid": { + "type": "long" + }, + "start": { + "type": "date" + }, + "thread": { + "properties": { + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "uptime": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "ppid": { + "type": "long" + }, + "program": { + "ignore_above": 1024, + "type": "keyword" + }, + "start": { + "type": "date" + }, + "thread": { + "properties": { + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "uptime": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rabbitmq": { + "properties": { + "log": { + "properties": { + "pid": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "random_val": { + "type": "float" + }, + "redis": { + "properties": { + "log": { + "properties": { + "role": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "slowlog": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "cmd": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "properties": { + "us": { + "type": "long" + } + } + }, + "id": { + "type": "long" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "related": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "hosts": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "req": { + "properties": { + "headers": { + "properties": { + "accept": { + "ignore_above": 1024, + "type": "keyword" + }, + "accept-encoding": { + "ignore_above": 1024, + "type": "keyword" + }, + "accept-language": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection": { + "ignore_above": 1024, + "type": "keyword" + }, + "content-length": { + "ignore_above": 1024, + "type": "keyword" + }, + "content-type": { + "ignore_above": 1024, + "type": "keyword" + }, + "elastic-apm-traceparent": { + "ignore_above": 1024, + "type": "keyword" + }, + "host": { + "ignore_above": 1024, + "type": "keyword" + }, + "if-none-match": { + "ignore_above": 1024, + "type": "keyword" + }, + "proxy-connection": { + "ignore_above": 1024, + "type": "keyword" + }, + "referer": { + "ignore_above": 1024, + "type": "keyword" + }, + "traceparent": { + "ignore_above": 1024, + "type": "keyword" + }, + "transfer-encoding": { + "ignore_above": 1024, + "type": "keyword" + }, + "user-agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-forwarded-for": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-real-ip": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "type": "long" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "remoteAddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "remotePort": { + "type": "long" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "res": { + "properties": { + "headers": { + "properties": { + "allow": { + "ignore_above": 1024, + "type": "keyword" + }, + "cache-control": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection": { + "ignore_above": 1024, + "type": "keyword" + }, + "content-length": { + "ignore_above": 1024, + "type": "keyword" + }, + "content-type": { + "ignore_above": 1024, + "type": "keyword" + }, + "date": { + "ignore_above": 1024, + "type": "keyword" + }, + "etag": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer-policy": { + "ignore_above": 1024, + "type": "keyword" + }, + "server": { + "ignore_above": 1024, + "type": "keyword" + }, + "transfer-encoding": { + "ignore_above": 1024, + "type": "keyword" + }, + "vary": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-content-type-options": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-download-options": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-frame-options": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-permitted-cross-domain-policies": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-powered-by": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-request-id": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-runtime": { + "ignore_above": 1024, + "type": "keyword" + }, + "x-xss-protection": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "statusCode": { + "type": "long" + } + } + }, + "response": { + "ignore_above": 1024, + "type": "keyword" + }, + "responseTime": { + "type": "long" + }, + "rsa": { + "properties": { + "counters": { + "properties": { + "dclass_c1": { + "type": "long" + }, + "dclass_c1_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_c2": { + "type": "long" + }, + "dclass_c2_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_c3": { + "type": "long" + }, + "dclass_c3_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_r1": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_r1_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_r2": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_r2_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_r3": { + "ignore_above": 1024, + "type": "keyword" + }, + "dclass_r3_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_counter": { + "type": "long" + } + } + }, + "crypto": { + "properties": { + "cert_ca": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_common": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_error": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_host_cat": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_host_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_keysize": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "cipher_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "cipher_size_dst": { + "type": "long" + }, + "cipher_size_src": { + "type": "long" + }, + "cipher_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "crypto": { + "ignore_above": 1024, + "type": "keyword" + }, + "d_certauth": { + "ignore_above": 1024, + "type": "keyword" + }, + "https_insact": { + "ignore_above": 1024, + "type": "keyword" + }, + "https_valid": { + "ignore_above": 1024, + "type": "keyword" + }, + "ike": { + "ignore_above": 1024, + "type": "keyword" + }, + "ike_cookie1": { + "ignore_above": 1024, + "type": "keyword" + }, + "ike_cookie2": { + "ignore_above": 1024, + "type": "keyword" + }, + "peer": { + "ignore_above": 1024, + "type": "keyword" + }, + "peer_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "s_certauth": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "sig_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssl_ver_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssl_ver_src": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "db": { + "properties": { + "database": { + "ignore_above": 1024, + "type": "keyword" + }, + "db_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "db_pid": { + "type": "long" + }, + "index": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "ignore_above": 1024, + "type": "keyword" + }, + "lread": { + "type": "long" + }, + "lwrite": { + "type": "long" + }, + "permissions": { + "ignore_above": 1024, + "type": "keyword" + }, + "pread": { + "type": "long" + }, + "table_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "transact_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "properties": { + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "email_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "trans_from": { + "ignore_above": 1024, + "type": "keyword" + }, + "trans_to": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "endpoint": { + "properties": { + "host_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry_key": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry_value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "attachment": { + "ignore_above": 1024, + "type": "keyword" + }, + "binary": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_entropy": { + "type": "double" + }, + "file_vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "filename_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "filename_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "filename_tmp": { + "ignore_above": 1024, + "type": "keyword" + }, + "filesystem": { + "ignore_above": 1024, + "type": "keyword" + }, + "privilege": { + "ignore_above": 1024, + "type": "keyword" + }, + "task_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "healthcare": { + "properties": { + "patient_fname": { + "ignore_above": 1024, + "type": "keyword" + }, + "patient_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "patient_lname": { + "ignore_above": 1024, + "type": "keyword" + }, + "patient_mname": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "identity": { + "properties": { + "accesses": { + "ignore_above": 1024, + "type": "keyword" + }, + "auth_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "dn": { + "ignore_above": 1024, + "type": "keyword" + }, + "dn_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "dn_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "federated_idp": { + "ignore_above": 1024, + "type": "keyword" + }, + "federated_sp": { + "ignore_above": 1024, + "type": "keyword" + }, + "firstname": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_role": { + "ignore_above": 1024, + "type": "keyword" + }, + "lastname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ldap": { + "ignore_above": 1024, + "type": "keyword" + }, + "ldap_query": { + "ignore_above": 1024, + "type": "keyword" + }, + "ldap_response": { + "ignore_above": 1024, + "type": "keyword" + }, + "logon_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "logon_type_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "middlename": { + "ignore_above": 1024, + "type": "keyword" + }, + "org": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "profile": { + "ignore_above": 1024, + "type": "keyword" + }, + "realm": { + "ignore_above": 1024, + "type": "keyword" + }, + "service_account": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_dept": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_role": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_sid_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_sid_src": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "internal": { + "properties": { + "audit_class": { + "ignore_above": 1024, + "type": "keyword" + }, + "cid": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "dead": { + "type": "long" + }, + "device_class": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_ip": { + "type": "ip" + }, + "device_ipv6": { + "type": "ip" + }, + "device_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_type_id": { + "type": "long" + }, + "did": { + "ignore_above": 1024, + "type": "keyword" + }, + "entropy_req": { + "type": "long" + }, + "entropy_res": { + "type": "long" + }, + "entry": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "feed_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "feed_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "feed_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "forward_ip": { + "type": "ip" + }, + "forward_ipv6": { + "type": "ip" + }, + "hcode": { + "ignore_above": 1024, + "type": "keyword" + }, + "header_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "inode": { + "type": "long" + }, + "lc_cid": { + "ignore_above": 1024, + "type": "keyword" + }, + "lc_ctime": { + "type": "date" + }, + "level": { + "type": "long" + }, + "mcb_req": { + "type": "long" + }, + "mcb_res": { + "type": "long" + }, + "mcbc_req": { + "type": "long" + }, + "mcbc_res": { + "type": "long" + }, + "medium": { + "type": "long" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "messageid": { + "ignore_above": 1024, + "type": "keyword" + }, + "msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "msg_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "msg_vid": { + "ignore_above": 1024, + "type": "keyword" + }, + "node_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "nwe_callback_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "obj_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "obj_server": { + "ignore_above": 1024, + "type": "keyword" + }, + "obj_val": { + "ignore_above": 1024, + "type": "keyword" + }, + "parse_error": { + "ignore_above": 1024, + "type": "keyword" + }, + "payload_req": { + "type": "long" + }, + "payload_res": { + "type": "long" + }, + "process_vid_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "process_vid_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource_class": { + "ignore_above": 1024, + "type": "keyword" + }, + "rid": { + "type": "long" + }, + "session_split": { + "ignore_above": 1024, + "type": "keyword" + }, + "site": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "sourcefile": { + "ignore_above": 1024, + "type": "keyword" + }, + "statement": { + "ignore_above": 1024, + "type": "keyword" + }, + "time": { + "type": "date" + }, + "ubc_req": { + "type": "long" + }, + "ubc_res": { + "type": "long" + }, + "word": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "investigations": { + "properties": { + "analysis_file": { + "ignore_above": 1024, + "type": "keyword" + }, + "analysis_service": { + "ignore_above": 1024, + "type": "keyword" + }, + "analysis_session": { + "ignore_above": 1024, + "type": "keyword" + }, + "boc": { + "ignore_above": 1024, + "type": "keyword" + }, + "ec_activity": { + "ignore_above": 1024, + "type": "keyword" + }, + "ec_outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "ec_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "ec_theme": { + "ignore_above": 1024, + "type": "keyword" + }, + "eoc": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_cat": { + "type": "long" + }, + "event_cat_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_vcat": { + "ignore_above": 1024, + "type": "keyword" + }, + "inv_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "inv_context": { + "ignore_above": 1024, + "type": "keyword" + }, + "ioc": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "misc": { + "properties": { + "OS": { + "ignore_above": 1024, + "type": "keyword" + }, + "acl_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "acl_op": { + "ignore_above": 1024, + "type": "keyword" + }, + "acl_pos": { + "ignore_above": 1024, + "type": "keyword" + }, + "acl_table": { + "ignore_above": 1024, + "type": "keyword" + }, + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "admin": { + "ignore_above": 1024, + "type": "keyword" + }, + "agent_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "alarm_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "alarmname": { + "ignore_above": 1024, + "type": "keyword" + }, + "alert_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "audit": { + "ignore_above": 1024, + "type": "keyword" + }, + "audit_object": { + "ignore_above": 1024, + "type": "keyword" + }, + "auditdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "autorun_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "benchmark": { + "ignore_above": 1024, + "type": "keyword" + }, + "bypass": { + "ignore_above": 1024, + "type": "keyword" + }, + "cache": { + "ignore_above": 1024, + "type": "keyword" + }, + "cache_hit": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "cc_number": { + "type": "long" + }, + "cefversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfg_attr": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfg_obj": { + "ignore_above": 1024, + "type": "keyword" + }, + "cfg_path": { + "ignore_above": 1024, + "type": "keyword" + }, + "change_attrib": { + "ignore_above": 1024, + "type": "keyword" + }, + "change_new": { + "ignore_above": 1024, + "type": "keyword" + }, + "change_old": { + "ignore_above": 1024, + "type": "keyword" + }, + "changes": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_ip": { + "ignore_above": 1024, + "type": "keyword" + }, + "clustermembers": { + "ignore_above": 1024, + "type": "keyword" + }, + "cmd": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_acttimeout": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_asn_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_bgpv4nxthop": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_ctr_dst_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_dst_tos": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_dst_vlan": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_engine_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_engine_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_f_switch": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_flowsampid": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_flowsampintv": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_flowsampmode": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_inacttimeout": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_inpermbyts": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_inpermpckts": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_invalid": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_ip_proto_ver": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_ipv4_ident": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_l_switch": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_log_did": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_log_rid": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_max_ttl": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_maxpcktlen": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_min_ttl": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_minpcktlen": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_1": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_10": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_2": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_3": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_4": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_5": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_6": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_7": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_8": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mpls_lbl_9": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mplstoplabel": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mplstoplabip": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mul_dst_byt": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_mul_dst_pks": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_muligmptype": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_sampalgo": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_sampint": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_seqctr": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_spackets": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_src_tos": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_src_vlan": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_sysuptime": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_template_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_totbytsexp": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_totflowexp": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_totpcktsexp": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_unixnanosecs": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_v6flowlabel": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_v6optheaders": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "comments": { + "ignore_above": 1024, + "type": "keyword" + }, + "comp_class": { + "ignore_above": 1024, + "type": "keyword" + }, + "comp_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "comp_rbytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "comp_sbytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "comp_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "content": { + "ignore_above": 1024, + "type": "keyword" + }, + "content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "content_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "context": { + "ignore_above": 1024, + "type": "keyword" + }, + "context_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "context_target": { + "ignore_above": 1024, + "type": "keyword" + }, + "count": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu": { + "type": "long" + }, + "cpu_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "criticality": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_agency_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_analyzedby": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_av_other": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_av_primary": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_av_secondary": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_bgpv6nxthop": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_bit9status": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_context": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_control": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_datecret": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_dst_tld": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_eth_dst_ven": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_eth_src_ven": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_event_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_filetype": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_fld": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_if_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_if_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_ip_next_hop": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_ipv4dstpre": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_ipv4srcpre": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_lifetime": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_log_medium": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_loginname": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_modulescore": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_modulesign": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_opswatresult": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_payload": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_registrant": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_registrar": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_represult": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_rpayload": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_sampler_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_sourcemodule": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_streams": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_targetmodule": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_v6nxthop": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_whois_server": { + "ignore_above": 1024, + "type": "keyword" + }, + "cs_yararesult": { + "ignore_above": 1024, + "type": "keyword" + }, + "cve": { + "ignore_above": 1024, + "type": "keyword" + }, + "data_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "devvendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "disposition": { + "ignore_above": 1024, + "type": "keyword" + }, + "distance": { + "ignore_above": 1024, + "type": "keyword" + }, + "doc_number": { + "type": "long" + }, + "dstburb": { + "ignore_above": 1024, + "type": "keyword" + }, + "edomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "edomaub": { + "ignore_above": 1024, + "type": "keyword" + }, + "ein_number": { + "type": "long" + }, + "error": { + "ignore_above": 1024, + "type": "keyword" + }, + "euid": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_computer": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_log": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_source": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_state": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "event_user": { + "ignore_above": 1024, + "type": "keyword" + }, + "expected_val": { + "ignore_above": 1024, + "type": "keyword" + }, + "facility": { + "ignore_above": 1024, + "type": "keyword" + }, + "facilityname": { + "ignore_above": 1024, + "type": "keyword" + }, + "fcatnum": { + "ignore_above": 1024, + "type": "keyword" + }, + "filter": { + "ignore_above": 1024, + "type": "keyword" + }, + "finterface": { + "ignore_above": 1024, + "type": "keyword" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "forensic_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "found": { + "ignore_above": 1024, + "type": "keyword" + }, + "fresult": { + "type": "long" + }, + "gaddr": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "group_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "group_object": { + "ignore_above": 1024, + "type": "keyword" + }, + "hardware_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id3": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_buddyid": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_buddyname": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_client": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_croomid": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_croomtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_members": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_userid": { + "ignore_above": 1024, + "type": "keyword" + }, + "im_username": { + "ignore_above": 1024, + "type": "keyword" + }, + "index": { + "ignore_above": 1024, + "type": "keyword" + }, + "inout": { + "ignore_above": 1024, + "type": "keyword" + }, + "ipkt": { + "ignore_above": 1024, + "type": "keyword" + }, + "ipscat": { + "ignore_above": 1024, + "type": "keyword" + }, + "ipspri": { + "ignore_above": 1024, + "type": "keyword" + }, + "job_num": { + "ignore_above": 1024, + "type": "keyword" + }, + "jobname": { + "ignore_above": 1024, + "type": "keyword" + }, + "language": { + "ignore_above": 1024, + "type": "keyword" + }, + "latitude": { + "ignore_above": 1024, + "type": "keyword" + }, + "library": { + "ignore_above": 1024, + "type": "keyword" + }, + "lifetime": { + "type": "long" + }, + "linenum": { + "ignore_above": 1024, + "type": "keyword" + }, + "link": { + "ignore_above": 1024, + "type": "keyword" + }, + "list_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "listnum": { + "ignore_above": 1024, + "type": "keyword" + }, + "load_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "location_floor": { + "ignore_above": 1024, + "type": "keyword" + }, + "location_mark": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_session_id1": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "logid": { + "ignore_above": 1024, + "type": "keyword" + }, + "logip": { + "ignore_above": 1024, + "type": "keyword" + }, + "logname": { + "ignore_above": 1024, + "type": "keyword" + }, + "longitude": { + "ignore_above": 1024, + "type": "keyword" + }, + "lport": { + "ignore_above": 1024, + "type": "keyword" + }, + "mail_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "match": { + "ignore_above": 1024, + "type": "keyword" + }, + "mbug_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_body": { + "ignore_above": 1024, + "type": "keyword" + }, + "misc": { + "ignore_above": 1024, + "type": "keyword" + }, + "misc_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgIdPart1": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgIdPart2": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgIdPart3": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgIdPart4": { + "ignore_above": 1024, + "type": "keyword" + }, + "msg_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "netsessid": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "ignore_above": 1024, + "type": "keyword" + }, + "ntype": { + "ignore_above": 1024, + "type": "keyword" + }, + "num": { + "ignore_above": 1024, + "type": "keyword" + }, + "number": { + "ignore_above": 1024, + "type": "keyword" + }, + "number1": { + "ignore_above": 1024, + "type": "keyword" + }, + "number2": { + "ignore_above": 1024, + "type": "keyword" + }, + "nwwn": { + "ignore_above": 1024, + "type": "keyword" + }, + "obj_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "obj_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "object": { + "ignore_above": 1024, + "type": "keyword" + }, + "observed_val": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "opkt": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_from": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_action": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_filter": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_group_object": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_msgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_msgid1": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_msgid2": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_result1": { + "ignore_above": 1024, + "type": "keyword" + }, + "param": { + "ignore_above": 1024, + "type": "keyword" + }, + "param_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "param_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent_node": { + "ignore_above": 1024, + "type": "keyword" + }, + "password_chg": { + "ignore_above": 1024, + "type": "keyword" + }, + "password_expire": { + "ignore_above": 1024, + "type": "keyword" + }, + "payload_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "payload_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "permgranted": { + "ignore_above": 1024, + "type": "keyword" + }, + "permwanted": { + "ignore_above": 1024, + "type": "keyword" + }, + "pgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "phone": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy": { + "ignore_above": 1024, + "type": "keyword" + }, + "policyUUID": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy_waiver": { + "ignore_above": 1024, + "type": "keyword" + }, + "pool_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pool_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "port_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "ignore_above": 1024, + "type": "keyword" + }, + "process_id_val": { + "ignore_above": 1024, + "type": "keyword" + }, + "prog_asp_num": { + "ignore_above": 1024, + "type": "keyword" + }, + "program": { + "ignore_above": 1024, + "type": "keyword" + }, + "real_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "rec_asp_device": { + "ignore_above": 1024, + "type": "keyword" + }, + "rec_asp_num": { + "ignore_above": 1024, + "type": "keyword" + }, + "rec_library": { + "ignore_above": 1024, + "type": "keyword" + }, + "recordnum": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference_id1": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference_id2": { + "ignore_above": 1024, + "type": "keyword" + }, + "result": { + "ignore_above": 1024, + "type": "keyword" + }, + "result_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_num": { + "type": "double" + }, + "risk_num_comm": { + "type": "double" + }, + "risk_num_next": { + "type": "double" + }, + "risk_num_sand": { + "type": "double" + }, + "risk_num_static": { + "type": "double" + }, + "risk_suspicious": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_warning": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruid": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_template": { + "ignore_above": 1024, + "type": "keyword" + }, + "rule_uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "sburb": { + "ignore_above": 1024, + "type": "keyword" + }, + "sdomain_fld": { + "ignore_above": 1024, + "type": "keyword" + }, + "search_text": { + "ignore_above": 1024, + "type": "keyword" + }, + "sec": { + "ignore_above": 1024, + "type": "keyword" + }, + "second": { + "ignore_above": 1024, + "type": "keyword" + }, + "sensor": { + "ignore_above": 1024, + "type": "keyword" + }, + "sensorname": { + "ignore_above": 1024, + "type": "keyword" + }, + "seqnum": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "session": { + "ignore_above": 1024, + "type": "keyword" + }, + "sessiontype": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + }, + "sigUUID": { + "ignore_above": 1024, + "type": "keyword" + }, + "sig_id": { + "type": "long" + }, + "sig_id1": { + "type": "long" + }, + "sig_id_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "sig_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sigcat": { + "ignore_above": 1024, + "type": "keyword" + }, + "snmp_oid": { + "ignore_above": 1024, + "type": "keyword" + }, + "snmp_value": { + "ignore_above": 1024, + "type": "keyword" + }, + "space": { + "ignore_above": 1024, + "type": "keyword" + }, + "space1": { + "ignore_above": 1024, + "type": "keyword" + }, + "spi": { + "ignore_above": 1024, + "type": "keyword" + }, + "spi_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "spi_src": { + "ignore_above": 1024, + "type": "keyword" + }, + "sql": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcburb": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcdom": { + "ignore_above": 1024, + "type": "keyword" + }, + "srcservice": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "status1": { + "ignore_above": 1024, + "type": "keyword" + }, + "streams": { + "type": "long" + }, + "subcategory": { + "ignore_above": 1024, + "type": "keyword" + }, + "svcno": { + "ignore_above": 1024, + "type": "keyword" + }, + "system": { + "ignore_above": 1024, + "type": "keyword" + }, + "tbdstr1": { + "ignore_above": 1024, + "type": "keyword" + }, + "tbdstr2": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags": { + "type": "long" + }, + "terminal": { + "ignore_above": 1024, + "type": "keyword" + }, + "tgtdom": { + "ignore_above": 1024, + "type": "keyword" + }, + "tgtdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "threshold": { + "ignore_above": 1024, + "type": "keyword" + }, + "tos": { + "type": "long" + }, + "trigger_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "trigger_val": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "type1": { + "ignore_above": 1024, + "type": "keyword" + }, + "udb_class": { + "ignore_above": 1024, + "type": "keyword" + }, + "url_fld": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_div": { + "ignore_above": 1024, + "type": "keyword" + }, + "userid": { + "ignore_above": 1024, + "type": "keyword" + }, + "username_fld": { + "ignore_above": 1024, + "type": "keyword" + }, + "utcstamp": { + "ignore_above": 1024, + "type": "keyword" + }, + "v_instafname": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "virt_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "virusname": { + "ignore_above": 1024, + "type": "keyword" + }, + "vm_target": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpnid": { + "ignore_above": 1024, + "type": "keyword" + }, + "vsys": { + "ignore_above": 1024, + "type": "keyword" + }, + "vuln_ref": { + "ignore_above": 1024, + "type": "keyword" + }, + "workspace": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "network": { + "properties": { + "ad_computer_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "addr": { + "ignore_above": 1024, + "type": "keyword" + }, + "alias_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "dinterface": { + "ignore_above": 1024, + "type": "keyword" + }, + "dmask": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_a_record": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_cname_record": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_opcode": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_ptr_record": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_resp": { + "ignore_above": 1024, + "type": "keyword" + }, + "dns_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "domain1": { + "ignore_above": 1024, + "type": "keyword" + }, + "eth_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "eth_type": { + "type": "long" + }, + "faddr": { + "ignore_above": 1024, + "type": "keyword" + }, + "fhost": { + "ignore_above": 1024, + "type": "keyword" + }, + "fport": { + "ignore_above": 1024, + "type": "keyword" + }, + "gateway": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_orig": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code": { + "type": "long" + }, + "icmp_type": { + "type": "long" + }, + "interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip_proto": { + "type": "long" + }, + "laddr": { + "ignore_above": 1024, + "type": "keyword" + }, + "lhost": { + "ignore_above": 1024, + "type": "keyword" + }, + "linterface": { + "ignore_above": 1024, + "type": "keyword" + }, + "mask": { + "ignore_above": 1024, + "type": "keyword" + }, + "netname": { + "ignore_above": 1024, + "type": "keyword" + }, + "network_port": { + "type": "long" + }, + "network_service": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "ignore_above": 1024, + "type": "keyword" + }, + "packet_length": { + "ignore_above": 1024, + "type": "keyword" + }, + "paddr": { + "type": "ip" + }, + "phost": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "protocol_detail": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_domain_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "rpayload": { + "ignore_above": 1024, + "type": "keyword" + }, + "sinterface": { + "ignore_above": 1024, + "type": "keyword" + }, + "smask": { + "ignore_above": 1024, + "type": "keyword" + }, + "vlan": { + "type": "long" + }, + "vlan_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone_src": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "physical": { + "properties": { + "org_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "org_src": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "storage": { + "properties": { + "disk_volume": { + "ignore_above": 1024, + "type": "keyword" + }, + "lun": { + "ignore_above": 1024, + "type": "keyword" + }, + "pwwn": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "threat": { + "properties": { + "alert": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat_source": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "time": { + "properties": { + "date": { + "ignore_above": 1024, + "type": "keyword" + }, + "datetime": { + "ignore_above": 1024, + "type": "keyword" + }, + "day": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration_time": { + "type": "double" + }, + "effective_time": { + "type": "date" + }, + "endtime": { + "type": "date" + }, + "event_queue_time": { + "type": "date" + }, + "event_time": { + "type": "date" + }, + "event_time_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "eventtime": { + "ignore_above": 1024, + "type": "keyword" + }, + "expire_time": { + "type": "date" + }, + "expire_time_str": { + "ignore_above": 1024, + "type": "keyword" + }, + "gmtdate": { + "ignore_above": 1024, + "type": "keyword" + }, + "gmttime": { + "ignore_above": 1024, + "type": "keyword" + }, + "hour": { + "ignore_above": 1024, + "type": "keyword" + }, + "min": { + "ignore_above": 1024, + "type": "keyword" + }, + "month": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_date": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_month": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_time1": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_time2": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_year": { + "ignore_above": 1024, + "type": "keyword" + }, + "process_time": { + "ignore_above": 1024, + "type": "keyword" + }, + "recorded_time": { + "type": "date" + }, + "stamp": { + "type": "date" + }, + "starttime": { + "type": "date" + }, + "timestamp": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "tzone": { + "ignore_above": 1024, + "type": "keyword" + }, + "year": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "web": { + "properties": { + "alias_host": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_asn_dst": { + "ignore_above": 1024, + "type": "keyword" + }, + "cn_rpackets": { + "ignore_above": 1024, + "type": "keyword" + }, + "fqdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_url": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_web_cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_web_method": { + "ignore_above": 1024, + "type": "keyword" + }, + "p_web_referer": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "reputation_num": { + "type": "double" + }, + "urlpage": { + "ignore_above": 1024, + "type": "keyword" + }, + "urlroot": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_extension_tmp": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_page": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_ref_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_ref_page": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_ref_query": { + "ignore_above": 1024, + "type": "keyword" + }, + "web_ref_root": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "wireless": { + "properties": { + "access_point": { + "ignore_above": 1024, + "type": "keyword" + }, + "wlan_channel": { + "type": "long" + }, + "wlan_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "wlan_ssid": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "rule": { + "properties": { + "author": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruleset": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "santa": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "decision": { + "ignore_above": 1024, + "type": "keyword" + }, + "disk": { + "properties": { + "bsdname": { + "ignore_above": 1024, + "type": "keyword" + }, + "bus": { + "ignore_above": 1024, + "type": "keyword" + }, + "fs": { + "ignore_above": 1024, + "type": "keyword" + }, + "model": { + "ignore_above": 1024, + "type": "keyword" + }, + "mount": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "volume": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "service": { + "properties": { + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sophos": { + "properties": { + "xg": { + "properties": { + "Configuration": { + "type": "float" + }, + "FTP_direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "FTP_url": { + "ignore_above": 1024, + "type": "keyword" + }, + "Mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "PHPSESSID": { + "ignore_above": 1024, + "type": "keyword" + }, + "Reports": { + "type": "float" + }, + "Signature": { + "type": "float" + }, + "SysLog_SERVER_NAME": { + "ignore_above": 1024, + "type": "keyword" + }, + "Temp": { + "type": "float" + }, + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "activityname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ap": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_is_cloud": { + "ignore_above": 1024, + "type": "keyword" + }, + "appfilter_policy_id": { + "type": "long" + }, + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_filter_policy": { + "type": "long" + }, + "application_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_risk": { + "ignore_above": 1024, + "type": "keyword" + }, + "application_technology": { + "ignore_above": 1024, + "type": "keyword" + }, + "appresolvedby": { + "ignore_above": 1024, + "type": "keyword" + }, + "auth_client": { + "ignore_above": 1024, + "type": "keyword" + }, + "auth_mechanism": { + "ignore_above": 1024, + "type": "keyword" + }, + "av_policy_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "backup_mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "branch_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "category_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_host_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_physical_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "clients_conn_ssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "collisions": { + "type": "long" + }, + "con_id": { + "type": "long" + }, + "conn_id": { + "type": "long" + }, + "connectionname": { + "ignore_above": 1024, + "type": "keyword" + }, + "connectiontype": { + "ignore_above": 1024, + "type": "keyword" + }, + "connevent": { + "ignore_above": 1024, + "type": "keyword" + }, + "connid": { + "ignore_above": 1024, + "type": "keyword" + }, + "contenttype": { + "ignore_above": 1024, + "type": "keyword" + }, + "context_match": { + "ignore_above": 1024, + "type": "keyword" + }, + "context_prefix": { + "ignore_above": 1024, + "type": "keyword" + }, + "context_suffix": { + "ignore_above": 1024, + "type": "keyword" + }, + "cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "date": { + "type": "date" + }, + "destinationip": { + "type": "ip" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "device_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dictionary_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "dir_disp": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "domainname": { + "ignore_above": 1024, + "type": "keyword" + }, + "download_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "download_file_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "dst_country_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "dst_domainname": { + "ignore_above": 1024, + "type": "keyword" + }, + "dst_ip": { + "type": "ip" + }, + "dst_port": { + "type": "long" + }, + "dstdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstzone": { + "ignore_above": 1024, + "type": "keyword" + }, + "dstzonetype": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "long" + }, + "email_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "ep_uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "eventid": { + "ignore_above": 1024, + "type": "keyword" + }, + "eventtime": { + "type": "date" + }, + "eventtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "exceptions": { + "ignore_above": 1024, + "type": "keyword" + }, + "execution_path": { + "ignore_above": 1024, + "type": "keyword" + }, + "extra": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_path": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_size": { + "type": "long" + }, + "filename": { + "ignore_above": 1024, + "type": "keyword" + }, + "filepath": { + "ignore_above": 1024, + "type": "keyword" + }, + "filesize": { + "type": "long" + }, + "free": { + "type": "long" + }, + "from_email_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "ftpcommand": { + "ignore_above": 1024, + "type": "keyword" + }, + "fw_rule_id": { + "type": "long" + }, + "hb_health": { + "ignore_above": 1024, + "type": "keyword" + }, + "host": { + "ignore_above": 1024, + "type": "keyword" + }, + "httpresponsecode": { + "type": "long" + }, + "iap": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "idle_cpu": { + "type": "float" + }, + "idp_policy_id": { + "type": "long" + }, + "idp_policy_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "in_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "ipaddress": { + "ignore_above": 1024, + "type": "keyword" + }, + "ips_policy_id": { + "type": "long" + }, + "localgateway": { + "ignore_above": 1024, + "type": "keyword" + }, + "localnetwork": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_component": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_subtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "login_user": { + "ignore_above": 1024, + "type": "keyword" + }, + "mailid": { + "ignore_above": 1024, + "type": "keyword" + }, + "mailsize": { + "type": "long" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "newversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "oldversion": { + "ignore_above": 1024, + "type": "keyword" + }, + "out_interface": { + "ignore_above": 1024, + "type": "keyword" + }, + "override_authorizer": { + "ignore_above": 1024, + "type": "keyword" + }, + "override_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "override_token": { + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "policy_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "ignore_above": 1024, + "type": "keyword" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "quarantine": { + "ignore_above": 1024, + "type": "keyword" + }, + "quarantine_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "querystring": { + "ignore_above": 1024, + "type": "keyword" + }, + "raw_data": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "received_pkts": { + "type": "long" + }, + "receiveddrops": { + "type": "long" + }, + "receivederrors": { + "ignore_above": 1024, + "type": "keyword" + }, + "receivedkbits": { + "type": "long" + }, + "recv_bytes": { + "type": "long" + }, + "red_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "referer": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_ip": { + "type": "ip" + }, + "remotenetwork": { + "ignore_above": 1024, + "type": "keyword" + }, + "responsetime": { + "type": "long" + }, + "rule_priority": { + "ignore_above": 1024, + "type": "keyword" + }, + "sent_bytes": { + "type": "long" + }, + "sent_pkts": { + "type": "long" + }, + "server": { + "ignore_above": 1024, + "type": "keyword" + }, + "sessionid": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1sum": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "site_category": { + "ignore_above": 1024, + "type": "keyword" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "sourceip": { + "type": "ip" + }, + "spamaction": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_country_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_domainname": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_ip": { + "type": "ip" + }, + "src_mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "src_port": { + "type": "long" + }, + "srczone": { + "ignore_above": 1024, + "type": "keyword" + }, + "srczonetype": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssid": { + "ignore_above": 1024, + "type": "keyword" + }, + "start_time": { + "type": "date" + }, + "starttime": { + "type": "date" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "system_cpu": { + "type": "float" + }, + "target": { + "ignore_above": 1024, + "type": "keyword" + }, + "threatname": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "to_email_address": { + "ignore_above": 1024, + "type": "keyword" + }, + "total_memory": { + "type": "long" + }, + "trans_dst_ip": { + "type": "ip" + }, + "trans_dst_port": { + "type": "long" + }, + "trans_src_ ip": { + "type": "ip" + }, + "trans_src_port": { + "type": "long" + }, + "transaction_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "transactionid": { + "ignore_above": 1024, + "type": "keyword" + }, + "transmitteddrops": { + "type": "long" + }, + "transmittederrors": { + "ignore_above": 1024, + "type": "keyword" + }, + "transmittedkbits": { + "type": "long" + }, + "unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "updatedip": { + "type": "ip" + }, + "upload_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "upload_file_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "used": { + "type": "long" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_cpu": { + "type": "float" + }, + "user_gp": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_group": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "users": { + "ignore_above": 1024, + "type": "keyword" + }, + "vconn_id": { + "type": "long" + }, + "virus": { + "ignore_above": 1024, + "type": "keyword" + }, + "website": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "span": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "stack": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "type": "long" + }, + "stream": { + "ignore_above": 1024, + "type": "keyword" + }, + "suricata": { + "properties": { + "eve": { + "properties": { + "alert": { + "properties": { + "action": { + "path": "event.outcome", + "type": "alias" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "type": "long" + }, + "rev": { + "type": "long" + }, + "severity": { + "path": "event.severity", + "type": "alias" + }, + "signature": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_id": { + "type": "long" + } + } + }, + "app_proto": { + "path": "network.protocol", + "type": "alias" + }, + "app_proto_expected": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_proto_orig": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_proto_tc": { + "ignore_above": 1024, + "type": "keyword" + }, + "app_proto_ts": { + "ignore_above": 1024, + "type": "keyword" + }, + "dest_ip": { + "path": "destination.ip", + "type": "alias" + }, + "dest_port": { + "path": "destination.port", + "type": "alias" + }, + "dns": { + "properties": { + "id": { + "type": "long" + }, + "rcode": { + "ignore_above": 1024, + "type": "keyword" + }, + "rdata": { + "ignore_above": 1024, + "type": "keyword" + }, + "rrname": { + "ignore_above": 1024, + "type": "keyword" + }, + "rrtype": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "tx_id": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "properties": { + "status": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "fileinfo": { + "properties": { + "filename": { + "path": "file.path", + "type": "alias" + }, + "gaps": { + "type": "boolean" + }, + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "path": "file.size", + "type": "alias" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "stored": { + "type": "boolean" + }, + "tx_id": { + "type": "long" + } + } + }, + "flags": { + "type": "object" + }, + "flow": { + "properties": { + "age": { + "type": "long" + }, + "alerted": { + "type": "boolean" + }, + "bytes_toclient": { + "path": "destination.bytes", + "type": "alias" + }, + "bytes_toserver": { + "path": "source.bytes", + "type": "alias" + }, + "end": { + "type": "date" + }, + "pkts_toclient": { + "path": "destination.packets", + "type": "alias" + }, + "pkts_toserver": { + "path": "source.packets", + "type": "alias" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "start": { + "path": "event.start", + "type": "alias" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "flow_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "http": { + "properties": { + "hostname": { + "path": "url.domain", + "type": "alias" + }, + "http_content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "http_method": { + "path": "http.request.method", + "type": "alias" + }, + "http_refer": { + "path": "http.request.referrer", + "type": "alias" + }, + "http_user_agent": { + "path": "user_agent.original", + "type": "alias" + }, + "length": { + "path": "http.response.body.bytes", + "type": "alias" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "redirect": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "path": "http.response.status_code", + "type": "alias" + }, + "url": { + "path": "url.original", + "type": "alias" + } + } + }, + "icmp_code": { + "type": "long" + }, + "icmp_type": { + "type": "long" + }, + "in_iface": { + "ignore_above": 1024, + "type": "keyword" + }, + "pcap_cnt": { + "type": "long" + }, + "proto": { + "path": "network.transport", + "type": "alias" + }, + "smtp": { + "properties": { + "helo": { + "ignore_above": 1024, + "type": "keyword" + }, + "mail_from": { + "ignore_above": 1024, + "type": "keyword" + }, + "rcpt_to": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "src_ip": { + "path": "source.ip", + "type": "alias" + }, + "src_port": { + "path": "source.port", + "type": "alias" + }, + "ssh": { + "properties": { + "client": { + "properties": { + "proto_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "software_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "proto_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "software_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "stats": { + "properties": { + "app_layer": { + "properties": { + "flow": { + "properties": { + "dcerpc_tcp": { + "type": "long" + }, + "dcerpc_udp": { + "type": "long" + }, + "dns_tcp": { + "type": "long" + }, + "dns_udp": { + "type": "long" + }, + "failed_tcp": { + "type": "long" + }, + "failed_udp": { + "type": "long" + }, + "ftp": { + "type": "long" + }, + "http": { + "type": "long" + }, + "imap": { + "type": "long" + }, + "msn": { + "type": "long" + }, + "smb": { + "type": "long" + }, + "smtp": { + "type": "long" + }, + "ssh": { + "type": "long" + }, + "tls": { + "type": "long" + } + } + }, + "tx": { + "properties": { + "dcerpc_tcp": { + "type": "long" + }, + "dcerpc_udp": { + "type": "long" + }, + "dns_tcp": { + "type": "long" + }, + "dns_udp": { + "type": "long" + }, + "ftp": { + "type": "long" + }, + "http": { + "type": "long" + }, + "smb": { + "type": "long" + }, + "smtp": { + "type": "long" + }, + "ssh": { + "type": "long" + }, + "tls": { + "type": "long" + } + } + } + } + }, + "capture": { + "properties": { + "kernel_drops": { + "type": "long" + }, + "kernel_ifdrops": { + "type": "long" + }, + "kernel_packets": { + "type": "long" + } + } + }, + "decoder": { + "properties": { + "avg_pkt_size": { + "type": "long" + }, + "bytes": { + "type": "long" + }, + "dce": { + "properties": { + "pkt_too_small": { + "type": "long" + } + } + }, + "erspan": { + "type": "long" + }, + "ethernet": { + "type": "long" + }, + "gre": { + "type": "long" + }, + "icmpv4": { + "type": "long" + }, + "icmpv6": { + "type": "long" + }, + "ieee8021ah": { + "type": "long" + }, + "invalid": { + "type": "long" + }, + "ipraw": { + "properties": { + "invalid_ip_version": { + "type": "long" + } + } + }, + "ipv4": { + "type": "long" + }, + "ipv4_in_ipv6": { + "type": "long" + }, + "ipv6": { + "type": "long" + }, + "ipv6_in_ipv6": { + "type": "long" + }, + "ltnull": { + "properties": { + "pkt_too_small": { + "type": "long" + }, + "unsupported_type": { + "type": "long" + } + } + }, + "max_pkt_size": { + "type": "long" + }, + "mpls": { + "type": "long" + }, + "null": { + "type": "long" + }, + "pkts": { + "type": "long" + }, + "ppp": { + "type": "long" + }, + "pppoe": { + "type": "long" + }, + "raw": { + "type": "long" + }, + "sctp": { + "type": "long" + }, + "sll": { + "type": "long" + }, + "tcp": { + "type": "long" + }, + "teredo": { + "type": "long" + }, + "udp": { + "type": "long" + }, + "vlan": { + "type": "long" + }, + "vlan_qinq": { + "type": "long" + } + } + }, + "defrag": { + "properties": { + "ipv4": { + "properties": { + "fragments": { + "type": "long" + }, + "reassembled": { + "type": "long" + }, + "timeouts": { + "type": "long" + } + } + }, + "ipv6": { + "properties": { + "fragments": { + "type": "long" + }, + "reassembled": { + "type": "long" + }, + "timeouts": { + "type": "long" + } + } + }, + "max_frag_hits": { + "type": "long" + } + } + }, + "detect": { + "properties": { + "alert": { + "type": "long" + } + } + }, + "dns": { + "properties": { + "memcap_global": { + "type": "long" + }, + "memcap_state": { + "type": "long" + }, + "memuse": { + "type": "long" + } + } + }, + "file_store": { + "properties": { + "open_files": { + "type": "long" + } + } + }, + "flow": { + "properties": { + "emerg_mode_entered": { + "type": "long" + }, + "emerg_mode_over": { + "type": "long" + }, + "icmpv4": { + "type": "long" + }, + "icmpv6": { + "type": "long" + }, + "memcap": { + "type": "long" + }, + "memuse": { + "type": "long" + }, + "spare": { + "type": "long" + }, + "tcp": { + "type": "long" + }, + "tcp_reuse": { + "type": "long" + }, + "udp": { + "type": "long" + } + } + }, + "flow_mgr": { + "properties": { + "bypassed_pruned": { + "type": "long" + }, + "closed_pruned": { + "type": "long" + }, + "est_pruned": { + "type": "long" + }, + "flows_checked": { + "type": "long" + }, + "flows_notimeout": { + "type": "long" + }, + "flows_removed": { + "type": "long" + }, + "flows_timeout": { + "type": "long" + }, + "flows_timeout_inuse": { + "type": "long" + }, + "new_pruned": { + "type": "long" + }, + "rows_busy": { + "type": "long" + }, + "rows_checked": { + "type": "long" + }, + "rows_empty": { + "type": "long" + }, + "rows_maxlen": { + "type": "long" + }, + "rows_skipped": { + "type": "long" + } + } + }, + "http": { + "properties": { + "memcap": { + "type": "long" + }, + "memuse": { + "type": "long" + } + } + }, + "tcp": { + "properties": { + "insert_data_normal_fail": { + "type": "long" + }, + "insert_data_overlap_fail": { + "type": "long" + }, + "insert_list_fail": { + "type": "long" + }, + "invalid_checksum": { + "type": "long" + }, + "memuse": { + "type": "long" + }, + "no_flow": { + "type": "long" + }, + "overlap": { + "type": "long" + }, + "overlap_diff_data": { + "type": "long" + }, + "pseudo": { + "type": "long" + }, + "pseudo_failed": { + "type": "long" + }, + "reassembly_gap": { + "type": "long" + }, + "reassembly_memuse": { + "type": "long" + }, + "rst": { + "type": "long" + }, + "segment_memcap_drop": { + "type": "long" + }, + "sessions": { + "type": "long" + }, + "ssn_memcap_drop": { + "type": "long" + }, + "stream_depth_reached": { + "type": "long" + }, + "syn": { + "type": "long" + }, + "synack": { + "type": "long" + } + } + }, + "uptime": { + "type": "long" + } + } + }, + "tcp": { + "properties": { + "ack": { + "type": "boolean" + }, + "fin": { + "type": "boolean" + }, + "psh": { + "type": "boolean" + }, + "rst": { + "type": "boolean" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "syn": { + "type": "boolean" + }, + "tcp_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags_tc": { + "ignore_above": 1024, + "type": "keyword" + }, + "tcp_flags_ts": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "timestamp": { + "path": "@timestamp", + "type": "alias" + }, + "tls": { + "properties": { + "fingerprint": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuerdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "string": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ja3s": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "string": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "notafter": { + "type": "date" + }, + "notbefore": { + "type": "date" + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "session_resumed": { + "type": "boolean" + }, + "sni": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tx_id": { + "type": "long" + } + } + } + } + }, + "syscall": { + "ignore_above": 1024, + "type": "keyword" + }, + "syslog": { + "properties": { + "facility": { + "type": "long" + }, + "facility_label": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "type": "long" + }, + "severity_label": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "system": { + "properties": { + "auth": { + "properties": { + "groupadd": { + "type": "object" + }, + "ssh": { + "properties": { + "dropped_ip": { + "type": "ip" + }, + "event": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "type": "object" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sudo": { + "properties": { + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "error": { + "ignore_above": 1024, + "type": "keyword" + }, + "pwd": { + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "useradd": { + "properties": { + "home": { + "ignore_above": 1024, + "type": "keyword" + }, + "shell": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "syslog": { + "type": "object" + } + } + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + }, + "threat": { + "properties": { + "framework": { + "ignore_above": 1024, + "type": "keyword" + }, + "tactic": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "time": { + "ignore_above": 1024, + "type": "keyword" + }, + "timeseries": { + "properties": { + "instance": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "timestamp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tls": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "supported_ciphers": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "index": false, + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "established": { + "type": "boolean" + }, + "next_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "resumed": { + "type": "boolean" + }, + "server": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3s": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "index": false, + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "version_protocol": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "trace": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tracing": { + "properties": { + "span": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "trace": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "transaction": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "traefik": { + "properties": { + "access": { + "properties": { + "backend_url": { + "ignore_above": 1024, + "type": "keyword" + }, + "frontend_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "geoip": { + "properties": { + "city_name": { + "path": "source.geo.city_name", + "type": "alias" + }, + "continent_name": { + "path": "source.geo.continent_name", + "type": "alias" + }, + "country_iso_code": { + "path": "source.geo.country_iso_code", + "type": "alias" + }, + "location": { + "path": "source.geo.location", + "type": "alias" + }, + "region_iso_code": { + "path": "source.geo.region_iso_code", + "type": "alias" + }, + "region_name": { + "path": "source.geo.region_name", + "type": "alias" + } + } + }, + "request_count": { + "type": "long" + }, + "user_agent": { + "properties": { + "device": { + "path": "user_agent.device.name", + "type": "alias" + }, + "name": { + "path": "user_agent.name", + "type": "alias" + }, + "original": { + "path": "user_agent.original", + "type": "alias" + }, + "os": { + "path": "user_agent.os.full_name", + "type": "alias" + }, + "os_name": { + "path": "user_agent.os.name", + "type": "alias" + } + } + }, + "user_identifier": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "transaction": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "audit": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "effective": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "filesystem": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "full_name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + }, + "saved": { + "properties": { + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "terminal": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user_agent": { + "properties": { + "device": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "v": { + "type": "long" + }, + "view": { + "type": "float" + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vulnerability": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "fields": { + "text": { + "norms": false, + "type": "text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "enumeration": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "report_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "scanner": { + "properties": { + "vendor": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "score": { + "properties": { + "base": { + "type": "float" + }, + "environmental": { + "type": "float" + }, + "temporal": { + "type": "float" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "index": false, + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zeek": { + "properties": { + "capture_loss": { + "properties": { + "acks": { + "type": "long" + }, + "gaps": { + "type": "long" + }, + "peer": { + "ignore_above": 1024, + "type": "keyword" + }, + "percent_lost": { + "type": "double" + }, + "ts_delta": { + "type": "long" + } + } + }, + "connection": { + "properties": { + "history": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp": { + "properties": { + "code": { + "type": "long" + }, + "type": { + "type": "long" + } + } + }, + "inner_vlan": { + "type": "long" + }, + "local_orig": { + "type": "boolean" + }, + "local_resp": { + "type": "boolean" + }, + "missed_bytes": { + "type": "long" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_message": { + "ignore_above": 1024, + "type": "keyword" + }, + "vlan": { + "type": "long" + } + } + }, + "dce_rpc": { + "properties": { + "endpoint": { + "ignore_above": 1024, + "type": "keyword" + }, + "named_pipe": { + "ignore_above": 1024, + "type": "keyword" + }, + "operation": { + "ignore_above": 1024, + "type": "keyword" + }, + "rtt": { + "type": "long" + } + } + }, + "dhcp": { + "properties": { + "address": { + "properties": { + "assigned": { + "type": "ip" + }, + "client": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "requested": { + "type": "ip" + }, + "server": { + "type": "ip" + } + } + }, + "client_fqdn": { + "ignore_above": 1024, + "type": "keyword" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "double" + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "properties": { + "circuit": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "subscriber": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "lease_time": { + "type": "long" + }, + "msg": { + "properties": { + "client": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "type": "ip" + }, + "server": { + "ignore_above": 1024, + "type": "keyword" + }, + "types": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "software": { + "properties": { + "client": { + "ignore_above": 1024, + "type": "keyword" + }, + "server": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dnp3": { + "properties": { + "function": { + "properties": { + "reply": { + "ignore_above": 1024, + "type": "keyword" + }, + "request": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "type": "long" + } + } + }, + "dns": { + "properties": { + "AA": { + "type": "boolean" + }, + "RA": { + "type": "boolean" + }, + "RD": { + "type": "boolean" + }, + "TC": { + "type": "boolean" + }, + "TTLs": { + "type": "double" + }, + "answers": { + "ignore_above": 1024, + "type": "keyword" + }, + "qclass": { + "type": "long" + }, + "qclass_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "qtype": { + "type": "long" + }, + "qtype_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "rcode": { + "type": "long" + }, + "rcode_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "rejected": { + "type": "boolean" + }, + "rtt": { + "type": "double" + }, + "saw_query": { + "type": "boolean" + }, + "saw_reply": { + "type": "boolean" + }, + "total_answers": { + "type": "long" + }, + "total_replies": { + "type": "long" + }, + "trans_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "dpd": { + "properties": { + "analyzer": { + "ignore_above": 1024, + "type": "keyword" + }, + "failure_reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "packet_segment": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "files": { + "properties": { + "analyzers": { + "ignore_above": 1024, + "type": "keyword" + }, + "depth": { + "type": "long" + }, + "duration": { + "type": "double" + }, + "entropy": { + "type": "double" + }, + "extracted": { + "ignore_above": 1024, + "type": "keyword" + }, + "extracted_cutoff": { + "type": "boolean" + }, + "extracted_size": { + "type": "long" + }, + "filename": { + "ignore_above": 1024, + "type": "keyword" + }, + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_orig": { + "type": "boolean" + }, + "local_orig": { + "type": "boolean" + }, + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "missing_bytes": { + "type": "long" + }, + "overflow_bytes": { + "type": "long" + }, + "parent_fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "rx_host": { + "type": "ip" + }, + "seen_bytes": { + "type": "long" + }, + "session_ids": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + }, + "timedout": { + "type": "boolean" + }, + "total_bytes": { + "type": "long" + }, + "tx_host": { + "type": "ip" + } + } + }, + "ftp": { + "properties": { + "arg": { + "ignore_above": 1024, + "type": "keyword" + }, + "capture_password": { + "type": "boolean" + }, + "cmdarg": { + "properties": { + "arg": { + "ignore_above": 1024, + "type": "keyword" + }, + "cmd": { + "ignore_above": 1024, + "type": "keyword" + }, + "seq": { + "type": "long" + } + } + }, + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "cwd": { + "ignore_above": 1024, + "type": "keyword" + }, + "data_channel": { + "properties": { + "originating_host": { + "type": "ip" + }, + "passive": { + "type": "boolean" + }, + "response_host": { + "type": "ip" + }, + "response_port": { + "type": "long" + } + } + }, + "file": { + "properties": { + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + } + } + }, + "last_auth_requested": { + "ignore_above": 1024, + "type": "keyword" + }, + "passive": { + "type": "boolean" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "pending_commands": { + "type": "long" + }, + "reply": { + "properties": { + "code": { + "type": "long" + }, + "msg": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "http": { + "properties": { + "captured_password": { + "type": "boolean" + }, + "client_header_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "info_code": { + "type": "long" + }, + "info_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_filenames": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "orig_mime_depth": { + "type": "long" + }, + "orig_mime_types": { + "ignore_above": 1024, + "type": "keyword" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "proxied": { + "ignore_above": 1024, + "type": "keyword" + }, + "range_request": { + "type": "boolean" + }, + "resp_filenames": { + "ignore_above": 1024, + "type": "keyword" + }, + "resp_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "resp_mime_depth": { + "type": "long" + }, + "resp_mime_types": { + "ignore_above": 1024, + "type": "keyword" + }, + "server_header_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "tags": { + "ignore_above": 1024, + "type": "keyword" + }, + "trans_depth": { + "type": "long" + } + } + }, + "intel": { + "properties": { + "file_desc": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "matched": { + "ignore_above": 1024, + "type": "keyword" + }, + "seen": { + "properties": { + "conn": { + "ignore_above": 1024, + "type": "keyword" + }, + "f": { + "type": "object" + }, + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "host": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator": { + "ignore_above": 1024, + "type": "keyword" + }, + "indicator_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "where": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sources": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "irc": { + "properties": { + "addl": { + "ignore_above": 1024, + "type": "keyword" + }, + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "dcc": { + "properties": { + "file": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + } + } + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "nick": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kerberos": { + "properties": { + "cert": { + "properties": { + "client": { + "properties": { + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "ignore_above": 1024, + "type": "keyword" + }, + "error": { + "properties": { + "code": { + "type": "long" + }, + "msg": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "forwardable": { + "type": "boolean" + }, + "renewable": { + "type": "boolean" + }, + "request_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "ignore_above": 1024, + "type": "keyword" + }, + "success": { + "type": "boolean" + }, + "ticket": { + "properties": { + "auth": { + "ignore_above": 1024, + "type": "keyword" + }, + "new": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "valid": { + "properties": { + "days": { + "type": "long" + }, + "from": { + "type": "date" + }, + "until": { + "type": "date" + } + } + } + } + }, + "modbus": { + "properties": { + "exception": { + "ignore_above": 1024, + "type": "keyword" + }, + "function": { + "ignore_above": 1024, + "type": "keyword" + }, + "track_address": { + "type": "long" + } + } + }, + "mysql": { + "properties": { + "arg": { + "ignore_above": 1024, + "type": "keyword" + }, + "cmd": { + "ignore_above": 1024, + "type": "keyword" + }, + "response": { + "ignore_above": 1024, + "type": "keyword" + }, + "rows": { + "type": "long" + }, + "success": { + "type": "boolean" + } + } + }, + "notice": { + "properties": { + "actions": { + "ignore_above": 1024, + "type": "keyword" + }, + "connection_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "dropped": { + "type": "boolean" + }, + "email_body_sections": { + "norms": false, + "type": "text" + }, + "email_delay_tokens": { + "ignore_above": 1024, + "type": "keyword" + }, + "false": { + "type": "long" + }, + "ffile": { + "properties": { + "total_bytes": { + "type": "long" + } + } + }, + "file": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_orig": { + "type": "boolean" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "missing_bytes": { + "type": "long" + }, + "overflow_bytes": { + "type": "long" + }, + "parent_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "seen_bytes": { + "type": "long" + }, + "source": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "fuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "icmp_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "note": { + "ignore_above": 1024, + "type": "keyword" + }, + "peer_descr": { + "norms": false, + "type": "text" + }, + "peer_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "sub": { + "ignore_above": 1024, + "type": "keyword" + }, + "suppress_for": { + "type": "double" + } + } + }, + "ntlm": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "server": { + "properties": { + "name": { + "properties": { + "dns": { + "ignore_above": 1024, + "type": "keyword" + }, + "netbios": { + "ignore_above": 1024, + "type": "keyword" + }, + "tree": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "success": { + "type": "boolean" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ocsp": { + "properties": { + "file_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "revoke": { + "properties": { + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "time": { + "type": "date" + } + } + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "update": { + "properties": { + "next": { + "type": "date" + }, + "this": { + "type": "date" + } + } + } + } + }, + "pe": { + "properties": { + "client": { + "ignore_above": 1024, + "type": "keyword" + }, + "compile_time": { + "type": "date" + }, + "has_cert_table": { + "type": "boolean" + }, + "has_debug_data": { + "type": "boolean" + }, + "has_export_table": { + "type": "boolean" + }, + "has_import_table": { + "type": "boolean" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_64bit": { + "type": "boolean" + }, + "is_exe": { + "type": "boolean" + }, + "machine": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "ignore_above": 1024, + "type": "keyword" + }, + "section_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "subsystem": { + "ignore_above": 1024, + "type": "keyword" + }, + "uses_aslr": { + "type": "boolean" + }, + "uses_code_integrity": { + "type": "boolean" + }, + "uses_dep": { + "type": "boolean" + }, + "uses_seh": { + "type": "boolean" + } + } + }, + "radius": { + "properties": { + "connect_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "framed_addr": { + "type": "ip" + }, + "logged": { + "type": "boolean" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "remote_ip": { + "type": "ip" + }, + "reply_msg": { + "ignore_above": 1024, + "type": "keyword" + }, + "result": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rdp": { + "properties": { + "cert": { + "properties": { + "count": { + "type": "long" + }, + "permanent": { + "type": "boolean" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "client": { + "properties": { + "build": { + "ignore_above": 1024, + "type": "keyword" + }, + "client_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "product_id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cookie": { + "ignore_above": 1024, + "type": "keyword" + }, + "desktop": { + "properties": { + "color_depth": { + "ignore_above": 1024, + "type": "keyword" + }, + "height": { + "type": "long" + }, + "width": { + "type": "long" + } + } + }, + "done": { + "type": "boolean" + }, + "encryption": { + "properties": { + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "keyboard_layout": { + "ignore_above": 1024, + "type": "keyword" + }, + "result": { + "ignore_above": 1024, + "type": "keyword" + }, + "security_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssl": { + "type": "boolean" + } + } + }, + "rfb": { + "properties": { + "auth": { + "properties": { + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "success": { + "type": "boolean" + } + } + }, + "desktop_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "height": { + "type": "long" + }, + "share_flag": { + "type": "boolean" + }, + "version": { + "properties": { + "client": { + "properties": { + "major": { + "ignore_above": 1024, + "type": "keyword" + }, + "minor": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "major": { + "ignore_above": 1024, + "type": "keyword" + }, + "minor": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "width": { + "type": "long" + } + } + }, + "session_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "sip": { + "properties": { + "call_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "date": { + "ignore_above": 1024, + "type": "keyword" + }, + "reply_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "request": { + "properties": { + "body_length": { + "type": "long" + }, + "from": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "to": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "body_length": { + "type": "long" + }, + "from": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "to": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sequence": { + "properties": { + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "number": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "status": { + "properties": { + "code": { + "type": "long" + }, + "msg": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "transaction_depth": { + "type": "long" + }, + "uri": { + "ignore_above": 1024, + "type": "keyword" + }, + "user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "warning": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "smb_cmd": { + "properties": { + "argument": { + "ignore_above": 1024, + "type": "keyword" + }, + "command": { + "ignore_above": 1024, + "type": "keyword" + }, + "file": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "host": { + "properties": { + "rx": { + "type": "ip" + }, + "tx": { + "type": "ip" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rtt": { + "type": "double" + }, + "smb1_offered_dialects": { + "ignore_above": 1024, + "type": "keyword" + }, + "smb2_offered_dialects": { + "type": "long" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "sub_command": { + "ignore_above": 1024, + "type": "keyword" + }, + "tree": { + "ignore_above": 1024, + "type": "keyword" + }, + "tree_service": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "smb_files": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "fid": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "previous_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "times": { + "properties": { + "accessed": { + "type": "date" + }, + "changed": { + "type": "date" + }, + "created": { + "type": "date" + }, + "modified": { + "type": "date" + } + } + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "smb_mapping": { + "properties": { + "native_file_system": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "ignore_above": 1024, + "type": "keyword" + }, + "share_type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "smtp": { + "properties": { + "cc": { + "ignore_above": 1024, + "type": "keyword" + }, + "date": { + "type": "date" + }, + "first_received": { + "ignore_above": 1024, + "type": "keyword" + }, + "from": { + "ignore_above": 1024, + "type": "keyword" + }, + "fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "has_client_activity": { + "type": "boolean" + }, + "helo": { + "ignore_above": 1024, + "type": "keyword" + }, + "in_reply_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "is_webmail": { + "type": "boolean" + }, + "last_reply": { + "ignore_above": 1024, + "type": "keyword" + }, + "mail_from": { + "ignore_above": 1024, + "type": "keyword" + }, + "msg_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "ip" + }, + "process_received_from": { + "type": "boolean" + }, + "rcpt_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "reply_to": { + "ignore_above": 1024, + "type": "keyword" + }, + "second_received": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "tls": { + "type": "boolean" + }, + "to": { + "ignore_above": 1024, + "type": "keyword" + }, + "transaction_depth": { + "type": "long" + }, + "user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "x_originating_ip": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "snmp": { + "properties": { + "community": { + "ignore_above": 1024, + "type": "keyword" + }, + "display_string": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "double" + }, + "get": { + "properties": { + "bulk_requests": { + "type": "long" + }, + "requests": { + "type": "long" + }, + "responses": { + "type": "long" + } + } + }, + "set": { + "properties": { + "requests": { + "type": "long" + } + } + }, + "up_since": { + "type": "date" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "socks": { + "properties": { + "bound": { + "properties": { + "host": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + } + } + }, + "capture_password": { + "type": "boolean" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "request": { + "properties": { + "host": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + } + } + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "type": "long" + } + } + }, + "ssh": { + "properties": { + "algorithm": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "compression": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_key": { + "ignore_above": 1024, + "type": "keyword" + }, + "key_exchange": { + "ignore_above": 1024, + "type": "keyword" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "auth": { + "properties": { + "attempts": { + "type": "long" + }, + "success": { + "type": "boolean" + } + } + }, + "client": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "host_key": { + "ignore_above": 1024, + "type": "keyword" + }, + "server": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "type": "long" + } + } + }, + "ssl": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "properties": { + "cert_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_chain_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "established": { + "type": "boolean" + }, + "last_alert": { + "ignore_above": 1024, + "type": "keyword" + }, + "next_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "resumed": { + "type": "boolean" + }, + "server": { + "properties": { + "cert_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "cert_chain_fuids": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "validation": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "stats": { + "properties": { + "bytes": { + "properties": { + "received": { + "type": "long" + } + } + }, + "connections": { + "properties": { + "icmp": { + "properties": { + "active": { + "type": "long" + }, + "count": { + "type": "long" + } + } + }, + "tcp": { + "properties": { + "active": { + "type": "long" + }, + "count": { + "type": "long" + } + } + }, + "udp": { + "properties": { + "active": { + "type": "long" + }, + "count": { + "type": "long" + } + } + } + } + }, + "dns_requests": { + "properties": { + "active": { + "type": "long" + }, + "count": { + "type": "long" + } + } + }, + "events": { + "properties": { + "processed": { + "type": "long" + }, + "queued": { + "type": "long" + } + } + }, + "files": { + "properties": { + "active": { + "type": "long" + }, + "count": { + "type": "long" + } + } + }, + "memory": { + "type": "long" + }, + "packets": { + "properties": { + "dropped": { + "type": "long" + }, + "processed": { + "type": "long" + }, + "received": { + "type": "long" + } + } + }, + "peer": { + "ignore_above": 1024, + "type": "keyword" + }, + "reassembly_size": { + "properties": { + "file": { + "type": "long" + }, + "frag": { + "type": "long" + }, + "tcp": { + "type": "long" + }, + "unknown": { + "type": "long" + } + } + }, + "timers": { + "properties": { + "active": { + "type": "long" + }, + "count": { + "type": "long" + } + } + }, + "timestamp_lag": { + "type": "long" + } + } + }, + "syslog": { + "properties": { + "facility": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tunnel": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "weird": { + "properties": { + "additional_info": { + "ignore_above": 1024, + "type": "keyword" + }, + "identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "notice": { + "type": "boolean" + }, + "peer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "basic_constraints": { + "properties": { + "certificate_authority": { + "type": "boolean" + }, + "path_length": { + "type": "long" + } + } + }, + "certificate": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "exponent": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "key": { + "properties": { + "algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "length": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "serial": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "valid": { + "properties": { + "from": { + "type": "date" + }, + "until": { + "type": "date" + } + } + }, + "version": { + "type": "long" + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "log_cert": { + "type": "boolean" + }, + "san": { + "properties": { + "dns": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "other_fields": { + "type": "boolean" + }, + "uri": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + } + } + }, + "settings": { + "index": { + "mapping": { + "total_fields": { + "limit": "10000" + } + }, + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/functional/es_archives/ml/categorization_small/data.json.gz b/x-pack/test/functional/es_archives/ml/categorization_small/data.json.gz new file mode 100644 index 0000000000000..76ac07831dec1 Binary files /dev/null and b/x-pack/test/functional/es_archives/ml/categorization_small/data.json.gz differ diff --git a/x-pack/test/functional/es_archives/ml/categorization_small/mappings.json b/x-pack/test/functional/es_archives/ml/categorization_small/mappings.json new file mode 100644 index 0000000000000..b73babf361625 --- /dev/null +++ b/x-pack/test/functional/es_archives/ml/categorization_small/mappings.json @@ -0,0 +1,41 @@ +{ + "type": "index", + "value": { + "aliases": {}, + "index": "ft_categorization_small", + "mappings": { + "properties": { + "@timestamp": { + "type": "date" + }, + "field1": { + "type": "text" + }, + "field2": { + "type": "text" + }, + "field3": { + "type": "text" + }, + "field4": { + "type": "text" + }, + "field5": { + "type": "text" + }, + "field6": { + "type": "text" + }, + "field7": { + "type": "text" + } + } + }, + "settings": { + "index": { + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} diff --git a/x-pack/test/functional/es_archives/security_solution/legacy_cti_signals/data.json b/x-pack/test/functional/es_archives/security_solution/legacy_cti_signals/data.json index 56fa5ea6af329..bcc8d5f86e1d3 100644 --- a/x-pack/test/functional/es_archives/security_solution/legacy_cti_signals/data.json +++ b/x-pack/test/functional/es_archives/security_solution/legacy_cti_signals/data.json @@ -168,12 +168,12 @@ { "field": "host.name", "type": "mapping", - "value": "threat.indicator.domain" + "value": "threatintel.indicator.domain" } ] } ], - "threat_query": "threat.indicator.type : \"url\"", + "threat_query": "threatintel.indicator.type : \"url\"", "throttle": null, "to": "now", "type": "threat_match", @@ -190,7 +190,7 @@ "event": { "category": "threat", "created": "2021-08-04T03:53:30.761Z", - "dataset": "ti_abusech.malware", + "dataset": "threatintel.abuseurl", "ingested": "2021-08-04T03:53:37.514040Z", "kind": "enrichment", "module": "threatintel", @@ -412,12 +412,12 @@ { "field": "host.name", "type": "mapping", - "value": "threat.indicator.domain" + "value": "threatintel.indicator.domain" } ] } ], - "threat_query": "threat.indicator.type : \"url\"", + "threat_query": "threatintel.indicator.type : \"url\"", "throttle": null, "to": "now", "type": "threat_match", @@ -434,7 +434,7 @@ "event": { "category": "threat", "created": "2021-08-04T03:53:30.761Z", - "dataset": "ti_abusech.malware", + "dataset": "threatintel.abuseurl", "ingested": "2021-08-04T03:53:37.514040Z", "kind": "enrichment", "module": "threatintel", diff --git a/x-pack/test/functional/es_archives/signals/README.md b/x-pack/test/functional/es_archives/signals/README.md index 97c8c504a4039..01f8405d6ed58 100644 --- a/x-pack/test/functional/es_archives/signals/README.md +++ b/x-pack/test/functional/es_archives/signals/README.md @@ -24,3 +24,7 @@ A legacy signals index. It has no migration metadata fields and a very old mappi #### `signals/outdated_signals_index` A signals index that had previously been updated but is now out of date. It has migration metadata fields and a recent mapping version. + +#### `signals/index_alias_clash` + +An index that has the .siem-signals alias, but is NOT a signals index. Used for simulating an alerts-as-data index, which will have the .siem-signals alias but different mappings. This way we can test that functionality that needs to target only signals indices (e.g. mapping updates to apply field aliases) work correctly in the presence of alerts-as-data indices. diff --git a/x-pack/test/functional/es_archives/signals/index_alias_clash/data.json b/x-pack/test/functional/es_archives/signals/index_alias_clash/data.json new file mode 100644 index 0000000000000..8bba21bbfbae8 --- /dev/null +++ b/x-pack/test/functional/es_archives/signals/index_alias_clash/data.json @@ -0,0 +1,11 @@ +{ + "type": "doc", + "value": { + "id": "1", + "index": "signal_name_clash", + "source": { + "@timestamp": "2020-10-28T05:08:53.000Z" + }, + "type": "_doc" + } +} diff --git a/x-pack/test/functional/es_archives/signals/index_alias_clash/mappings.json b/x-pack/test/functional/es_archives/signals/index_alias_clash/mappings.json new file mode 100644 index 0000000000000..3a77af645b118 --- /dev/null +++ b/x-pack/test/functional/es_archives/signals/index_alias_clash/mappings.json @@ -0,0 +1,24 @@ +{ + "type": "index", + "value": { + "aliases": { + ".siem-signals-default": { + "is_write_index": false + } + }, + "index": "index_alias_clash", + "mappings": { + "properties": { + "@timestamp": { + "type": "date" + } + } + }, + "settings": { + "index": { + "number_of_replicas": "1", + "number_of_shards": "1" + } + } + } +} diff --git a/x-pack/test/functional/page_objects/observability_page.ts b/x-pack/test/functional/page_objects/observability_page.ts index d9e413d473adf..f89dafe4f3a73 100644 --- a/x-pack/test/functional/page_objects/observability_page.ts +++ b/x-pack/test/functional/page_objects/observability_page.ts @@ -11,7 +11,6 @@ import { FtrProviderContext } from '../ftr_provider_context'; export function ObservabilityPageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); - const find = getService('find'); return { async expectCreateCaseButtonEnabled() { @@ -32,6 +31,10 @@ export function ObservabilityPageProvider({ getService, getPageObjects }: FtrPro await testSubjects.missingOrFail('case-callout-e41900b01c9ef0fa81dd6ff326083fb3'); }, + async expectNoDataPage() { + await testSubjects.existOrFail('noDataPage'); + }, + async expectCreateCase() { await testSubjects.existOrFail('case-creation-form-steps'); }, @@ -47,7 +50,7 @@ export function ObservabilityPageProvider({ getService, getPageObjects }: FtrPro }, async expectForbidden() { - const h2 = await find.byCssSelector('body', 20000); + const h2 = await testSubjects.find('no_feature_permissions', 20000); const text = await h2.getVisibleText(); expect(text).to.contain('Kibana feature privileges required'); }, diff --git a/x-pack/test/functional/services/compare_images.ts b/x-pack/test/functional/services/compare_images.ts new file mode 100644 index 0000000000000..9ad98dff3819c --- /dev/null +++ b/x-pack/test/functional/services/compare_images.ts @@ -0,0 +1,149 @@ +/* + * Copyright 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 { promises as fs } from 'fs'; +import { pdf as pdfToPng } from 'pdf-to-img'; +import { comparePngs } from '../../../../test/functional/services/lib/compare_pngs'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export function CompareImagesProvider({ getService }: FtrProviderContext) { + const log = getService('log'); + const config = getService('config'); + + const screenshotsDir = config.get('screenshots.directory'); + + const writeToSessionFile = async (name: string, rawPdf: Buffer) => { + const sessionDirectory = path.resolve(screenshotsDir, 'session'); + await fs.mkdir(sessionDirectory, { recursive: true }); + const sessionReportPath = path.resolve(sessionDirectory, `${name}.png`); + await fs.writeFile(sessionReportPath, rawPdf); + return sessionReportPath; + }; + + return { + writeToSessionFile, + async checkIfPngsMatch( + actualPngPath: string, + baselinePngPath: string, + screenshotsDirectory: string = screenshotsDir + ) { + log.debug(`checkIfPngsMatch: ${baselinePngPath}`); + // Copy the pngs into the screenshot session directory, as that's where the generated pngs will automatically be + // stored. + const sessionDirectoryPath = path.resolve(screenshotsDirectory, 'session'); + const failureDirectoryPath = path.resolve(screenshotsDirectory, 'failure'); + + await fs.mkdir(sessionDirectoryPath, { recursive: true }); + await fs.mkdir(failureDirectoryPath, { recursive: true }); + + const actualPngFileName = path.basename(actualPngPath, '.png'); + const baselinePngFileName = path.basename(baselinePngPath, '.png'); + + const baselineCopyPath = path.resolve( + sessionDirectoryPath, + `${baselinePngFileName}_baseline.png` + ); + // Don't cause a test failure if the baseline snapshot doesn't exist - we don't have all OS's covered and we + // don't want to start causing failures for other devs working on OS's which are lacking snapshots. We have + // mac and linux covered which is better than nothing for now. + try { + log.debug(`writeFile: ${baselineCopyPath}`); + await fs.writeFile(baselineCopyPath, await fs.readFile(baselinePngPath)); + } catch (error) { + throw new Error(`No baseline png found at ${baselinePngPath}`); + } + + const actualCopyPath = path.resolve(sessionDirectoryPath, `${actualPngFileName}_actual.png`); + log.debug(`writeFile: ${actualCopyPath}`); + await fs.writeFile(actualCopyPath, await fs.readFile(actualPngPath)); + + let diffTotal = 0; + + const diffPngPath = path.resolve(failureDirectoryPath, `${baselinePngFileName}-${1}.png`); + diffTotal += await comparePngs( + actualCopyPath, + baselineCopyPath, + diffPngPath, + sessionDirectoryPath, + log + ); + + return diffTotal; + }, + async checkIfPdfsMatch( + actualPdfPath: string, + baselinePdfPath: string, + screenshotsDirectory = screenshotsDir + ) { + log.debug(`checkIfPdfsMatch: ${actualPdfPath} vs ${baselinePdfPath}`); + // Copy the pdfs into the screenshot session directory, as that's where the generated pngs will automatically be + // stored. + const sessionDirectoryPath = path.resolve(screenshotsDirectory, 'session'); + const failureDirectoryPath = path.resolve(screenshotsDirectory, 'failure'); + + await fs.mkdir(sessionDirectoryPath, { recursive: true }); + await fs.mkdir(failureDirectoryPath, { recursive: true }); + + const actualPdfFileName = path.basename(actualPdfPath, '.pdf'); + const baselinePdfFileName = path.basename(baselinePdfPath, '.pdf'); + + const baselineCopyPath = path.resolve( + sessionDirectoryPath, + `${baselinePdfFileName}_baseline.pdf` + ); + const actualCopyPath = path.resolve(sessionDirectoryPath, `${actualPdfFileName}_actual.pdf`); + + // Don't cause a test failure if the baseline snapshot doesn't exist - we don't have all OS's covered and we + // don't want to start causing failures for other devs working on OS's which are lacking snapshots. We have + // mac and linux covered which is better than nothing for now. + try { + log.debug(`writeFileSync: ${baselineCopyPath}`); + await fs.writeFile(baselineCopyPath, await fs.readFile(baselinePdfPath)); + } catch (error) { + log.error(`No baseline pdf found at ${baselinePdfPath}`); + return 0; + } + log.debug(`writeFileSync: ${actualCopyPath}`); + await fs.writeFile(actualCopyPath, await fs.readFile(actualPdfPath)); + + const actualPdf = await pdfToPng(actualCopyPath); + const baselinePdf = await pdfToPng(baselineCopyPath); + + log.debug(`Checking number of pages`); + + if (actualPdf.length !== baselinePdf.length) { + throw new Error( + `Expected ${baselinePdf.length} pages but got ${actualPdf.length} in PDFs expected: "${baselineCopyPath}" actual: "${actualCopyPath}".` + ); + } + + let diffTotal = 0; + let pageNum = 1; + + for await (const actualPage of actualPdf) { + for await (const baselinePage of baselinePdf) { + const diffPngPath = path.resolve( + failureDirectoryPath, + `${baselinePdfFileName}-${pageNum}.png` + ); + diffTotal += await comparePngs( + { path: path.resolve(screenshotsDirectory, '_actual.png'), buffer: actualPage }, + { path: path.resolve(screenshotsDirectory, '_baseline.png'), buffer: baselinePage }, + diffPngPath, + sessionDirectoryPath, + log + ); + ++pageNum; + break; + } + } + + return diffTotal; + }, + }; +} diff --git a/x-pack/test/functional/services/index.ts b/x-pack/test/functional/services/index.ts index 5e40eb040178b..2f9259c16d4bf 100644 --- a/x-pack/test/functional/services/index.ts +++ b/x-pack/test/functional/services/index.ts @@ -27,6 +27,9 @@ import { MonitoringBeatsListingProvider, MonitoringBeatDetailProvider, MonitoringBeatsSummaryStatusProvider, + MonitoringLogstashOverviewProvider, + MonitoringLogstashNodesProvider, + MonitoringLogstashNodeDetailProvider, MonitoringLogstashPipelinesProvider, MonitoringLogstashSummaryStatusProvider, MonitoringKibanaOverviewProvider, @@ -61,6 +64,7 @@ import { } from './dashboard'; import { SearchSessionsService } from './search_sessions'; import { ObservabilityProvider } from './observability'; +import { CompareImagesProvider } from './compare_images'; // define the name and providers for services that should be // available to your tests. If you don't specify anything here @@ -87,6 +91,9 @@ export const services = { monitoringBeatsListing: MonitoringBeatsListingProvider, monitoringBeatDetail: MonitoringBeatDetailProvider, monitoringBeatsSummaryStatus: MonitoringBeatsSummaryStatusProvider, + monitoringLogstashOverview: MonitoringLogstashOverviewProvider, + monitoringLogstashNodes: MonitoringLogstashNodesProvider, + monitoringLogstashNodeDetail: MonitoringLogstashNodeDetailProvider, monitoringLogstashPipelines: MonitoringLogstashPipelinesProvider, monitoringLogstashSummaryStatus: MonitoringLogstashSummaryStatusProvider, monitoringKibanaOverview: MonitoringKibanaOverviewProvider, @@ -112,4 +119,5 @@ export const services = { reporting: ReportingFunctionalProvider, searchSessions: SearchSessionsService, observability: ObservabilityProvider, + compareImages: CompareImagesProvider, }; diff --git a/x-pack/test/functional/services/ml/forecast.ts b/x-pack/test/functional/services/ml/forecast.ts new file mode 100644 index 0000000000000..c26216c97adfe --- /dev/null +++ b/x-pack/test/functional/services/ml/forecast.ts @@ -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 expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export function MachineLearningForecastProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + + return { + async assertForecastButtonExists() { + await testSubjects.existOrFail( + 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerButtonForecast' + ); + }, + + async assertForecastButtonEnabled(expectedValue: boolean) { + const isEnabled = await testSubjects.isEnabled( + 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerButtonForecast' + ); + expect(isEnabled).to.eql( + expectedValue, + `Expected "forecast" button to be '${expectedValue ? 'enabled' : 'disabled'}' (got '${ + isEnabled ? 'enabled' : 'disabled' + }')` + ); + }, + + async assertForecastChartElementsExists() { + await testSubjects.existOrFail(`mlForecastArea`, { + timeout: 30 * 1000, + }); + await testSubjects.existOrFail(`mlForecastValuesline`, { + timeout: 30 * 1000, + }); + await testSubjects.existOrFail(`mlForecastMarkers`, { + timeout: 30 * 1000, + }); + }, + + async assertForecastChartElementsHidden() { + await testSubjects.missingOrFail(`mlForecastArea`, { + allowHidden: true, + timeout: 30 * 1000, + }); + await testSubjects.missingOrFail(`mlForecastValuesline`, { + allowHidden: true, + timeout: 30 * 1000, + }); + await testSubjects.missingOrFail(`mlForecastMarkers`, { + allowHidden: true, + timeout: 30 * 1000, + }); + }, + + async assertForecastCheckboxExists() { + await testSubjects.existOrFail(`mlForecastCheckbox`, { + timeout: 30 * 1000, + }); + }, + + async assertForecastCheckboxMissing() { + await testSubjects.missingOrFail(`mlForecastCheckbox`, { + timeout: 30 * 1000, + }); + }, + + async clickForecastCheckbox() { + await testSubjects.click('mlForecastCheckbox'); + }, + + async openForecastModal() { + await testSubjects.click( + 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerButtonForecast' + ); + await testSubjects.existOrFail('mlModalForecast'); + }, + + async closeForecastModal() { + await testSubjects.click('mlModalForecast > mlModalForecastButtonClose'); + await this.assertForecastModalMissing(); + }, + + async assertForecastModalMissing() { + await testSubjects.missingOrFail(`mlModalForecast`, { + timeout: 30 * 1000, + }); + }, + + async assertForecastModalRunButtonEnabled(expectedValue: boolean) { + const isEnabled = await testSubjects.isEnabled('mlModalForecast > mlModalForecastButtonRun'); + expect(isEnabled).to.eql( + expectedValue, + `Expected forecast "run" button to be '${expectedValue ? 'enabled' : 'disabled'}' (got '${ + isEnabled ? 'enabled' : 'disabled' + }')` + ); + }, + + async assertForecastTableExists() { + await testSubjects.existOrFail('mlModalForecast > mlModalForecastTable'); + }, + + async clickForecastModalRunButton() { + await testSubjects.click('mlModalForecast > mlModalForecastButtonRun'); + await this.assertForecastModalMissing(); + }, + + async getForecastTableRows() { + return await testSubjects.findAll('mlModalForecastTable > ~mlForecastsListRow'); + }, + + async assertForecastTableNotEmpty() { + const tableRows = await this.getForecastTableRows(); + expect(tableRows.length).to.be.greaterThan( + 0, + `Forecast table should have at least one row (got '${tableRows.length}')` + ); + }, + }; +} diff --git a/x-pack/test/functional/services/ml/index.ts b/x-pack/test/functional/services/ml/index.ts index 17302b2782223..4b48e4c0269eb 100644 --- a/x-pack/test/functional/services/ml/index.ts +++ b/x-pack/test/functional/services/ml/index.ts @@ -24,6 +24,7 @@ import { MachineLearningDataVisualizerProvider } from './data_visualizer'; import { MachineLearningDataVisualizerFileBasedProvider } from './data_visualizer_file_based'; import { MachineLearningDataVisualizerIndexBasedProvider } from './data_visualizer_index_based'; import { MachineLearningDataVisualizerIndexPatternManagementProvider } from './data_visualizer_index_pattern_management'; +import { MachineLearningForecastProvider } from './forecast'; import { MachineLearningJobManagementProvider } from './job_management'; import { MachineLearningJobSelectionProvider } from './job_selection'; import { MachineLearningJobSourceSelectionProvider } from './job_source_selection'; @@ -92,6 +93,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { const dataVisualizerIndexPatternManagement = MachineLearningDataVisualizerIndexPatternManagementProvider(context, dataVisualizerTable); + const forecast = MachineLearningForecastProvider(context); const jobAnnotations = MachineLearningJobAnnotationsProvider(context); const jobManagement = MachineLearningJobManagementProvider(context, api); const jobSelection = MachineLearningJobSelectionProvider(context); @@ -145,6 +147,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { dataVisualizerIndexBased, dataVisualizerIndexPatternManagement, dataVisualizerTable, + forecast, jobAnnotations, jobManagement, jobSelection, diff --git a/x-pack/test/functional/services/ml/security_common.ts b/x-pack/test/functional/services/ml/security_common.ts index 847730ca73548..477164289b96b 100644 --- a/x-pack/test/functional/services/ml/security_common.ts +++ b/x-pack/test/functional/services/ml/security_common.ts @@ -59,7 +59,7 @@ export function MachineLearningSecurityCommonProvider({ getService }: FtrProvide { name: 'ft_ml_ui_extras', elasticsearch: { - cluster: ['manage_ingest_pipelines', 'monitor'], + cluster: ['manage_ingest_pipelines'], }, kibana: [], }, diff --git a/x-pack/test/functional/services/ml/single_metric_viewer.ts b/x-pack/test/functional/services/ml/single_metric_viewer.ts index ac3fd67e3f94e..29f1ded74deba 100644 --- a/x-pack/test/functional/services/ml/single_metric_viewer.ts +++ b/x-pack/test/functional/services/ml/single_metric_viewer.ts @@ -22,24 +22,6 @@ export function MachineLearningSingleMetricViewerProvider( await testSubjects.existOrFail('mlNoSingleMetricJobsFound'); }, - async assertForecastButtonExists() { - await testSubjects.existOrFail( - 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerButtonForecast' - ); - }, - - async assertForecastButtonEnabled(expectedValue: boolean) { - const isEnabled = await testSubjects.isEnabled( - 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerButtonForecast' - ); - expect(isEnabled).to.eql( - expectedValue, - `Expected "forecast" button to be '${expectedValue ? 'enabled' : 'disabled'}' (got '${ - isEnabled ? 'enabled' : 'disabled' - }')` - ); - }, - async assertDetectorInputExist() { await testSubjects.existOrFail( 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerDetectorSelect' @@ -97,28 +79,6 @@ export function MachineLearningSingleMetricViewerProvider( }); }, - async openForecastModal() { - await testSubjects.click( - 'mlSingleMetricViewerSeriesControls > mlSingleMetricViewerButtonForecast' - ); - await testSubjects.existOrFail('mlModalForecast'); - }, - - async closeForecastModal() { - await testSubjects.click('mlModalForecast > mlModalForecastButtonClose'); - await testSubjects.missingOrFail('mlModalForecast'); - }, - - async assertForecastModalRunButtonEnabled(expectedValue: boolean) { - const isEnabled = await testSubjects.isEnabled('mlModalForecast > mlModalForecastButtonRun'); - expect(isEnabled).to.eql( - expectedValue, - `Expected forecast "run" button to be '${expectedValue ? 'enabled' : 'disabled'}' (got '${ - isEnabled ? 'enabled' : 'disabled' - }')` - ); - }, - async openAnomalyExplorer() { await testSubjects.click('mlAnomalyResultsViewSelectorExplorer'); await testSubjects.existOrFail('mlPageAnomalyExplorer'); diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index f1b2ef97e4e0d..65a892d124edb 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -24,7 +24,6 @@ export enum SavedObjectType { export type MlTestResourcesi = ProvidedType; export function MachineLearningTestResourcesProvider({ getService }: FtrProviderContext) { - const es = getService('es'); const kibanaServer = getService('kibanaServer'); const log = getService('log'); const supertest = getService('supertest'); @@ -188,91 +187,6 @@ export function MachineLearningTestResourcesProvider({ getService }: FtrProvider } }, - async setupBrokenAnnotationsIndexState(jobId: string) { - // Creates a temporary annotations index with unsupported mappings. - await es.indices.create({ - index: '.ml-annotations-6-wrong-mapping', - body: { - settings: { - number_of_shards: 1, - }, - mappings: { - properties: { - field1: { type: 'text' }, - }, - }, - }, - }); - - // Ingests an annotation that will cause dynamic mapping to pick up the wrong field type. - es.create({ - id: 'annotation_with_wrong_mapping', - index: '.ml-annotations-6-wrong-mapping', - body: { - annotation: 'Annotation with wrong mapping', - create_time: 1597393915910, - create_username: '_xpack', - timestamp: 1549756800000, - end_timestamp: 1549756800000, - job_id: jobId, - modified_time: 1597393915910, - modified_username: '_xpack', - type: 'annotation', - event: 'user', - detector_index: 0, - }, - }); - - // Points the read/write aliases for annotations to the broken annotations index - // so we can run tests against a state where annotation endpoints return errors. - await es.indices.updateAliases({ - body: { - actions: [ - { - add: { - index: '.ml-annotations-6-wrong-mapping', - alias: '.ml-annotations-read', - is_hidden: true, - }, - }, - { remove: { index: '.ml-annotations-6', alias: '.ml-annotations-read' } }, - { - add: { - index: '.ml-annotations-6-wrong-mapping', - alias: '.ml-annotations-write', - is_hidden: true, - }, - }, - { remove: { index: '.ml-annotations-6', alias: '.ml-annotations-write' } }, - ], - }, - }); - }, - - async restoreAnnotationsIndexState() { - // restore the original working state of pointing read/write aliases - // to the right annotations index. - await es.indices.updateAliases({ - body: { - actions: [ - { add: { index: '.ml-annotations-6', alias: '.ml-annotations-read', is_hidden: true } }, - { remove: { index: '.ml-annotations-6-wrong-mapping', alias: '.ml-annotations-read' } }, - { - add: { index: '.ml-annotations-6', alias: '.ml-annotations-write', is_hidden: true }, - }, - { - remove: { index: '.ml-annotations-6-wrong-mapping', alias: '.ml-annotations-write' }, - }, - ], - }, - }); - - // deletes the temporary annotations index with wrong mappings - await es.indices.delete({ - index: '.ml-annotations-6-wrong-mapping', - }); - }, - async updateSavedSearchRequestBody(body: object, indexPatternTitle: string): Promise { const indexPatternId = await this.getIndexPatternId(indexPatternTitle); if (indexPatternId === undefined) { diff --git a/x-pack/test/functional/services/monitoring/cluster_overview.js b/x-pack/test/functional/services/monitoring/cluster_overview.js index 215e92fa055be..835e566386e0a 100644 --- a/x-pack/test/functional/services/monitoring/cluster_overview.js +++ b/x-pack/test/functional/services/monitoring/cluster_overview.js @@ -45,6 +45,7 @@ export function MonitoringClusterOverviewProvider({ getService }) { const SUBJ_LS_UPTIME = `${SUBJ_LS_PANEL} > lsUptime`; const SUBJ_LS_JVM_HEAP = `${SUBJ_LS_PANEL} > lsJvmHeap`; const SUBJ_LS_PIPELINES = `${SUBJ_LS_PANEL} > lsPipelines`; + const SUBJ_LS_OVERVIEW = `${SUBJ_LS_PANEL} > lsOverview`; const SUBJ_BEATS_PANEL = `clusterItemContainerBeats`; const SUBJ_BEATS_OVERVIEW = `${SUBJ_BEATS_PANEL} > beatsOverview`; @@ -179,6 +180,12 @@ export function MonitoringClusterOverviewProvider({ getService }) { getLsJvmHeap() { return testSubjects.getVisibleText(SUBJ_LS_JVM_HEAP); } + clickLsOverview() { + return testSubjects.click(SUBJ_LS_OVERVIEW); + } + clickLsNodes() { + return testSubjects.click(SUBJ_LS_NODES); + } getLsPipelines() { return testSubjects.getVisibleText(SUBJ_LS_PIPELINES); } diff --git a/x-pack/test/functional/services/monitoring/elasticsearch_nodes.js b/x-pack/test/functional/services/monitoring/elasticsearch_nodes.js index 25bfd82f01da7..e94e85fc96486 100644 --- a/x-pack/test/functional/services/monitoring/elasticsearch_nodes.js +++ b/x-pack/test/functional/services/monitoring/elasticsearch_nodes.js @@ -51,8 +51,11 @@ export function MonitoringElasticsearchNodesProvider({ getService, getPageObject return pageId !== null; } - clickRowByResolver(nodeResolver) { - return testSubjects.click(SUBJ_NODE_LINK_PREFIX + nodeResolver); + async clickRowByResolver(nodeResolver) { + await retry.waitForWithTimeout('redirection to node detail', 30000, async () => { + await testSubjects.click(SUBJ_NODE_LINK_PREFIX + nodeResolver, 5000); + return testSubjects.exists('elasticsearchNodeDetailStatus', { timeout: 5000 }); + }); } async waitForTableToFinishLoading() { diff --git a/x-pack/test/functional/services/monitoring/index.js b/x-pack/test/functional/services/monitoring/index.js index 2ca0e7fc920c1..5d337dc6ca822 100644 --- a/x-pack/test/functional/services/monitoring/index.js +++ b/x-pack/test/functional/services/monitoring/index.js @@ -20,6 +20,9 @@ export { MonitoringBeatsOverviewProvider } from './beats_overview'; export { MonitoringBeatsListingProvider } from './beats_listing'; export { MonitoringBeatDetailProvider } from './beat_detail'; export { MonitoringBeatsSummaryStatusProvider } from './beats_summary_status'; +export { MonitoringLogstashOverviewProvider } from './logstash_overview'; +export { MonitoringLogstashNodesProvider } from './logstash_nodes'; +export { MonitoringLogstashNodeDetailProvider } from './logstash_node_detail'; export { MonitoringLogstashPipelinesProvider } from './logstash_pipelines'; export { MonitoringLogstashSummaryStatusProvider } from './logstash_summary_status'; export { MonitoringKibanaOverviewProvider } from './kibana_overview'; diff --git a/x-pack/test/functional/services/monitoring/logstash_node_detail.js b/x-pack/test/functional/services/monitoring/logstash_node_detail.js new file mode 100644 index 0000000000000..42d32c0c1a2aa --- /dev/null +++ b/x-pack/test/functional/services/monitoring/logstash_node_detail.js @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function MonitoringLogstashNodeDetailProvider({ getService }) { + const testSubjects = getService('testSubjects'); + + const SUBJ_SUMMARY = 'logstashDetailStatus'; + const SUBJ_SUMMARY_HTTP_ADDRESS = `${SUBJ_SUMMARY} > httpAddress`; + const SUBJ_SUMMARY_EVENTS_IN = `${SUBJ_SUMMARY} > eventsIn`; + const SUBJ_SUMMARY_EVENTS_OUT = `${SUBJ_SUMMARY} > eventsOut`; + const SUBJ_SUMMARY_NUM_RELOADS = `${SUBJ_SUMMARY} > numReloads`; + const SUBJ_SUMMARY_PIPELINE_WORKERS = `${SUBJ_SUMMARY} > pipelineWorkers`; + const SUBJ_SUMMARY_PIPELINE_BATCH_SIZE = `${SUBJ_SUMMARY} > pipelineBatchSize`; + const SUBJ_SUMMARY_VERSION = `${SUBJ_SUMMARY} > version`; + const SUBJ_SUMMARY_UPTIME = `${SUBJ_SUMMARY} > uptime`; + + return new (class LogstashNodeDetail { + async clickPipelines() { + return testSubjects.click('logstashNodeDetailPipelinesLink'); + } + async clickAdvanced() { + return testSubjects.click('logstashNodeDetailAdvancedLink'); + } + + async getSummary() { + return { + httpAddress: await testSubjects.getVisibleText(SUBJ_SUMMARY_HTTP_ADDRESS), + eventsIn: await testSubjects.getVisibleText(SUBJ_SUMMARY_EVENTS_IN), + eventsOut: await testSubjects.getVisibleText(SUBJ_SUMMARY_EVENTS_OUT), + numReloads: await testSubjects.getVisibleText(SUBJ_SUMMARY_NUM_RELOADS), + pipelineWorkers: await testSubjects.getVisibleText(SUBJ_SUMMARY_PIPELINE_WORKERS), + pipelineBatchSize: await testSubjects.getVisibleText(SUBJ_SUMMARY_PIPELINE_BATCH_SIZE), + version: await testSubjects.getVisibleText(SUBJ_SUMMARY_VERSION), + uptime: await testSubjects.getVisibleText(SUBJ_SUMMARY_UPTIME), + }; + } + })(); +} diff --git a/x-pack/test/functional/services/monitoring/logstash_nodes.js b/x-pack/test/functional/services/monitoring/logstash_nodes.js new file mode 100644 index 0000000000000..2666cdc3d0654 --- /dev/null +++ b/x-pack/test/functional/services/monitoring/logstash_nodes.js @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { range } from 'lodash'; +export function MonitoringLogstashNodesProvider({ getService, getPageObjects }) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['monitoring']); + const find = getService('find'); + + const SUBJ_OVERVIEW_PAGE = 'logstashNodesPage'; + const SUBJ_TABLE_CONTAINER = 'logstashNodesTableContainer'; + const SUBJ_SEARCH_BAR = `${SUBJ_TABLE_CONTAINER} > monitoringTableToolBar`; + const SUBJ_TABLE_NO_DATA = `${SUBJ_TABLE_CONTAINER} > monitoringTableNoData`; + const SUBJ_NODE_NAME = `${SUBJ_TABLE_CONTAINER} > name`; + const SUBJ_NODE_ALERT_STATUS = `${SUBJ_TABLE_CONTAINER} > alertStatusText`; + const SUBJ_NODE_IP = `${SUBJ_TABLE_CONTAINER} > httpAddress`; + const SUBJ_NODE_CPU_USAGE = `${SUBJ_TABLE_CONTAINER} > cpuUsage`; + const SUBJ_NODE_LOAD_AVERAGE = `${SUBJ_TABLE_CONTAINER} > loadAverage`; + const SUBJ_NODE_JVM_HEAP_USED = `${SUBJ_TABLE_CONTAINER} > jvmHeapUsed`; + const SUBJ_NODE_EVENTS_OUT = `${SUBJ_TABLE_CONTAINER} > eventsOut`; + const SUBJ_NODE_CONFIG_RELOADS_SUCCESS = `${SUBJ_TABLE_CONTAINER} > configReloadsSuccess`; + const SUBJ_NODE_CONFIG_RELOADS_FAILURE = `${SUBJ_TABLE_CONTAINER} > configReloadsFailure`; + const SUBJ_NODE_VERSION = `${SUBJ_TABLE_CONTAINER} > version`; + + const SUBJ_NODE_LINK_PREFIX = `${SUBJ_TABLE_CONTAINER} > nodeLink-`; + + return new (class LogstashNodes { + async isOnNodesListing() { + const pageId = await retry.try(() => testSubjects.find(SUBJ_OVERVIEW_PAGE)); + return pageId !== null; + } + async clickRowByResolver(nodeResolver) { + await retry.waitForWithTimeout('redirection to node detail', 30000, async () => { + await testSubjects.click(SUBJ_NODE_LINK_PREFIX + nodeResolver, 5000); + return testSubjects.exists('logstashDetailStatus', { timeout: 5000 }); + }); + } + getRows() { + return PageObjects.monitoring.tableGetRowsFromContainer(SUBJ_TABLE_CONTAINER); + } + async setFilter(text) { + await PageObjects.monitoring.tableSetFilter(SUBJ_SEARCH_BAR, text); + await this.waitForTableToFinishLoading(); + } + + async clearFilter() { + await PageObjects.monitoring.tableClearFilter(SUBJ_SEARCH_BAR); + await this.waitForTableToFinishLoading(); + } + + assertNoData() { + return PageObjects.monitoring.assertTableNoData(SUBJ_TABLE_NO_DATA); + } + async waitForTableToFinishLoading() { + await retry.try(async () => { + await find.waitForDeletedByCssSelector('.euiBasicTable-loading', 5000); + }); + } + async getNodesAll() { + const name = await testSubjects.getVisibleTextAll(SUBJ_NODE_NAME); + const alertStatus = await testSubjects.getVisibleTextAll(SUBJ_NODE_ALERT_STATUS); + const httpAddress = await testSubjects.getVisibleTextAll(SUBJ_NODE_IP); + const cpuUsage = await testSubjects.getVisibleTextAll(SUBJ_NODE_CPU_USAGE); + const loadAverage = await testSubjects.getVisibleTextAll(SUBJ_NODE_LOAD_AVERAGE); + const jvmHeapUsed = await testSubjects.getVisibleTextAll(SUBJ_NODE_JVM_HEAP_USED); + const eventsOut = await testSubjects.getVisibleTextAll(SUBJ_NODE_EVENTS_OUT); + const configReloadsSuccess = await testSubjects.getVisibleTextAll( + SUBJ_NODE_CONFIG_RELOADS_SUCCESS + ); + const configReloadsFailure = await testSubjects.getVisibleTextAll( + SUBJ_NODE_CONFIG_RELOADS_FAILURE + ); + const version = await testSubjects.getVisibleTextAll(SUBJ_NODE_VERSION); + + // tuple-ize the icons and texts together into an array of objects + const tableRows = await this.getRows(); + const iterator = range(tableRows.length); + return iterator.reduce((all, current) => { + return [ + ...all, + { + id: name[current], + httpAddress: httpAddress[current], + alertStatus: alertStatus[current], + cpuUsage: cpuUsage[current], + loadAverage: loadAverage[current], + jvmHeapUsed: jvmHeapUsed[current], + eventsOut: eventsOut[current], + configReloadsSuccess: configReloadsSuccess[current], + configReloadsFailure: configReloadsFailure[current], + version: version[current], + }, + ]; + }, []); + } + })(); +} diff --git a/x-pack/test/functional/services/monitoring/logstash_overview.js b/x-pack/test/functional/services/monitoring/logstash_overview.js new file mode 100644 index 0000000000000..55ac738c8ffea --- /dev/null +++ b/x-pack/test/functional/services/monitoring/logstash_overview.js @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function MonitoringLogstashOverviewProvider({ getService }) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + + const SUBJ_OVERVIEW_PAGE = 'logstashOverviewPage'; + + return new (class LogstashOverview { + async isOnOverview() { + const pageId = await retry.try(() => testSubjects.find(SUBJ_OVERVIEW_PAGE)); + return pageId !== null; + } + })(); +} diff --git a/x-pack/test/functional/services/observability/alerts/common.ts b/x-pack/test/functional/services/observability/alerts/common.ts index d5a2ce2a18c41..866febc9b9f5b 100644 --- a/x-pack/test/functional/services/observability/alerts/common.ts +++ b/x-pack/test/functional/services/observability/alerts/common.ts @@ -66,6 +66,10 @@ export function ObservabilityAlertsCommonProvider({ return await testSubjects.existOrFail(ALERTS_TABLE_CONTAINER_SELECTOR); }; + const getNoDataPageOrFail = async () => { + return await testSubjects.existOrFail('noDataPage'); + }; + const getNoDataStateOrFail = async () => { return await testSubjects.existOrFail('tGridEmptyState'); }; @@ -193,6 +197,7 @@ export function ObservabilityAlertsCommonProvider({ getCopyToClipboardButton, getFilterForValueButton, copyToClipboardButtonExists, + getNoDataPageOrFail, getNoDataStateOrFail, getTableCells, getTableCellsInRows, diff --git a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts index f08867b445f75..9f175d8a6262d 100644 --- a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts @@ -16,7 +16,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const supertest = getService('supertest'); const retry = getService('retry'); - describe('overview page alert flyout controls', function () { + // FLAKY: https://github.com/elastic/kibana/issues/101984 + describe.skip('overview page alert flyout controls', function () { const DEFAULT_DATE_START = 'Sep 10, 2019 @ 12:40:08.078'; const DEFAULT_DATE_END = 'Sep 11, 2019 @ 19:40:08.078'; let alerts: any; @@ -141,7 +142,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - describe('tls alert', function () { + // FLAKY: https://github.com/elastic/kibana/issues/116865 + describe.skip('tls alert', function () { const DEFAULT_DATE_START = 'Sep 10, 2019 @ 12:40:08.078'; const DEFAULT_DATE_END = 'Sep 11, 2019 @ 19:40:08.078'; let alerts: any; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts index 4541a758a02f1..cb858a4791b71 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_list_items.ts @@ -27,7 +27,6 @@ import { deleteAllExceptions } from '../../utils'; // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('create_exception_list_items', () => { describe('validation errors', () => { @@ -47,7 +46,7 @@ export default ({ getService }: FtrProviderContext) => { describe('creating exception list items', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should create a simple exception list item with a list item id', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts index 7e34c80806cc4..e7f5d96bfb76a 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_exception_lists.ts @@ -21,12 +21,11 @@ import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } fro // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('create_exception_lists', () => { describe('creating exception lists', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should create a simple exception list', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts index 229d5737a99bb..acf968c8b78af 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_list_items.ts @@ -22,12 +22,11 @@ import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('delete_exception_list_items', () => { describe('delete exception list items', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should delete a single exception list item by its item_id', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts index d83c4bdc2f1a9..0f8ca96e5383a 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_exception_lists.ts @@ -21,12 +21,11 @@ import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } fro // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('delete_exception_lists', () => { describe('delete exception lists', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should delete a single exception list by its list_id', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts index 5d1abf6f74f7e..3c01d93380736 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts @@ -33,7 +33,6 @@ import { DETECTION_TYPE, LIST_ID } from '../../../../plugins/lists/common/consta // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('delete_lists', () => { describe('deleting lists', () => { @@ -117,7 +116,7 @@ export default ({ getService }: FtrProviderContext) => { describe('deleting lists referenced in exceptions', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should return an error when deleting a list referenced within an exception list item', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_exception_list.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_exception_list.ts index c21026d5df3d2..c61f4a2b1d02f 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_exception_list.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_exception_list.ts @@ -22,12 +22,11 @@ import { getCreateExceptionListItemMinimalSchemaMock } from '../../../../plugins // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('es'); describe('export_exception_list_route', () => { describe('exporting exception lists', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should set the response content types to be expected', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts index 7b23ab7d6f866..bdacd674d7519 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_list_items.ts @@ -18,12 +18,11 @@ import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('es'); describe('find_exception_list_items', () => { describe('find exception list items', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should return an empty find body correctly if no exception list items are loaded', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts index 9972ed6a89171..158d951b2bd68 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_exception_lists.ts @@ -17,12 +17,11 @@ import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } fro // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('es'); describe('find_exception_lists', () => { describe('find exception lists', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should return an empty find body correctly if no exception lists are loaded', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts index 0a7caed8a5e14..9345306e0c3e1 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_list_items.ts @@ -22,12 +22,11 @@ import { deleteAllExceptions, removeExceptionListItemServerGeneratedProperties } // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('read_exception_list_items', () => { describe('reading exception list items', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should be able to read a single exception list items using item_id', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts index db53a0ed18a0c..b9f2b89a3e0ee 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_exception_lists.ts @@ -21,12 +21,11 @@ import { deleteAllExceptions, removeExceptionListServerGeneratedProperties } fro // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('read_exception_lists', () => { describe('reading exception lists', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should be able to read a single exception list using list_id', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/summary_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/summary_exception_lists.ts index 13ba7da4c7aaa..b71a7dbe768d2 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/summary_exception_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/summary_exception_lists.ts @@ -21,7 +21,6 @@ interface SummaryResponseType { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('summary_exception_lists', () => { describe('summary exception lists', () => { @@ -30,7 +29,7 @@ export default ({ getService }: FtrProviderContext) => { }); afterEach(async () => { await deleteListsIndex(supertest); - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should give a validation error if the list_id and the id are not supplied', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts index b611d5c31de67..fa0466f14db28 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_list_items.ts @@ -24,12 +24,11 @@ import { getUpdateMinimalExceptionListItemSchemaMock } from '../../../../plugins // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('update_exception_list_items', () => { describe('update exception list items', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should update a single exception list item property of name using an id', async () => { diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts index 75064860da1c2..2eeaca7f0521b 100644 --- a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_exception_lists.ts @@ -23,12 +23,11 @@ import { getUpdateMinimalExceptionListSchemaMock } from '../../../../plugins/lis // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('es'); describe('update_exception_lists', () => { describe('update exception lists', () => { afterEach(async () => { - await deleteAllExceptions(es); + await deleteAllExceptions(supertest); }); it('should update a single exception list property of name using an id', async () => { diff --git a/x-pack/test/lists_api_integration/utils.ts b/x-pack/test/lists_api_integration/utils.ts index b3816ad7563b8..eda32c7fe9fb8 100644 --- a/x-pack/test/lists_api_integration/utils.ts +++ b/x-pack/test/lists_api_integration/utils.ts @@ -6,7 +6,6 @@ */ import type SuperTest from 'supertest'; -import type { KibanaClient } from '@elastic/elasticsearch/api/kibana'; import type { Type, @@ -14,10 +13,15 @@ import type { ListItemSchema, ExceptionListSchema, ExceptionListItemSchema, + ExceptionList, } from '@kbn/securitysolution-io-ts-list-types'; -import { LIST_INDEX, LIST_ITEM_URL } from '@kbn/securitysolution-list-constants'; +import { + EXCEPTION_LIST_URL, + LIST_INDEX, + LIST_ITEM_URL, +} from '@kbn/securitysolution-list-constants'; import { getImportListItemAsBuffer } from '../../plugins/lists/common/schemas/request/import_list_item_schema.mock'; -import { countDownES, countDownTest } from '../detection_engine_api_integration/utils'; +import { countDownTest } from '../detection_engine_api_integration/utils'; /** * Creates the lists and lists items index for use inside of beforeEach blocks of tests @@ -160,20 +164,34 @@ export const binaryToString = (res: any, callback: any): void => { }; /** - * Remove all exceptions from the .kibana index - * This will retry 20 times before giving up and hopefully still not interfere with other tests - * @param es The ElasticSearch handle + * Remove all exceptions + * This will retry 50 times before giving up and hopefully still not interfere with other tests + * @param supertest The supertest handle */ -export const deleteAllExceptions = async (es: KibanaClient): Promise => { - return countDownES(async () => { - return es.deleteByQuery({ - index: '.kibana', - q: 'type:exception-list or type:exception-list-agnostic', - wait_for_completion: true, - refresh: true, - body: {}, - }); - }, 'deleteAllExceptions'); +export const deleteAllExceptions = async ( + supertest: SuperTest.SuperTest +): Promise => { + await countDownTest( + async () => { + const { body } = await supertest + .get(`${EXCEPTION_LIST_URL}/_find?per_page=9999`) + .set('kbn-xsrf', 'true') + .send(); + + const ids: string[] = body.data.map((exception: ExceptionList) => exception.id); + for await (const id of ids) { + await supertest.delete(`${EXCEPTION_LIST_URL}?id=${id}`).set('kbn-xsrf', 'true').send(); + } + const { body: finalCheck } = await supertest + .get(`${EXCEPTION_LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send(); + return finalCheck.data.length === 0; + }, + 'deleteAllExceptions', + 50, + 1000 + ); }; /** @@ -192,12 +210,20 @@ export const importFile = async ( fileName: string, testValues?: string[] ): Promise => { - await supertest + const response = await supertest .post(`${LIST_ITEM_URL}/_import?type=${type}`) .set('kbn-xsrf', 'true') .attach('file', getImportListItemAsBuffer(contents), fileName) - .expect('Content-Type', 'application/json; charset=utf-8') - .expect(200); + .expect('Content-Type', 'application/json; charset=utf-8'); + + if (response.status !== 200) { + // eslint-disable-next-line no-console + console.log( + `Did not get an expected 200 "ok" When importing a file. CI issues could happen. Suspect this line if you are seeing CI issues. body: ${JSON.stringify( + response.body + )}, status: ${JSON.stringify(response.status)}` + ); + } // although we have pushed the list and its items, it is async so we // have to wait for the contents before continuing diff --git a/x-pack/test/load/runner.ts b/x-pack/test/load/runner.ts index 0bea5992f5539..c48a8e33d6eef 100644 --- a/x-pack/test/load/runner.ts +++ b/x-pack/test/load/runner.ts @@ -28,7 +28,11 @@ if (!Fs.existsSync(gatlingProjectRootPath)) { ); } -const dropEmptyLines = (s: string) => s.split(',').filter((i) => i.length > 0); +const dropEmptyLines = (s: string) => + s + .split(',') + .filter((i) => i.length > 0) + .map((i) => (i.includes('.') ? i : `branch.${i}`)); const simulationClasses = dropEmptyLines(simulationEntry); const simulationsRootPath = resolve(gatlingProjectRootPath, baseSimulationPath); diff --git a/x-pack/test/observability_functional/apps/observability/alerts/add_to_case.ts b/x-pack/test/observability_functional/apps/observability/alerts/add_to_case.ts index f29111f2cb66b..5e80a5769b44d 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/add_to_case.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/add_to_case.ts @@ -17,9 +17,11 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/observability/alerts'); + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); }); after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); }); diff --git a/x-pack/test/observability_functional/apps/observability/alerts/index.ts b/x-pack/test/observability_functional/apps/observability/alerts/index.ts index 14019472eb2ca..a247f42da5821 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/index.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/index.ts @@ -38,7 +38,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); }); + describe('With no data', () => { + it('Shows the no data screen', async () => { + await observability.alerts.common.getNoDataPageOrFail(); + }); + }); + describe('Alerts table', () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); + await observability.alerts.common.navigateToTimeWithData(); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); + }); + it('Renders the table', async () => { await observability.alerts.common.getTableOrFail(); }); diff --git a/x-pack/test/observability_functional/apps/observability/alerts/workflow_status.ts b/x-pack/test/observability_functional/apps/observability/alerts/workflow_status.ts index a68636b8cb0c0..879cef01c2ada 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/workflow_status.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/workflow_status.ts @@ -21,11 +21,13 @@ export default ({ getService }: FtrProviderContext) => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/observability/alerts'); + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.alerts.common.navigateToTimeWithData(); }); after(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); }); it('is filtered to only show "open" alerts by default', async () => { diff --git a/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts b/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts index 69bf995c49ae4..85512f8333038 100644 --- a/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts +++ b/x-pack/test/observability_functional/apps/observability/feature_controls/observability_security.ts @@ -31,8 +31,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/cases/default'); }); + it('Shows the no data page on load', async () => { + await PageObjects.common.navigateToActualUrl('observabilityCases'); + await PageObjects.observability.expectNoDataPage(); + }); + describe('observability cases all privileges', () => { before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ observabilityCases: ['all'], @@ -42,6 +48,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.users.restoreDefaultTestUserRole(); }); @@ -83,6 +90,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('observability cases read-only privileges', () => { before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ observabilityCases: ['read'], @@ -92,6 +100,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await observability.users.restoreDefaultTestUserRole(); }); diff --git a/x-pack/test/observability_functional/with_rac_write.config.ts b/x-pack/test/observability_functional/with_rac_write.config.ts index 89a0da7857333..3f68441fc9905 100644 --- a/x-pack/test/observability_functional/with_rac_write.config.ts +++ b/x-pack/test/observability_functional/with_rac_write.config.ts @@ -36,10 +36,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...xpackFunctionalConfig.get('kbnTestServer.serverArgs'), `--elasticsearch.hosts=https://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, - // TO DO: Remove feature flags once we're good to go - '--xpack.observability.unsafe.alertingExperience.enabled=true', - '--xpack.observability.unsafe.cases.enabled=true', - '--xpack.ruleRegistry.write.enabled=true', ], }, testFiles: [resolve(__dirname, './apps/observability')], diff --git a/x-pack/test/saved_object_tagging/functional/tests/som_integration.ts b/x-pack/test/saved_object_tagging/functional/tests/som_integration.ts index e35b33b3b4475..79f7c74db2a0d 100644 --- a/x-pack/test/saved_object_tagging/functional/tests/som_integration.ts +++ b/x-pack/test/saved_object_tagging/functional/tests/som_integration.ts @@ -36,7 +36,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await testSubjects.click('savedObjectSearchBar'); }; - describe('saved objects management integration', () => { + // FLAKY: https://github.com/elastic/kibana/issues/115320 + describe.skip('saved objects management integration', () => { before(async () => { await esArchiver.load( 'x-pack/test/saved_object_tagging/common/fixtures/es_archiver/so_management' diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json index a2e0c2d2921dc..c5d382194027f 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json @@ -2,7 +2,7 @@ "type": "doc", "value": { "id": "84cf452c1e0375c3d4412cb550bd1783358468a3b3b777da4829d72c7d6fb74f", - "index": "logs-ti_abusech.malware", + "index": "filebeat-7.12.0-2021.03.10-000001", "source": { "@timestamp": "2021-03-10T14:51:05.766Z", "agent": { @@ -16,7 +16,7 @@ "fileset": { "name": "abusemalware" }, - "threat": { + "threatintel": { "indicator": { "first_seen": "2021-03-10T08:02:14.000Z", "file": { @@ -31,13 +31,13 @@ } }, "type": "file" - } - }, - "abusemalware": { - "virustotal": { - "result": "38 / 61", - "link": "https://www.virustotal.com/gui/file/a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3/detection/f-a04ac6d", - "percent": "62.30" + }, + "abusemalware": { + "virustotal": { + "result": "38 / 61", + "link": "https://www.virustotal.com/gui/file/a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3/detection/f-a04ac6d", + "percent": "62.30" + } } }, "tags": [ @@ -68,7 +68,7 @@ "module": "threatintel", "category": "threat", "type": "indicator", - "dataset": "ti_abusech.malware" + "dataset": "threatintel.abusemalware" } } } diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json index 8840cd4bee0dd..efd23c5a6bba4 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json @@ -6,7 +6,7 @@ "is_write_index": true } }, - "index": "logs-ti_abusech.malware", + "index": "filebeat-7.12.0-2021.03.10-000001", "mappings": { "_meta": { "beat": "filebeat", @@ -194,7 +194,7 @@ } } }, - "threat": { + "threatintel": { "properties": { "abusemalware": { "properties": { diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/data.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/data.json index 1a8d3ff5a309a..0598fd7ba7c86 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/data.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/data.json @@ -2,7 +2,7 @@ "type": "doc", "value": { "id": "a04ac6d98ad989312783d4fe3456c53730b212c79a426fb215708b6c6daa3de3", - "index": "logs-ti_abusech.malware", + "index": "filebeat-7.12.0-2021.03.11-000001", "source": { "@timestamp": "2021-06-27T14:51:05.766Z", "agent": { @@ -16,7 +16,7 @@ "fileset": { "name": "abusemalware" }, - "threat": { + "threatintel": { "indicator": { "first_seen": "2021-03-11T08:02:14.000Z", "ip": "192.168.1.1", @@ -56,7 +56,7 @@ "module": "threatintel", "category": "threat", "type": "indicator", - "dataset": "ti_abusech.malware" + "dataset": "threatintel.abusemalware" } } } diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/mappings.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/mappings.json index cba4263f32b69..072318f7f4fc4 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator2/mappings.json @@ -2,11 +2,11 @@ "type": "index", "value": { "aliases": { - "logs-ti": { + "filebeat-7.12.0": { "is_write_index": false } }, - "index": "logs-ti_abusech.malware", + "index": "filebeat-7.12.0-2021.03.11-000001", "mappings": { "_meta": { "beat": "filebeat", @@ -194,7 +194,7 @@ } } }, - "threat": { + "threatintel": { "properties": { "abusemalware": { "properties": { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts index 75c2dec6e9c9d..48c0aea825048 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts @@ -20,8 +20,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const endpointTestResources = getService('endpointTestResources'); const policyTestResources = getService('policyTestResources'); - // Skipping Flakey test: https://github.com/elastic/kibana/issues/110309 - describe.skip('Endpoint permissions:', () => { + describe('Endpoint permissions:', () => { let indexedData: IndexedHostsAndAlertsResponse; before(async () => { @@ -62,7 +61,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.existOrFail('noIngestPermissions'); }); - it('should display endpoint data on Host Details', async () => { + // FIXME:PT skipped. need to fix security-team bug #1929 + it.skip('should display endpoint data on Host Details', async () => { const endpoint = indexedData.hosts[0]; await PageObjects.hosts.navigateToHostDetails(endpoint.host.name); const endpointSummary = await PageObjects.hosts.hostDetailsEndpointOverviewData(); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 323b08dd88be1..6ac54750c6ec8 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -6,12 +6,19 @@ */ import expect from '@kbn/expect'; +import { DeepPartial } from 'utility-types'; +import { merge } from 'lodash'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; import { IndexedHostsAndAlertsResponse } from '../../../../plugins/security_solution/common/endpoint/index_data'; +import { FullAgentPolicyInput } from '../../../../plugins/fleet/common'; +import { PolicyConfig } from '../../../../plugins/security_solution/common/endpoint/types'; +import { ManifestSchema } from '../../../../plugins/security_solution/common/endpoint/schema/manifest'; +import { policyFactory } from '../../../../plugins/security_solution/common/endpoint/models/policy_config'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const browser = getService('browser'); + const retryService = getService('retry'); const pageObjects = getPageObjects([ 'common', 'endpoint', @@ -24,18 +31,224 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const policyTestResources = getService('policyTestResources'); const endpointTestResources = getService('endpointTestResources'); - // FLAKY https://github.com/elastic/kibana/issues/100296 - describe.skip('When on the Endpoint Policy Details Page', function () { + type FullAgentPolicyEndpointInput = Omit & { + policy: PolicyConfig; + artifact_manifest: ManifestSchema; + }; + + /** + * Returns the Fleet Agent Policy Input that represents an Endpoint Policy. Use it to + * validate expecte output when looking at the Fleet Agent policy to validate that updates + * to the Endpoint Policy are making it through to the overall Fleet Agent Policy + * + * @param overrides + */ + const getExpectedAgentPolicyEndpointInput = ( + overrides: DeepPartial = {} + ): FullAgentPolicyInput => { + return merge( + { + id: '123', + revision: 2, + data_stream: { namespace: 'default' }, + name: 'Protect East Coast', + meta: { + package: { + name: 'endpoint', + version: '1.0', + }, + }, + artifact_manifest: { + artifacts: { + 'endpoint-exceptionlist-linux-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-exceptionlist-macos-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-exceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-exceptionlist-windows-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-hostisolationexceptionlist-linux-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-hostisolationexceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-hostisolationexceptionlist-macos-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-hostisolationexceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-hostisolationexceptionlist-windows-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-hostisolationexceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-trustlist-linux-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-trustlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-trustlist-macos-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-trustlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-trustlist-windows-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-trustlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-eventfilterlist-linux-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-eventfilterlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-eventfilterlist-macos-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-eventfilterlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + 'endpoint-eventfilterlist-windows-v1': { + compression_algorithm: 'zlib', + decoded_sha256: 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + decoded_size: 14, + encoded_sha256: 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', + encoded_size: 22, + encryption_algorithm: 'none', + relative_url: + '/api/fleet/artifacts/endpoint-eventfilterlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', + }, + }, + manifest_version: '1', + schema_version: 'v1', + }, + policy: merge(policyFactory(), { + windows: { + popup: { + malware: { + message: 'Elastic Security {action} {filename}', + }, + ransomware: { + message: 'Elastic Security {action} {filename}', + }, + memory_protection: { + message: 'Elastic Security {action} {rule}', + }, + behavior_protection: { + message: 'Elastic Security {action} {rule}', + }, + }, + }, + mac: { + popup: { + malware: { + message: 'Elastic Security {action} {filename}', + }, + behavior_protection: { + message: 'Elastic Security {action} {rule}', + }, + memory_protection: { + message: 'Elastic Security {action} {rule}', + }, + }, + }, + linux: { + popup: { + malware: { + message: 'Elastic Security {action} {filename}', + }, + behavior_protection: { + message: 'Elastic Security {action} {rule}', + }, + memory_protection: { + message: 'Elastic Security {action} {rule}', + }, + }, + }, + }), + type: 'endpoint', + use_output: 'default', + }, + overrides + ); + }; + + describe('When on the Endpoint Policy Details Page', function () { let indexedData: IndexedHostsAndAlertsResponse; + before(async () => { const endpointPackage = await policyTestResources.getEndpointPackage(); await endpointTestResources.setMetadataTransformFrequency('1s', endpointPackage.version); indexedData = await endpointTestResources.loadEndpointData(); await browser.refresh(); }); + after(async () => { await endpointTestResources.unloadEndpointData(indexedData); }); + describe('with an invalid policy id', () => { it('should display an error', async () => { await pageObjects.policy.navigateToPolicyDetails('invalid-id'); @@ -69,13 +282,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('and the show advanced settings button is clicked', async () => { await testSubjects.missingOrFail('advancedPolicyPanel'); - let advancedPolicyButton = await pageObjects.policy.findAdvancedPolicyButton(); - await advancedPolicyButton.click(); - + // Expand + await pageObjects.policy.showAdvancedSettingsSection(); await testSubjects.existOrFail('advancedPolicyPanel'); - advancedPolicyButton = await pageObjects.policy.findAdvancedPolicyButton(); - await advancedPolicyButton.click(); + // Collapse + await pageObjects.policy.hideAdvancedSettingsSection(); await testSubjects.missingOrFail('advancedPolicyPanel'); }); }); @@ -99,11 +311,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(await testSubjects.isChecked('malwareUserNotificationCheckbox')).to.be(true); await testSubjects.existOrFail('malwareUserNotificationCustomMessage'); }); + it('should not show the custom message text area when the Notify User checkbox is unchecked', async () => { await pageObjects.endpointPageUtils.clickOnEuiCheckbox('malwareUserNotificationCheckbox'); expect(await testSubjects.isChecked('malwareUserNotificationCheckbox')).to.be(false); await testSubjects.missingOrFail('malwareUserNotificationCustomMessage'); }); + it('should preserve a custom notification message upon saving', async () => { const customMessage = await testSubjects.find('malwareUserNotificationCustomMessage'); await customMessage.clearValue(); @@ -139,11 +353,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { `Integration ${policyInfo.packagePolicy.name} has been updated.` ); }); + it('should persist update on the screen', async () => { await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_process'); await pageObjects.policy.confirmAndSave(); await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await pageObjects.common.closeToast(); await pageObjects.endpoint.navigateToEndpointList(); await pageObjects.policy.navigateToPolicyDetails(policyInfo.packagePolicy.id); @@ -151,6 +367,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { false ); }); + it('should have updated policy data in overall Agent Policy', async () => { // This test ensures that updates made to the Endpoint Policy are carried all the way through // to the generated Agent Policy that is dispatch down to the Elastic Agent. @@ -161,8 +378,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyMacEvent_file'), ]); - const advancedPolicyButton = await pageObjects.policy.findAdvancedPolicyButton(); - await advancedPolicyButton.click(); + await pageObjects.policy.showAdvancedSettingsSection(); const advancedPolicyField = await pageObjects.policy.findAdvancedPolicyField(); await advancedPolicyField.clearValue(); @@ -177,226 +393,38 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); expect(agentFullPolicy.inputs).to.eql([ - { + getExpectedAgentPolicyEndpointInput({ id: policyInfo.packagePolicy.id, - revision: 2, - data_stream: { namespace: 'default' }, - name: 'Protect East Coast', meta: { package: { - name: 'endpoint', version: policyInfo.packageInfo.version, }, }, artifact_manifest: { - artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - }, - // The manifest version could have changed when the Policy was updated because the - // policy details page ensures that a save action applies the udpated policy on top - // of the latest Package Policy. So we just ignore the check against this value by - // forcing it to be the same as the value returned in the full agent policy. manifest_version: agentFullPolicy.inputs[0].artifact_manifest.manifest_version, - schema_version: 'v1', }, policy: { linux: { - events: { file: false, network: true, process: true }, - logging: { file: 'info' }, - advanced: { agent: { connection_delay: 'true' } }, - malware: { mode: 'prevent' }, - behavior_protection: { mode: 'prevent', supported: true }, - memory_protection: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - }, - }, - mac: { - events: { file: false, network: true, process: true }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - behavior_protection: { mode: 'prevent', supported: true }, - memory_protection: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - }, - }, - windows: { events: { - dll_and_driver_load: true, - dns: true, file: false, - network: true, - process: true, - registry: true, - security: true, }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - memory_protection: { mode: 'prevent', supported: true }, - behavior_protection: { mode: 'prevent', supported: true }, - ransomware: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', + advanced: { + agent: { + connection_delay: 'true', }, - ransomware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - }, - antivirus_registration: { - enabled: false, }, }, + mac: { + events: { file: false }, + }, + windows: { events: { file: false } }, }, - type: 'endpoint', - use_output: 'default', - }, + }), ]); }); it('should have cleared the advanced section when the user deletes the value', async () => { - const advancedPolicyButton = await pageObjects.policy.findAdvancedPolicyButton(); - await advancedPolicyButton.click(); + await pageObjects.policy.showAdvancedSettingsSection(); const advancedPolicyField = await pageObjects.policy.findAdvancedPolicyField(); await advancedPolicyField.clearValue(); @@ -411,220 +439,26 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); expect(agentFullPolicy.inputs).to.eql([ - { + getExpectedAgentPolicyEndpointInput({ id: policyInfo.packagePolicy.id, - revision: 2, - data_stream: { namespace: 'default' }, - name: 'Protect East Coast', meta: { package: { - name: 'endpoint', version: policyInfo.packageInfo.version, }, }, artifact_manifest: { - artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - }, - // The manifest version could have changed when the Policy was updated because the - // policy details page ensures that a save action applies the udpated policy on top - // of the latest Package Policy. So we just ignore the check against this value by - // forcing it to be the same as the value returned in the full agent policy. manifest_version: agentFullPolicy.inputs[0].artifact_manifest.manifest_version, - schema_version: 'v1', }, policy: { linux: { - events: { file: true, network: true, process: true }, - logging: { file: 'info' }, - advanced: { agent: { connection_delay: 'true' } }, - malware: { mode: 'prevent' }, - behavior_protection: { mode: 'prevent', supported: true }, - memory_protection: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', + advanced: { + agent: { + connection_delay: 'true', }, }, }, - mac: { - events: { file: true, network: true, process: true }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - behavior_protection: { mode: 'prevent', supported: true }, - memory_protection: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - }, - }, - windows: { - events: { - dll_and_driver_load: true, - dns: true, - file: true, - network: true, - process: true, - registry: true, - security: true, - }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - memory_protection: { mode: 'prevent', supported: true }, - behavior_protection: { mode: 'prevent', supported: true }, - ransomware: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - ransomware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - }, - antivirus_registration: { - enabled: false, - }, - }, }, - type: 'endpoint', - use_output: 'default', - }, + }), ]); // Clear the value @@ -643,225 +477,25 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); expect(agentFullPolicyUpdated.inputs).to.eql([ - { + getExpectedAgentPolicyEndpointInput({ id: policyInfo.packagePolicy.id, revision: 3, - data_stream: { namespace: 'default' }, - name: 'Protect East Coast', meta: { package: { - name: 'endpoint', version: policyInfo.packageInfo.version, }, }, artifact_manifest: { - artifacts: { - 'endpoint-exceptionlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-exceptionlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-exceptionlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-trustlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-trustlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-linux-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-linux-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-macos-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-macos-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - 'endpoint-eventfilterlist-windows-v1': { - compression_algorithm: 'zlib', - decoded_sha256: - 'd801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - decoded_size: 14, - encoded_sha256: - 'f8e6afa1d5662f5b37f83337af774b5785b5b7f1daee08b7b00c2d6813874cda', - encoded_size: 22, - encryption_algorithm: 'none', - relative_url: - '/api/fleet/artifacts/endpoint-eventfilterlist-windows-v1/d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658', - }, - }, - // The manifest version could have changed when the Policy was updated because the - // policy details page ensures that a save action applies the udpated policy on top - // of the latest Package Policy. So we just ignore the check against this value by - // forcing it to be the same as the value returned in the full agent policy. manifest_version: agentFullPolicy.inputs[0].artifact_manifest.manifest_version, - schema_version: 'v1', }, - policy: { - linux: { - events: { file: true, network: true, process: true }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - behavior_protection: { mode: 'prevent', supported: true }, - memory_protection: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - }, - }, - mac: { - events: { file: true, network: true, process: true }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - behavior_protection: { mode: 'prevent', supported: true }, - memory_protection: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - }, - }, - windows: { - events: { - dll_and_driver_load: true, - dns: true, - file: true, - network: true, - process: true, - registry: true, - security: true, - }, - logging: { file: 'info' }, - malware: { mode: 'prevent' }, - memory_protection: { mode: 'prevent', supported: true }, - behavior_protection: { mode: 'prevent', supported: true }, - ransomware: { mode: 'prevent', supported: true }, - popup: { - malware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - memory_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - behavior_protection: { - enabled: true, - message: 'Elastic Security {action} {rule}', - }, - ransomware: { - enabled: true, - message: 'Elastic Security {action} {filename}', - }, - }, - antivirus_registration: { - enabled: false, - }, - }, - }, - type: 'endpoint', - use_output: 'default', - }, + }), ]); }); }); describe('when on Ingest Policy Edit Package Policy page', async () => { let policyInfo: PolicyTestResourceInfo; + beforeEach(async () => { // Create a policy and navigate to Ingest app policyInfo = await policyTestResources.createPolicy(); @@ -871,6 +505,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); await testSubjects.existOrFail('endpointIntegrationPolicyForm'); }); + afterEach(async () => { if (policyInfo) { await policyInfo.cleanup(); @@ -888,10 +523,16 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); expect(await winDnsEventingCheckbox.isSelected()).to.be(true); await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); - expect(await winDnsEventingCheckbox.isSelected()).to.be(false); + await pageObjects.policy.waitForCheckboxSelectionChange('policyWindowsEvent_dns', false); }); it('should preserve updates done from the Fleet form', async () => { + // Fleet has its own form inputs, like description. When those are updated, the changes + // are also dispatched to the embedded endpoint Policy form. Update to the Endpoint Policy + // form after that should preserve the changes done on the Fleet form + + // Wait for the endpoint form to load and then update the policy description + await testSubjects.existOrFail('endpointIntegrationPolicyForm'); await pageObjects.ingestManagerCreatePackagePolicy.setPackagePolicyDescription( 'protect everything' ); @@ -902,18 +543,22 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); - expect( - await pageObjects.ingestManagerCreatePackagePolicy.getPackagePolicyDescriptionValue() - ).to.be('protect everything'); + await retryService.try(async () => { + expect( + await pageObjects.ingestManagerCreatePackagePolicy.getPackagePolicyDescriptionValue() + ).to.be('protect everything'); + }); }); it('should include updated endpoint data when saved', async () => { - const winDnsEventingCheckbox = await testSubjects.find('policyWindowsEvent_dns'); await pageObjects.ingestManagerCreatePackagePolicy.scrollToCenterOfWindow( - winDnsEventingCheckbox + await testSubjects.find('policyWindowsEvent_dns') ); await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); - const wasSelected = await winDnsEventingCheckbox.isSelected(); + const updatedCheckboxValue = await testSubjects.isSelected('policyWindowsEvent_dns'); + + await pageObjects.policy.waitForCheckboxSelectionChange('policyWindowsEvent_dns', false); + await (await pageObjects.ingestManagerCreatePackagePolicy.findSaveButton(true)).click(); await pageObjects.ingestManagerCreatePackagePolicy.waitForSaveSuccessNotification(true); @@ -921,7 +566,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { policyInfo.agentPolicy.id, policyInfo.packagePolicy.id ); - expect(await testSubjects.isSelected('policyWindowsEvent_dns')).to.be(wasSelected); + + await pageObjects.policy.waitForCheckboxSelectionChange( + 'policyWindowsEvent_dns', + updatedCheckboxValue + ); }); it('should show trusted apps card and link should go back to policy', async () => { diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/trusted_apps_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/trusted_apps_list.ts index 52fb9b8fc8599..9476d20ccb4b0 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/trusted_apps_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/trusted_apps_list.ts @@ -29,10 +29,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await endpointTestResources.unloadEndpointData(indexedData); }); - it('should show page title', async () => { - expect(await testSubjects.getVisibleText('header-page-title')).to.equal( - 'Trusted applications' - ); + it('should not show page title if there is no trusted app', async () => { + await testSubjects.missingOrFail('header-page-title'); }); it('should be able to add a new trusted app and remove it', async () => { @@ -56,6 +54,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); await pageObjects.common.closeToast(); + // Title is shown after adding an item + expect(await testSubjects.getVisibleText('header-page-title')).to.equal( + 'Trusted applications' + ); + // Remove it await pageObjects.trustedApps.clickCardActionMenu(); await testSubjects.click('deleteTrustedAppAction'); @@ -63,6 +66,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.waitForDeleted('trustedAppDeletionConfirm'); // We only expect one trusted app to have been visible await testSubjects.missingOrFail('trustedAppCard'); + // Header has gone because there is no trusted app + await testSubjects.missingOrFail('header-page-title'); }); }); }; diff --git a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts b/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts index d1a037a47ff08..b5eccd0ef1147 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts @@ -5,11 +5,13 @@ * 2.0. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../ftr_provider_context'; export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrProviderContext) { const pageObjects = getPageObjects(['common', 'header']); const testSubjects = getService('testSubjects'); + const retryService = getService('retry'); return { /** @@ -49,6 +51,34 @@ export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrPr return await testSubjects.find('advancedPolicyButton'); }, + async isAdvancedSettingsExpanded() { + return await testSubjects.exists('advancedPolicyPanel'); + }, + + /** + * shows the advanced settings section and scrolls it into view + */ + async showAdvancedSettingsSection() { + if (!(await this.isAdvancedSettingsExpanded())) { + const expandButton = await this.findAdvancedPolicyButton(); + await expandButton.click(); + } + + await testSubjects.existOrFail('advancedPolicyPanel'); + await testSubjects.scrollIntoView('advancedPolicyPanel'); + }, + + /** + * Hides the advanced settings section + */ + async hideAdvancedSettingsSection() { + if (await this.isAdvancedSettingsExpanded()) { + const expandButton = await this.findAdvancedPolicyButton(); + await expandButton.click(); + } + await testSubjects.missingOrFail('advancedPolicyPanel'); + }, + /** * Finds and returns the linux connection_delay Advanced Policy field */ @@ -69,7 +99,17 @@ export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrPr */ async confirmAndSave() { await this.ensureIsOnDetailsPage(); - await (await this.findSaveButton()).click(); + + const saveButton = await this.findSaveButton(); + + // Sometimes, data retrieval errors may have been encountered by other security solution processes + // (ex. index fields search here: `x-pack/plugins/security_solution/public/common/containers/source/index.tsx:181`) + // which are displayed using one or more Toast messages. This in turn prevents the user from + // actually clicking the Save button. Because those errors are not associated with Policy details, + // we'll first check that all toasts are cleared + await pageObjects.common.clearAllToasts(); + + await saveButton.click(); await testSubjects.existOrFail('policyDetailsConfirmModal'); await pageObjects.common.clickConfirmOnModal(); }, @@ -93,5 +133,19 @@ export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrPr async findPackagePolicyEndpointCustomConfiguration(onEditPage: boolean = false) { return await testSubjects.find(`endpointPackagePolicy_${onEditPage ? 'edit' : 'create'}`); }, + + /** + * Waits for a Checkbox/Radiobutton to have its `isSelected()` value match the provided expected value + * @param selector + * @param expectedSelectedValue + */ + async waitForCheckboxSelectionChange( + selector: string, + expectedSelectedValue: boolean + ): Promise { + await retryService.try(async () => { + expect(await testSubjects.isSelected(selector)).to.be(expectedSelectedValue); + }); + }, }; } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 2dcf36cc42ae2..afdc364ffd970 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -24,8 +24,7 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - // Failing: See https://github.com/elastic/kibana/issues/115488 - describe.skip('test metadata api', () => { + describe('test metadata api', () => { // TODO add this after endpoint package changes are merged and in snapshot // describe('with .metrics-endpoint.metadata_united_default index', () => { // }); @@ -242,7 +241,7 @@ export default function ({ getService }: FtrProviderContext) { (ip: string) => ip === targetEndpointIp ); expect(resultIp).to.eql([targetEndpointIp]); - expect(body.hosts[0].metadata.event.created).to.eql(1626897841950); + expect(body.hosts[0].metadata.event.created).to.eql(1634656952181); expect(body.hosts.length).to.eql(1); expect(body.request_page_size).to.eql(10); expect(body.request_page_index).to.eql(0); @@ -284,7 +283,7 @@ export default function ({ getService }: FtrProviderContext) { const resultElasticAgentId: string = body.hosts[0].metadata.elastic.agent.id; expect(resultHostId).to.eql(targetEndpointId); expect(resultElasticAgentId).to.eql(targetElasticAgentId); - expect(body.hosts[0].metadata.event.created).to.eql(1626897841950); + expect(body.hosts[0].metadata.event.created).to.eql(1634656952181); expect(body.hosts[0].host_status).to.eql('unhealthy'); expect(body.hosts.length).to.eql(1); expect(body.request_page_size).to.eql(10); diff --git a/x-pack/test/timeline/security_and_spaces/tests/basic/events.ts b/x-pack/test/timeline/security_and_spaces/tests/basic/events.ts index eec3dd2bb2b6e..561e5763eb423 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/basic/events.ts +++ b/x-pack/test/timeline/security_and_spaces/tests/basic/events.ts @@ -135,6 +135,8 @@ export default ({ getService }: FtrProviderContext) => { it(`${username} should be able to view alerts from "${featureIds.join(',')}" ${ space != null ? `in space ${space}` : 'when no space specified' }`, async () => { + // This will be flake until it uses the bsearch service, but these tests aren't operational. Once you do make this operational + // use const bsearch = getService('bsearch'); const resp = await supertestWithoutAuth .post(`${getSpaceUrlPrefix(space)}${TEST_URL}`) .auth(username, password) @@ -164,6 +166,8 @@ export default ({ getService }: FtrProviderContext) => { it(`${username} should NOT be able to view alerts from "${featureIds.join(',')}" ${ space != null ? `in space ${space}` : 'when no space specified' }`, async () => { + // This will be flake until it uses the bsearch service, but these tests aren't operational. Once you do make this operational + // use const bsearch = getService('bsearch'); const resp = await supertestWithoutAuth .post(`${getSpaceUrlPrefix(space)}${TEST_URL}`) .auth(username, password) @@ -183,6 +187,8 @@ export default ({ getService }: FtrProviderContext) => { it(`${username} should NOT be able to access "${featureIds.join(',')}" ${ space != null ? `in space ${space}` : 'when no space specified' }`, async () => { + // This will be flake until it uses the bsearch service, but these tests aren't operational. Once you do make this operational + // use const bsearch = getService('bsearch'); await supertestWithoutAuth .post(`${getSpaceUrlPrefix(space)}${TEST_URL}`) .auth(username, password) diff --git a/x-pack/test/timeline/security_and_spaces/tests/trial/events.ts b/x-pack/test/timeline/security_and_spaces/tests/trial/events.ts index 4deea74d97d25..080039f4b2007 100644 --- a/x-pack/test/timeline/security_and_spaces/tests/trial/events.ts +++ b/x-pack/test/timeline/security_and_spaces/tests/trial/events.ts @@ -117,6 +117,8 @@ export default ({ getService }: FtrProviderContext) => { it(`${username} should be able to view alerts from "${featureIds.join(',')}" ${ space != null ? `in space ${space}` : 'when no space specified' }`, async () => { + // This will be flake until it uses the bsearch service, but these tests aren't operational. Once you do make this operational + // use const bsearch = getService('bsearch'); const resp = await supertestWithoutAuth .post(`${getSpaceUrlPrefix(space)}${TEST_URL}`) .auth(username, password) @@ -145,6 +147,8 @@ export default ({ getService }: FtrProviderContext) => { it(`${username} should NOT be able to access "${featureIds.join(',')}" ${ space != null ? `in space ${space}` : 'when no space specified' }`, async () => { + // This will be flake until it uses the bsearch service, but these tests aren't operational. Once you do make this operational + // use const bsearch = getService('bsearch'); await supertestWithoutAuth .post(`${getSpaceUrlPrefix(space)}${TEST_URL}`) .auth(username, password) diff --git a/yarn.lock b/yarn.lock index ba8c04e1fc122..c8a65473a7be2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2302,10 +2302,6 @@ is-absolute "^1.0.0" is-negated-glob "^1.0.0" -"@elastic/apm-generator@link:bazel-bin/packages/elastic-apm-generator": - version "0.0.0" - uid "" - "@elastic/apm-rum-core@^5.12.1": version "5.12.1" resolved "https://registry.yarnpkg.com/@elastic/apm-rum-core/-/apm-rum-core-5.12.1.tgz#ad78787876c68b9ce718d1c42b8e7b12b12eaa69" @@ -2330,6 +2326,10 @@ dependencies: "@elastic/apm-rum-core" "^5.12.1" +"@elastic/apm-synthtrace@link:bazel-bin/packages/elastic-apm-synthtrace": + version "0.0.0" + uid "" + "@elastic/app-search-javascript@^7.13.1": version "7.13.1" resolved "https://registry.yarnpkg.com/@elastic/app-search-javascript/-/app-search-javascript-7.13.1.tgz#07d84daa27e856ad14f3f840683288eab06577f4" @@ -2337,10 +2337,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@37.0.0": - version "37.0.0" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-37.0.0.tgz#a94526461c404b449953cca4fe34f8bf3620413e" - integrity sha512-Pfm58/voERWVPJlxy13DphwgRoBGYhnSyz65kdsPg6lYGxN5ngWvuTuJ3477fyApYV01Pz4Ckt9yj1BSQue80Q== +"@elastic/charts@38.0.1": + version "38.0.1" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-38.0.1.tgz#9c1db7e0f1de869e0b2b505e192bbb9d62d60dc8" + integrity sha512-i9mIA3Ji9jSjuFDtuh9gV1xpCl3sbBEDgJiOgLVt04pr/qZH2W+tr3AV5yHvjsR7Te0Pmh/Cm5wLBvFKaI1nIA== dependencies: "@popperjs/core" "^2.4.0" chroma-js "^2.1.0" @@ -2412,10 +2412,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@39.1.1": - version "39.1.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-39.1.1.tgz#52e59f1dd6448b2e80047259ca60c6c87e9873f0" - integrity sha512-zYCNitpp6Ds7U6eaa9QkJqc20ZMo2wjpZokNtd1WalFV22vdfiVizFg7DMtDjJrCDLmoXcLOOCMasKlmmJ1cRg== +"@elastic/eui@39.1.2": + version "39.1.2" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-39.1.2.tgz#8eb1684a7a406bc13b8514a366d450e964dbf56f" + integrity sha512-R3MqXcLOYMe/nlm+KG0TGrAjTCmpuwNkh7iKGUxVXZIRkzkgp2wyGmoX1qZnKTogN3OSEf7kKEq1JeivPYWBOA== dependencies: "@types/chroma-js" "^2.0.0" "@types/lodash" "^4.14.160" @@ -4114,6 +4114,21 @@ resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz#2a0b32fcb416fb3f2250fd24cb2a81421a4f5950" + integrity sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA== + dependencies: + detect-libc "^1.0.3" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.1" + nopt "^5.0.0" + npmlog "^4.1.2" + rimraf "^3.0.2" + semver "^7.3.4" + tar "^6.1.0" + "@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" @@ -10131,6 +10146,15 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001097, caniuse-lite@^1.0.30001109, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz#96d89813c076ea061209a4e040d8dcf0c66a1d01" integrity sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA== +canvas@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.8.0.tgz#f99ca7f25e6e26686661ffa4fec1239bbef74461" + integrity sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + nan "^2.14.0" + simple-get "^3.0.3" + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -10292,36 +10316,24 @@ check-more-types@2.24.0, check-more-types@^2.24.0: resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= -cheerio-select@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.4.0.tgz#3a16f21e37a2ef0f211d6d1aa4eff054bb22cdc9" - integrity sha512-sobR3Yqz27L553Qa7cK6rtJlMDbiKPdNywtR95Sj/YgfpLfy0u6CGJuaBKe5YE/vTc23SCRKxWSdlon/w6I/Ew== +cheerio-select@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" + integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== dependencies: - css-select "^4.1.2" - css-what "^5.0.0" + css-select "^4.1.3" + css-what "^5.0.1" domelementtype "^2.2.0" domhandler "^4.2.0" - domutils "^2.6.0" + domutils "^2.7.0" -cheerio@^1.0.0-rc.3: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - -cheerio@^1.0.0-rc.9: - version "1.0.0-rc.9" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.9.tgz#a3ae6b7ce7af80675302ff836f628e7cb786a67f" - integrity sha512-QF6XVdrLONO6DXRF5iaolY+odmhj2CLj+xzNod7INPWMi/x9X4SOylH0S/vaPpX+AUU6t04s34SQNh7DbkuCng== - dependencies: - cheerio-select "^1.4.0" - dom-serializer "^1.3.1" +cheerio@^1.0.0-rc.10, cheerio@^1.0.0-rc.3: + version "1.0.0-rc.10" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== + dependencies: + cheerio-select "^1.5.0" + dom-serializer "^1.3.2" domhandler "^4.2.0" htmlparser2 "^6.1.0" parse5 "^6.0.1" @@ -11523,7 +11535,7 @@ css-select-base-adapter@^0.1.1: resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== -css-select@^1.1.0, css-select@~1.2.0: +css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= @@ -11543,10 +11555,10 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" -css-select@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.2.tgz#8b52b6714ed3a80d8221ec971c543f3b12653286" - integrity sha512-nu5ye2Hg/4ISq4XqdLY2bEatAcLIdt3OYGFc9Tm9n7VSlFBcfRv0gBNksHRgSdUDQGtN3XrZ94ztW+NfzkFSUw== +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== dependencies: boolbase "^1.0.0" css-what "^5.0.0" @@ -11589,10 +11601,10 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== -css-what@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" - integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== +css-what@^5.0.0, css-what@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== css.escape@^1.5.1: version "1.5.1" @@ -11836,6 +11848,11 @@ cypress-cucumber-preprocessor@^2.5.2: minimist "^1.2.0" through "^2.3.8" +cypress-file-upload@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1" + integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g== + cypress-multi-reporters@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz#fff2758c082b49e8b91fed39f9650c70bc06de0d" @@ -12308,7 +12325,7 @@ debug@3.X, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, dependencies: ms "^2.1.1" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: +debug@4, debug@4.3.1, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -12758,10 +12775,10 @@ devtools-protocol@0.0.818844: resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== -devtools-protocol@0.0.854822: - version "0.0.854822" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.854822.tgz#eac3a5260a6b3b4e729a09fdc0c77b0d322e777b" - integrity sha512-xd4D8kHQtB0KtWW0c9xBZD5LVtm9chkMOfs/3Yn01RhT/sFIsVtzTtypfKoFfWBaL+7xCYLxjOLkhwPXaX/Kcg== +devtools-protocol@0.0.901419: + version "0.0.901419" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.901419.tgz#79b5459c48fe7e1c5563c02bd72f8fec3e0cebcd" + integrity sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ== dezalgo@^1.0.0: version "1.0.3" @@ -12918,15 +12935,15 @@ dom-helpers@^5.0.0, dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^2.6.7" -dom-serializer@0, dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== +dom-serializer@0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.1.tgz#13650c850daffea35d8b626a4cfc4d3a17643fdb" + integrity sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q== dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" + domelementtype "^2.0.1" + entities "^2.0.0" -dom-serializer@^1.0.1, dom-serializer@^1.3.1: +dom-serializer@^1.0.1, dom-serializer@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== @@ -12945,7 +12962,7 @@ domain-browser@^1.1.1, domain-browser@^1.2.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: +domelementtype@1, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -13013,10 +13030,10 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" -domutils@^2.5.2, domutils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.6.0.tgz#2e15c04185d43fb16ae7057cb76433c6edb938b7" - integrity sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA== +domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" @@ -13415,7 +13432,7 @@ enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: +entities@^1.1.1, entities@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -16527,7 +16544,7 @@ htmlescape@^1.1.0: resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= -htmlparser2@^3.10.0, htmlparser2@^3.9.1: +htmlparser2@^3.10.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -19343,18 +19360,17 @@ listr@^0.14.1: p-map "^2.0.0" rxjs "^6.3.3" -lmdb-store@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/lmdb-store/-/lmdb-store-1.6.8.tgz#f57c1fa4a8e8e7a73d58523d2bfbcee96782311f" - integrity sha512-Ltok13VVAfgO5Fdj/jVzXjPJZjefl1iENEHerZyAfAlzFUhvOrA73UdKItqmEPC338U29mm56ZBQr5NJQiKXow== +lmdb-store@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/lmdb-store/-/lmdb-store-1.6.11.tgz#801da597af8c7a01c81f87d5cc7a7497e381236d" + integrity sha512-hIvoGmHGsFhb2VRCmfhodA/837ULtJBwRHSHKIzhMB7WtPH6BRLPsvXp1MwD3avqGzuZfMyZDUp3tccLvr721Q== dependencies: - mkdirp "^1.0.4" nan "^2.14.2" node-gyp-build "^4.2.3" ordered-binary "^1.0.0" weak-lru-cache "^1.0.0" optionalDependencies: - msgpackr "^1.3.7" + msgpackr "^1.4.7" load-bmfont@^1.3.1, load-bmfont@^1.4.0: version "1.4.0" @@ -19676,7 +19692,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.15: +lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -20823,7 +20839,7 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msgpackr-extract@^1.0.13: +msgpackr-extract@^1.0.14: version "1.0.14" resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-1.0.14.tgz#87d3fe825d226e7f3d9fe136375091137f958561" integrity sha512-t8neMf53jNZRF+f0H9VvEUVvtjGZ21odSBRmFfjZiyxr9lKYY0mpY3kSWZAIc7YWXtCZGOvDQVx2oqcgGiRBrw== @@ -20831,12 +20847,12 @@ msgpackr-extract@^1.0.13: nan "^2.14.2" node-gyp-build "^4.2.3" -msgpackr@^1.3.7: - version "1.4.2" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.4.2.tgz#52ddf0130ccdb1067957fe61c8be828e82bb29ce" - integrity sha512-6gvaU+3xIflium8eJcruT66kLQr14lgTEmXtDm7KKzBSWHljD7pqu3VBQv1PDipFD5UGXLTIxGg5hGbO/jTvxQ== +msgpackr@^1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.4.7.tgz#d802ade841e7d2e873000b491cdda6574a3d5748" + integrity sha512-bhC8Ed1au3L3oHaR/fe4lk4w7PLGFcWQ5XY/Tk9N6tzDRz8YndjCG68TD8zcvYZoxNtw767eF/7VpaTpU9kf9w== optionalDependencies: - msgpackr-extract "^1.0.13" + msgpackr-extract "^1.0.14" multicast-dns-service-types@^1.1.0: version "1.1.0" @@ -21155,7 +21171,7 @@ node-emoji@^1.10.0: dependencies: lodash.toarray "^4.4.0" -node-fetch@^1.0.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: +node-fetch@2.6.1, node-fetch@^1.0.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -21458,9 +21474,9 @@ nth-check@^1.0.2, nth-check@~1.0.1: boolbase "~1.0.0" nth-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" - integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: boolbase "^1.0.0" @@ -22304,13 +22320,6 @@ parse5@5.1.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - dependencies: - "@types/node" "*" - parse5@^6.0.0, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -22473,6 +22482,19 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pdf-to-img@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pdf-to-img/-/pdf-to-img-1.1.1.tgz#1918738477c3cc95a6786877bb1e36de81909400" + integrity sha512-e+4BpKSDhU+BZt34yo2P5OAqO0CRRy8xSNGDP7HhpT2FMEo5H7mzNcXdymYKRcj7xIr0eK1gYFhyjpWwHGp46Q== + dependencies: + canvas "2.8.0" + pdfjs-dist "2.9.359" + +pdfjs-dist@2.9.359: + version "2.9.359" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.9.359.tgz#e67bafebf20e50fc41f1a5c189155ad008ac4f81" + integrity sha512-P2nYtkacdlZaNNwrBLw1ZyMm0oE2yY/5S/GDCAmMJ7U4+ciL/D0mrlEC/o4HZZc/LNE3w8lEVzBEyVgEQlPVKQ== + pdfkit@>=0.8.1, pdfkit@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/pdfkit/-/pdfkit-0.11.0.tgz#9cdb2fc42bd2913587fe3ddf48cc5bbb3c36f7de" @@ -22608,6 +22630,13 @@ pixelmatch@^5.1.0: dependencies: pngjs "^3.4.0" +pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -22622,13 +22651,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -23353,6 +23375,11 @@ process@~0.5.1: resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= +progress@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" + integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== + progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" @@ -23497,7 +23524,7 @@ proxy-from-env@1.0.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@1.1.0, proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -23592,6 +23619,24 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +puppeteer@^10.2.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-10.4.0.tgz#a6465ff97fda0576c4ac29601406f67e6fea3dc7" + integrity sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w== + dependencies: + debug "4.3.1" + devtools-protocol "0.0.901419" + extract-zip "2.0.1" + https-proxy-agent "5.0.0" + node-fetch "2.6.1" + pkg-dir "4.2.0" + progress "2.0.1" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.0.0" + unbzip2-stream "1.3.3" + ws "7.4.6" + puppeteer@^5.3.1: version "5.5.0" resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.5.0.tgz#331a7edd212ca06b4a556156435f58cbae08af00" @@ -23610,24 +23655,6 @@ puppeteer@^5.3.1: unbzip2-stream "^1.3.3" ws "^7.2.3" -puppeteer@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-8.0.0.tgz#a236669118aa795331c2d0ca19877159e7664705" - integrity sha512-D0RzSWlepeWkxPPdK3xhTcefj8rjah1791GE82Pdjsri49sy11ci/JQsAO8K2NRukqvwEtcI+ImP5F4ZiMvtIQ== - dependencies: - debug "^4.1.0" - devtools-protocol "0.0.854822" - extract-zip "^2.0.0" - https-proxy-agent "^5.0.0" - node-fetch "^2.6.1" - pkg-dir "^4.2.0" - progress "^2.0.1" - proxy-from-env "^1.1.0" - rimraf "^3.0.2" - tar-fs "^2.0.0" - unbzip2-stream "^1.3.3" - ws "^7.2.3" - q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -24232,10 +24259,10 @@ react-popper@^2.2.4: react-fast-compare "^3.0.1" warning "^4.0.2" -react-query@^3.27.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.27.0.tgz#77c76377ae41d180c4718da07ef72df82e07306b" - integrity sha512-2MR5LBXnR6OMXQVLcv/57x1zkDNj6gK5J5mtjGi6pu0aQ6Y4jGQysVvkrAErMKMZJVZELFcYGA8LsGIHzlo/zg== +react-query@^3.28.0: + version "3.28.0" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.28.0.tgz#1bfe12944860b2b773680054de37f19438f59d1d" + integrity sha512-OeX+nRqs7Zi0MvvtaKxKWE4N966UGtqSVuedOsz8cJh9eW195fgtYZ9nW3hZjIPPmeDY1PkArLUiV4wZvNRDPw== dependencies: "@babel/runtime" "^7.5.5" broadcast-channel "^3.4.1" @@ -27680,6 +27707,16 @@ tape@^5.0.1: string.prototype.trim "^1.2.1" through "^2.3.8" +tar-fs@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" + integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== + dependencies: + chownr "^1.1.1" + mkdirp "^0.5.1" + pump "^3.0.0" + tar-stream "^2.0.0" + tar-fs@^2.0.0, tar-fs@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -27734,7 +27771,7 @@ tar@6.1.9: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: +tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== @@ -28652,6 +28689,14 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" + integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unbzip2-stream@^1.3.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" @@ -30495,6 +30540,11 @@ write-pkg@^4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" +ws@7.4.6, ws@^7.2.3: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@>=7.4.6, ws@^7.4.6: version "7.5.5" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" @@ -30507,11 +30557,6 @@ ws@^6.1.2, ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.2.3: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - x-is-function@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e"